Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Początkujący z ASEMBLEREM.

marod1 07 Feb 2011 20:58 1986 11
  • #1
    marod1
    Level 10  
    Witam wszystkich forumowiczów, jestem nowy i chciałbym się nauczyć asemblera ale coś mi nie idzie, napisałem kawałek kodu, który zamieszczam, jest to kod który miał zadanie monitorować RB4 w PIC 16f84a i po podaniu napięcia na RB4 podać stan niski na RB0,1,2,3 na około 2s. a po spadku napięcia zamrugać 2 razy w MPLABie wszystko działa a po wgraniu do PICa zapętla się i mruga cały czas. Proszę o jakieś sugestie Pozdrawiam.

    No cóż, widzę że nowych się tu ignoruje.

    Proszę, zgodnie z regulaminem pkt 11.1, o usunięcie słów PROBLEM lub/i POMOC z tytułu. Prośba dotyczy także wszelkich wariacji typu: kłopot, pomocy, problemy itd. - arnoldziq
  • Helpful post
    #2
    adamwesola
    Level 24  
    "monitorować RB4 w PIC 16f84a i po podaniu napięcia na RB4 podać stan niski na RB0,1,2,3 na około 2s. a po spadku napięcia zamrugać 2 razy"

    Definicje rejestrów specjalnych (SFR) dołączasz tak

    processor 16f84A
    #include <p16f84A.inc>

    i nie trzeba ich (a nawet nie można) ponownie deklarować w programie

    Ta konfiguracja procesora : __config h'3ff5'
    oscylator xt i włączony waczdog który nie zerowany robi restarty procesora

    Dla Twoich potrzeb proponuje tak :

    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _LP_OSC

    i zastosowanie oscylatora zegarkowego 32768Hz, łatwiej będzie odmierzać długie czasy.

    Wolna przestrzeń w tym procku zaczyna się od adresu 0C,
    widzisz ze COUNT1 oraz COUNT2 korzystają z obszaru SFR - może tak być póki nie używasz pamięci eeprom

    Piszesz "podać stan niski na RB0,1,2,3" , a gdzie podajesz ? wszędzie na porta !

    I na marginesie jeszcze, zamiast pisać tasiemce "movlw b'00000000', movlw b'00011111'
    wystarczy - movlw 0, movlw 1F - prościej i czytelniej
    Zamiast np 03h, 0x08 , wystarczy 3,8
  • #3
    dondu
    Moderator on vacation ...
    adamwesola wrote:
    I na marginesie jeszcze, zamiast pisać tasiemce "movlw b'00000000', movlw b'00011111'
    ...
    Zamiast np 03h, 0x08 , wystarczy 3,8


    Nie stosuj tego co proponuje Adam.
    Do konfigurowania rejestrów itp. wykorzystuj:
    - zapisy dwójkowe lub
    - szesnastkowe lub
    - definiuj własne opisy słowne lub
    - korzystaj z gotowych dostępnych w sieci.
    Stosowanie zapisu dziesiętnego oznacza więcej czasu na rozszyfrowywanie: Co ja właściwie ustawiłem w tym rejestrze?

    Dodatkowo gdy przyjdzie Ci prosić kogoś o analizę twoich programów z pewnością niewielu będzie chętnych, by tracić czas na rozszyfrowywanie liczby dziesiętnej.

    Zapis dziesiętny wykorzystuj tylko gdy faktycznie dotyczy liczby np. ilości błyśnięć diody itp.
  • #4
    marod1
    Level 10  
    Są jeszcze dobrzy ludzie, dzięki za zainteresowanie.
  • #5
    adamwesola
    Level 24  
    Kolego Dondu, ja nie proponuje stosować liczb dziesiętnych, przeciwnie, jak zapewne nie zauważyłeś mój zapis : movlw 1F , oznacza stosowanie liczby hex, a liczby np 3, 8 wyglądają tak samo w dec jak i hex.
    Liczby bez żadnej litery są rozumiane i traktowane jako hexadexymalne, i zapewniam Cię ze jestem ich zatwardziałym zwolennikiem i tylko takie polecam innym.
    Sa czytelniejsze.
  • #6
    dondu
    Moderator on vacation ...
    adamwesola wrote:
    Zamiast np 03h, 0x08 , wystarczy 3,8

    To jest zapis liczby dziesiętnej a nie szestnastkowej.
    Jeżeli chcesz pisać po swojemu to Twoja sprawa, ale nie przekazuj złych nawyków nowicjuszom.

    Oto właściwa praktyka:

    Początkujący z ASEMBLEREM.

    Utrzymanie jednolitego standardu pozwala na eliminowanie tzw. czeskich błędów, które często kosztują programistę wiele godzin zbędnego szukania przyczyn niedziałania programu.
  • #7
    marod1
    Level 10  
    Panowie, dziękuję serdecznie za trafne sugestie, program działa jak trzeba należało tylko wyłączyć WDT i OK!!!, i będę się starał stosować do Waszych sugestii.
    Tak na marginesie, ten program jest mój pierwszy i ma służyć jako sygnalizacja nie zamkniętych drzwi w aucie z oryginalnym centralnym zamkiem bez alarmu.
  • #9
    adamwesola
    Level 24  
    Jakie czeskie błędy popełnisz widząc ?
    0
    b'00000000'
    0x00
    0x00h
    albo
    3
    0x03
    0x03h
    Z czym je pomylisz i jakie to będzie miało konsekwencje ?
    Cyfry od 0...9 z literka h czy bez niej, maja tę samą wartość.
    Czy to jasne ?

    Temat leżał 4 dni bez żadnego odzewu, a Twoje wypowiedzi nie odnoszą się wcale do jego meritum.
  • #10
    marod1
    Level 10  
    Program działa ale jest mały mankament, którego nie rozumiem,po podaniu zasilania powinien dojść do sekwencji:
    petla1	btfss	portb,4
    		goto	petla1
    		call	loop
    		btfss	portb,4
    		goto	petla1
    		call	zal

    a przechodzi cały i dopiero się zatrzymuje, na symulatorze jest OK, po wgraniu do procka tak się dzieje. Pod spodem daje cały program.
  • #11
    adamwesola
    Level 24  
    Tak, na btfss PORTB,4 powinien się zatrzymać : skąd wiesz że przechodzi dalej i jak masz dołączony przycisk ?
    Ponadto w procedurze zal, przed return'em wstaw ze 2x call loop, będzie widać że 2 razy mrygnął po puszczeniu przycisku.
    O tym ze loop nie trwa 2 sekundy , już wiesz.
    W procedurze loop nie jest potrzebna ta sekwencja :
    loop movlw 0xff
    movwf eedata
    bez niej, tylko pierwszy raz możesz nie mieć tych 198 ms opóźnienia, każde następne będzie już prawidłowe.
    No i __config h'3ff9' - czytelniejsza jest postać __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC, tę właśnie polecam.
  • #12
    marod1
    Level 10  
    Podziękowania dla adamwesola, twoje rady są jak najbardziej trafne.
    Dzięki tobie uwierzyłem że mogę to zrobić, a tak na temat: układ mam złożony
    na płytce uniwersalnej miał on zadanie sprawdzać stan zamka centralnego i
    sygnalizować jego otwarcie (dwa mrugnięcia) lub zamknięcie (jedno mrugnięcie)
    w momencie wyłączenia stacyjki w aucie powinien zadziałać przekaźnik, który
    załącza zasilanie układu i w tym momencie PIC powinien sprawdzić czy na portb,4
    jest "1" czy "0", jeśli "0" to powinien się zatrzymać i czekać na "1", a on po załączeniu zasilania na "1", miga raz lub dwa razy na "0" i dopiero się zatrzymuje. Chciałbym się dowiedzieć dlaczego tak jest bo nie bardzo to rozumiem? To tylko dla informacji bo rozwiązałem to inaczej, po prostu dopisałem:


    petla1	btfss	portb,4
    		goto	petla1
    		btfsc	portb,3
    		goto	petla1
    		call	loop
    		btfss	portb,4
    		goto	petla1
    		call	zal


    Teraz pic sprawdza zanim załączy sygnał rb,3 (wyłączoną stacyjkę) i dopiero idzie
    dalej. Sprawa rozwiązana, program działa dokładnie tak jak chciałem.

    Co do procedury loop wiem że to nie dwie sekundy, ale to nie ma większego
    znaczenia po prostu jeszcze jedno loop i jest więcej.

    loop movlw 0xff
    movwf eedata ( o tym też wiem miałem to skasować)

    "No i __config h'3ff9' - czytelniejsza jest postać __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC, tę właśnie polecam"

    Piszę program w "MPLAB IDE 8.46 niestety wywala mi błędy jak użyje tego drugiego sposobu, nie wiem, może coś źle ustawiłem, jak już pisałem jestem początkujący. Lepiej mi idzie programowanie maszyn. Pozdrowienia.