logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

1 sekunda na 8051. Kod asemblerowy do inkrementacji.

Czyzak 15 Paź 2006 15:29 2467 9
REKLAMA
  • #1 3119158
    Czyzak
    Poziom 13  
    Posty: 123
    Pomógł: 1
    Ocena: 1
    witam, prosze o przykład kodu assemblerowego który pozwoli mi inkrementować jakiś rejestr co sekundę, bo pisałem wcześniej ale nikt nie potrafił odpowiedzieć :(

    pozdrawiam
  • REKLAMA
  • #2 3120165
    kordan11
    Poziom 18  
    Posty: 241
    Pomógł: 24
    Ocena: 10
    do wejścia INT0 lub INT1 podłączasz generator 1Hz (np: na kostce NE555) i w pamięci pod adresem 0003h umieszczasz kod,
    ewentualnie możesz zrobić pętlę opóźniającą, ale wtedy musisz obliczyć czas wykonywania jednego cyklu na podstawie posiadanego kwarcu i ilość cykli wykonania jednej pętli i wyliczyć ilość iteracji pętli.

    mniej więcej wygląda to tak
    
    NOWY: MOV 20h,#255d ;2 cykle
    CZEK: DJNZ 20h,CZEK ;2 cykle *256iteracji
    INC A ;1 cykl
    LCALL NOWY ;2 cykle
    

    wykonanie jednego opóźnienia z inklementacją to 517 cykli, czyli za mało, trzeba dołozyć jeszcze jedną pętlę
    
    NOWY: MOV 20h,#255d ;2 cykle
    CZEK: MOV 21h,#255d ;2 cykle *256iteracji
    CZEK2: DJNZ MOV 21h,CZEK2 ;2 cykle *256*256iteracji
    DJNZ 20h,CZEK ;2 cykle *256iteracji
    INC A ;1 cykl
    LCALL NOWY ;2 cykle
    

    co daje 66565 cykli zegarowych jeżeli to by było za mało musisz postępować w analogiczny sposób aż do uzyskania 1s
  • REKLAMA
  • #3 3120407
    Czyzak
    Poziom 13  
    Posty: 123
    Pomógł: 1
    Ocena: 1
    nam pani na zajęciach podała tak:
    
    mov tmod, #00000001b
    mov th0, high(48578)
    mov tl0, low(48578)
    mov R0, #16
    setb tr0
    sek: jnb tf0, $
    clr tf0
    djnz r0, sek
    ; reszta instrukcji po opóźnieniu 1 sek
    

    tyle że program staje przy fragmencie sprawdzania czy nastapiło przeniesienie czyli przy JNB ;/
  • REKLAMA
  • #4 3120463
    kordan11
    Poziom 18  
    Posty: 241
    Pomógł: 24
    Ocena: 10
    na symulatorze program działa poprawnie, tylko tylko na początku ustaw org 25h bo może masz zapisany program w miejscu przerwań timera
    PS: na symulatorze dość długo się pętle wykonują
  • #5 3121135
    Czyzak
    Poziom 13  
    Posty: 123
    Pomógł: 1
    Ocena: 1
    korzystam z symulatora m535 i nie działa, ciągle stoi przy poleceniu JNB :(
  • #7 3123004
    Czyzak
    Poziom 13  
    Posty: 123
    Pomógł: 1
    Ocena: 1
    tak dałem i ściągłem sobie 8051sim bo 52 nie znalazłem i też przy tym rozkazie stoi
  • REKLAMA
  • Pomocny post
    #8 3123064
    kordan11
    Poziom 18  
    Posty: 241
    Pomógł: 24
    Ocena: 10
    
    START:
    org 25h
    mov tmod, #00000001b
    mov th0, high(48578)
    mov tl0, low(48578)
    mov R0, #16
    setb tr0
    sek: jnb tf0, $
    clr tf0
    djnz r0, sek 
    lcall START
    END
    

    sprawdź ten kod, u mnie to działa na 100%

    8052 sim
  • #9 3123510
    Czyzak
    Poziom 13  
    Posty: 123
    Pomógł: 1
    Ocena: 1
    heh jaki bezsens, na tym Twoim programie to działa, to czemu na innych symulatorach nie ?

    a teraz czemu rejestr R0 dekrementuje się co sekundę ? myślałem że to ma działac tak że to w ciągu jednej sekundy właśnię się zdekrementuje 16 razy i to jest jedna sekunda
  • Pomocny post
    #10 3123637
    kordan11
    Poziom 18  
    Posty: 241
    Pomógł: 24
    Ocena: 10
    czas co jaki zostanie zdeklementowany rejestr R0 banku 1 jest określony przez szybkość wykorzystanego kwarcu i ilości cykli wykonywanych przez timer, możesz na przykład uruchomić timer mają w nim zapisaną już jakąś wartość, symulatory nie oddają rzeczywistego czasu pracy mikrokontrolera, musisz dopasować wartość rozpoczęcia pracy timera eksperymentalnie

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji kodu asemblerowego dla mikrokontrolera 8051, który umożliwi inkrementację rejestru co sekundę. Proponowano dwie metody: wykorzystanie zewnętrznego generatora 1 Hz (np. NE555) podłączonego do przerwań INT0 lub INT1 oraz tworzenie pętli opóźniających, których czas działania jest obliczany na podstawie częstotliwości kwarcu i liczby cykli procesora. Przykładowy kod z pętlami zagnieżdżonymi pozwala osiągnąć opóźnienie około 1 sekundy. Alternatywnie, zaproponowano użycie timera 0 w trybie 1 (TMOD = 01b) z ustawionymi rejestrami TH0 i TL0 na wartość 48578, co po uruchomieniu timera i odczekaniu na ustawienie flagi TF0 pozwala na realizację opóźnienia 1 sekundy. Problemy pojawiały się przy symulacji kodu na różnych symulatorach (m535, 8051sim, 8052sim), gdzie program zatrzymywał się na instrukcji JNB TF0, co wynikało z różnic w obsłudze przerwań i adresacji w symulatorach. Zalecano ustawienie org 25h, aby uniknąć kolizji z wektorami przerwań timera. Wskazano również, że rzeczywisty czas opóźnienia zależy od częstotliwości kwarcu i wymaga eksperymentalnego dopasowania wartości startowej timera, gdyż symulatory nie odzwierciedlają dokładnie czasu rzeczywistego mikrokontrolera.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA