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
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:(
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
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
W dodatku w symulatorze (używam AVRstudio) wszystko działa porprawnie a po wgraniu do kości już nie:(