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

atmega8, asembler - błędy w obsłudze przerwań i wskaźników programu

as124 04 Sie 2007 17:40 1572 8
  • #1 4145835
    as124
    Poziom 14  
    Posty: 145
    Ocena: 15
    Witam.
    Napisałem następujące podprogramy:

    .EQU POCZATEK_PROGRAMU_H = 0x00
    .EQU POCZATEK_PROGRAMU_L = 0x90
    .EQU PROGRAM_WSK_H = $60
    .EQU PROGRAM_WSK_L = $61


    PROGRAMOWANIE_:
    CLI ;blokada przerwania
    LDI R20, KOM_BRAK_ROZKAZU // kasowanie rozkazu
    LDS XH, PROGRAM_WSK_H ;pobranie aktualnego adresu wskaznika programu
    LDS XL, PROGRAM_WSK_L
    KOM_PROG_:
    WDR ;zerowanie licznika WATCHDOG
    SBIS UCSRA, RXC ;oczekuje na nadejscie bajtu programu
    RJMP KOM_PROG_
    IN R21, UDR ;odbiera bajt do R21
    ST X+, R21 ;i zapisuje pod adresem X+
    STS PROGRAM_WSK_H, XH ;zapisanie aktualnego adresu wskaznika programu
    STS PROGRAM_WSK_L, XL
    SEI ;zezwolenie globalne na przerwania
    RJMP MAIN_



    ODESLIJ_:
    LDI R20, KOM_BRAK_ROZKAZU// kasowanie rozkazu
    LDI YH, POCZATEK_PROGRAMU_H ;pobranie adresu poczatku programu
    LDI YL, POCZATEK_PROGRAMU_L
    LDS XH, PROGRAM_WSK_H ;pobranie aktualnego adresu konca programu
    LDS XL, PROGRAM_WSK_L
    KOM_ODESLIJ2_:
    LD R21, Y+ ;pobiera bajt programu do R21
    KOM_ODESLIJ3_:
    WDR ;zerowanie licznika WATCHDOG
    SBIS UCSRA, UDRE ;oczekuje na gotowosc USART
    RJMP KOM_ODESLIJ3_
    OUT UDR, R21 ;odsyla pobrany bajt do PC
    CP XH, YH
    BRNE KOM_ODESLIJ2_;jesli nie wyslalo jeszcze calego programu to wraca do Odeslij_program
    CP XL,YL
    BRNE KOM_ODESLIJ2_;jesli nie wyslalo jeszcze calego programu to wraca do Odeslij_program
    RJMP MAIN_


    Wywołanie pierwszego (w zamyśle) powoduje, że mikrokontroler czeka na kolejny bajt przesłany do usartu i po otrzymaniu go zapisuje w następnej wolnej komórce poczynając od 0x90.
    Drugi podprogram powinien odsyłać zapisany w pamięci program do komputera przez usart, niestety tak się nie dzieje:(. Mogę liczyć na pomoc i wskazanie mi błędu? sam nie mogę go znaleść od długiego już czasu:(.
    Po przesłaniu paru bajtów przy wykorzystaniu procedurki PROGRAMOWANIE_: próba odebrania procedurą ODESLIJ_: daje w efekcie różne znaczki :( ale nie jest to wgrywany program. W znaczkach tych wgranego programu wogóle nie ma:(.
    Ilość owych "znaczków" również jest dla mnie zagadką ponieważ nie jest ich tyle ile zapisanych wczesniej bajtów i nie jest to ilość stała
    :idea: zwykle jest ich pare ok. 10 :|
    W dodatku w symulatorze (używam AVRstudio) wszystko działa porprawnie a po wgraniu do kości już nie:(
  • #2 4146116
    r06ert
    Poziom 25  
    Posty: 960
    Pomógł: 31
    Ocena: 452
    Witam! Są wakacje i ogólnie sobota wieczór, dlatego nie specjalnie chce mi się myśleć na asemblerem

    Czy przed pierwszym wywołaniem podprogramu PROGRAMOWANIE_ wpisujesz do SRAMu pod adresem 0x60 i 0x61 wartość 0x90? Sam fragment kodu odpowiedzialny za testowanie UARTu i odbiór słowa jest ok.
    Podprogram ODESLIJ_ wydaje mi sie ok.

    Niestety programy w asemblerze mają to do siebie, że są nieczytelne :( Poza tym każdy ma "swój ład" w e własnym programie. Możliwe, że coś przeoczyłem.

    Zakładam, że jest to komunikacja z PCtem.
    Upewnij się, że po stronie PCta jak i mikrokontrolera parametry transmisji są zgodne. Skoro coś tam wysyła to prawdopodobnie hardware (kabelek + MAX232 ;) jest ok). Problemem może też być program który steruje RSem od strony PCta. Do takich zabaw używaj programu terminal (można ściągnąć gdzieś w sieci). Ja juz kilka razy naciąłem się na różnego tupu kontrolkach jak np ComPort do Delphi/Buildera.
    pozdrawiam
  • #3 4146909
    as124
    Poziom 14  
    Posty: 145
    Ocena: 15
    komunikacja PC z kością napisana jest przeze mnie wszystko działa ok. Tzn. gdy wysyłam bajt i w odpowiedzi oczekuje tego samego wszystko jest ok. Poprostu chyba coś nie tak jest z tymi procedurami :( . To część większego programu reszta komunikacji działa bez zarzutu poprostu coś nie tak jest z programowaniem kości (albo z odsyłaniem programu co robie w celu sprawdzenia czy nie ma błędów transmisji) tak czy owak niby wszystko jest ok a nie wiem czemu nie jest ;( . W każdym razie komunikacja z PC jest ok problem z programem w kości.

    W procedurze inicjalizacji mam wpisane:
    LDI R16, POCZATEK_PROGRAMU_H; zapisanie do wskaznika programu adresu poczatku programu
    LDI R17, POCZATEK_PROGRAMU_L
    STS PROGRAM_WSK_H, R16
    STS PROGRAM_WSK_L, R17


    więc program zaczyna być zapisywany w dobrym miejscu:|
  • #4 4147230
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 573
    To część programu czy cały bo nie widzę w niej niestety konfiguracji uarta ani trybu ani prędkośći oraz jego uruchomienia ;)
  • #5 4147282
    as124
    Poziom 14  
    Posty: 145
    Ocena: 15
    Umieściłem tylko część czyli procedury stwarzające kłopot. Cały program jest tutaj: http://bielan124.w.interia.pl/as.txt poprostu za dużo miejsca by zajmował. Zresztą komunikacja jako taka działa problem tylko z zapisem i odczytem pamieci :( .
  • #6 4147348
    ZlyDotyk
    Poziom 19  
    Posty: 169
    Pomógł: 40
    Ocena: 1
    Na pierwszy rzut oka brakuje skopiowania rejestru SREG w przerwaniach i przywrócenia go przed RETI.
  • #7 4149224
    as124
    Poziom 14  
    Posty: 145
    Ocena: 15
    Ogólnie w procedurze programowanie_ bit sreg.i zeruje żeby wyłączyć przerwanie od usartu a na koniec znów go ustawiam. Cały rejestr ma jakieś znaczenie? ZlyDotyk tak to zrozumiałem.? Zastanawiałem się czy problem nie polega na nie wyłączaniu samego przerwania od komunikacji ale to też dobrego efektu nie daje:(. Mam też problem z zakończeniem tych procedur rozkazem RJMP (nie jestem pewien czy tak to może być rozwiązane) ale lepszego pomysłu nie mam jak zpowrotem do Main wrócić. W symulatorze to jakoś też średnio działa ale to póki co problem na przyszłość:| ...chyba...
  • Pomocny post
    #8 4149563
    ZlyDotyk
    Poziom 19  
    Posty: 169
    Pomógł: 40
    Ocena: 1
    chodzi o to że jeżeli podczas czekania w głównej pętli programu wystąpi przerwanie zaraz za rozkazem zmieniającym flagi to po powrocie mogą one być zmienione i niezależnie od wyniku porównania program może "pójść" gdzie indziej. Dlatego dobrze jest zadbać o to żeby takich sytuacji nie było, czyli na przykład:

    in r16,SREG
    push r16

    i na koniec

    pop r16
    out SREG, r16
    reti
  • #9 4151853
    as124
    Poziom 14  
    Posty: 145
    Ocena: 15
    ZlyDotyk dziękuję za pomoc. Miałeś rację. Sam chyba nigdy bym na to nie wpadł. Podprogram zmieniał mi status i tutaj był cały problem. Widać symulator nie testuje tak naprawdę bitów w SREGu ale to w końcu symulator nie mikrokontroler więc ma prawo uciekać się do "sztuczek".
    Sam dopiero zaczynam uczyć się mikrokontorlerów w dodatku na zasadzie samouka a niestety jeśli ktoś czegoś nie pokaże to wymyślić to samemu nieraz bardzo trudno.
    Jeszcze raz dziękuje wszystkim zainteresowanym za zainteresowanie i ZlyDotykowi za trafną wskazówkę.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z obsługą przerwań i wskaźników programu w asemblerze dla mikrokontrolera Atmega8. Autor zamieścił fragmenty kodu odpowiedzialne za programowanie pamięci i odsyłanie danych przez UART, wskazując na poprawną komunikację z komputerem PC, lecz błędy pojawiają się przy zapisie i odczycie pamięci. Wskazano, że w procedurach brakuje zachowania rejestru SREG podczas obsługi przerwań, co może powodować nieprzewidziane zmiany flag i błędne działanie programu. Zalecane jest zapisywanie i przywracanie rejestru SREG (poprzez instrukcje push i pop) w procedurach przerwań przed rozkazem RETI. Po zastosowaniu tej poprawki problem został rozwiązany. Poruszono także kwestie konfiguracji UART i zgodności parametrów transmisji między mikrokontrolerem a PC, a także poprawnego ustawienia wskaźników pamięci w SRAM.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA