Witam
Od kilku dni walczę z prostym programem w asemblerze. Program ma sterować kluczem analogowym CD4052, samą obsługę klucza napisałem w godzinkę i ruszyło z kopyta, problem pojawił się gdy zechciałem by zapisywać w wewnętrznym EEPROM stan ostatnio wybranego wejścia tak by po ponownym włączeniu zasilania było ono aktywne.
Zamieszczam fragment programu:
W całości program składa się z 4 pętli (zamieściłem tylko dwie, żeby zobrazować jak to ma działać).
Ma to działać tak - po włączeniu zasilania odczytywana jest zawartość pamięci o adresie 1. Następnie porównuję zawartość rejestru R19 do którego przerzucam zawartość pamięci z 4 różnymi stałymi które charakteryzują każdą z 4 pętli. Jeśli zawartość jest zgodna, to program ma skoczyć do odpowiedniej pętli, jeśli jest niezgodna - ma odpowiednio ustawić zawartość rejestrów DDRD i PORTD, które są wartościami startowymi i następnie przejść "do porządku dziennego".
Po naciśnięciu któregoś z 4 przycisków ma zapisać do pamięci odpowiadający mu stan rejestru PORTD (po którym przy odczycie identyfikuję odpowiednią pętlę).
Program krąży w pętli dopóki nie zostanie naciśnięty inny przycisk - wówczas przeskakuje do innej pętli i w niej krąży do czasu naciśnięcia kolejnego przycisku.
Ogólnie sam program bez procedur zapisu/odczytu EEPROM działa dobrze, problem pojawił się gdy postanowiłem dorobić mu pamięć. W symulatorze pakietu AVR Studio niby wszystko jest dobrze, jednak w rzeczywistości nie działa prawidłowo.
Po zapisaniu pamięci wartościami FF, program "stwierdza" że zawartość pamięci nie pasuje do żadnej stałej i ustawia wartości startowe i wchodzi do pierwszej pętli (zapala się odpowiednia dioda), natomiast po wyłączeniu zasilania i włączeniu ponownie nie dzieje się nic. Dopiero gdy nacisnę przycisk zapala się dioda do niego przyporządkowana i potem już działa prawidłowo dopóki nie wyłączę zasilania.
Wygląda to tak, jakby był jakiś problem z odczytem pamięci i skokiem do odpowiedniej pętli - zapis jest prawidłowy, po wyłączeniu zasilania i odczytaniu zawartości pamięci EEPROM jest tam prawidłowa zawartość.
Nie wiem, może to trzeba jakoś inaczej rozwiązać niż poprzez mnemonik breq? Niestety nie wiem jak - utknąłem na tym etapie.
Proszę o sugestie.
Od kilku dni walczę z prostym programem w asemblerze. Program ma sterować kluczem analogowym CD4052, samą obsługę klucza napisałem w godzinkę i ruszyło z kopyta, problem pojawił się gdy zechciałem by zapisywać w wewnętrznym EEPROM stan ostatnio wybranego wejścia tak by po ponownym włączeniu zasilania było ono aktywne.
Zamieszczam fragment programu:
Kod: AVR assembler
W całości program składa się z 4 pętli (zamieściłem tylko dwie, żeby zobrazować jak to ma działać).
Ma to działać tak - po włączeniu zasilania odczytywana jest zawartość pamięci o adresie 1. Następnie porównuję zawartość rejestru R19 do którego przerzucam zawartość pamięci z 4 różnymi stałymi które charakteryzują każdą z 4 pętli. Jeśli zawartość jest zgodna, to program ma skoczyć do odpowiedniej pętli, jeśli jest niezgodna - ma odpowiednio ustawić zawartość rejestrów DDRD i PORTD, które są wartościami startowymi i następnie przejść "do porządku dziennego".
Po naciśnięciu któregoś z 4 przycisków ma zapisać do pamięci odpowiadający mu stan rejestru PORTD (po którym przy odczycie identyfikuję odpowiednią pętlę).
Program krąży w pętli dopóki nie zostanie naciśnięty inny przycisk - wówczas przeskakuje do innej pętli i w niej krąży do czasu naciśnięcia kolejnego przycisku.
Ogólnie sam program bez procedur zapisu/odczytu EEPROM działa dobrze, problem pojawił się gdy postanowiłem dorobić mu pamięć. W symulatorze pakietu AVR Studio niby wszystko jest dobrze, jednak w rzeczywistości nie działa prawidłowo.
Po zapisaniu pamięci wartościami FF, program "stwierdza" że zawartość pamięci nie pasuje do żadnej stałej i ustawia wartości startowe i wchodzi do pierwszej pętli (zapala się odpowiednia dioda), natomiast po wyłączeniu zasilania i włączeniu ponownie nie dzieje się nic. Dopiero gdy nacisnę przycisk zapala się dioda do niego przyporządkowana i potem już działa prawidłowo dopóki nie wyłączę zasilania.
Wygląda to tak, jakby był jakiś problem z odczytem pamięci i skokiem do odpowiedniej pętli - zapis jest prawidłowy, po wyłączeniu zasilania i odczytaniu zawartości pamięci EEPROM jest tam prawidłowa zawartość.
Nie wiem, może to trzeba jakoś inaczej rozwiązać niż poprzez mnemonik breq? Niestety nie wiem jak - utknąłem na tym etapie.
Proszę o sugestie.
