Skocz do zawartości

[ASM][ATmega8]Program działa tylko w symulatorze


szimon

Pomocna odpowiedź

Na wstępie zaznaczam, z nadzieją na ograniczenie objętości całego wątku, że procesor jest sprawny (przynajmniej używane przeze mnie moduły), to samo programator. Fakt, że umieszczam ten temat wynika z tego, ze najczęstsze przyczyny ewentualnych błędów zostały wyeliminowane.

Nie będę opisywał całego programu, bo nikt nie przeczytałby ani opisu, ani kodu. Postaram się pokrótce opisać jedynie fragment, który działa mi w symulatorze AVRStudio. Mikrokontroler generuje przebieg PWM typu Phase & Frequency Correct. W momencie osiągnięcia przez licznik T1 wartości szczytowej (określającej częstotliwość przebiegu), układ zgłasza żądanie przerwania typu określanego przez autorów noty jakże uroczą nazwą "Timer/Counter Capture Event". Przerwanie uaktywnia pojedynczą konwersję przetwornika A/C. Wewnątrz procedury obsługi przerwania od przetwornika A/C program wykonuje dwie podstawowe czynności:

1. Na podstawie odczytanej wartości odpowiednie ustawienie wypełnienia PWM - to działa.

2. Dwa najstarsze bity portu B stanowią dwubitową liczbę określającą kanał wyjściowy podłączonego demultipleksera. Z każdym przerwaniem od przetwornika A/C program ma za zadanie zwiększenie tej liczby, a tym samym ustalenie adresu kolejnego wyjścia demuxa. W ten sposób jeden kanał PWM używam do sterowania maksymalnie 8 obiektami sterowanymi modelarskim PWMem. Poniżej prezentuję fragment kodu odpowiedzialny za zwiększenie adresu:

ADconv:
ADconvStart:
...
;Doprowadzenie odczytanej wartosci do uzytecznej postaci
...

UstawAdres:
in r16, PINB
andi r16, 0xC0
cpi r16, 0xC0
breq ADCzerujAdres
clc
ror r16
ror r16
swap r16
inc r16
swap r16
rol r16
rol r16
in r17, PINB
andi r17, 0x0F
or r16, r17
out PORTB, r16
rjmp ADCustaw

ADCzerujAdres:
in r16, PINB
andi r16, 0x0F
out PORTB, r16

;Okreslenie szerokosci PWM na podst. odczytanej wartosci
ADCustaw:
...

reti

Działanie fragmentu jest następujące:

1. Odczytuje obecne wartości portu B, maskując sześć młodszych bitów.W końcu nie obchodzą mnie one - interesują mnie dwa najstarsze;

2. Przesunięcie w prawo i zamiana półbajtów, w wyniku czego interesujące mnie bity znajdują się na pozycji 0 i 1;

3. Zwiększenie liczby o 1, a w przypadku gdy miała ona przed zwiększeniem wartość bitową 11, wyzerowanie jej (fragment ADCzeruj);

4. Operacje odwrotne do wymienionych w pkt. 2., w celu sprowadzenia liczby na początkową pozycję.

W wyniku tego program wybiera cztery kolejne wyjścia demultipleksera.

Problem jest taki, że program działa jak należy w symulatorze (tzn. odpowiednio zmienia wartości dwóch najstarszych bitów portu B). Ponadto sam port jest sprawny, ręczne ustawienie/zerowanie bitów daje przewidywany efekt. Jednak program ten wgrany do mikrokontrolera nie zmienia w żaden sposób wartości bitów. PWM chodzi jak należy, ale zmieniane docelowo linie przyjmują stale poziom zadany na początku programu (podczas określania kierunku portu).

Czy ktoś w gronie diodowiczów miał podobny problem, tzn. program działający w symulatorze nie działał wgrany do układu? Miałem kiedyś problem taki, że w symulatorze program nie działał, a wgrany do układu już tak, więc takie coś nie byłoby dla mnie zaskoczeniem. Spodziewałbym się jednak, że jeżeli kod przeszedł nawet przez mocno wadliwy symulator AVRStudio, to będzie działał wgrany do komputera pokładowego Fiata 126p.

Link do komentarza
Share on other sites

nie przeczytalem Twojego opisu do konca ale zauwazylem juz blad w pdp. 2 . Mianowicie wykonujesz 2x ROR a potem SWAP (po tych operacjach dostajesz swoje dwa bity na pozycjach 4 i 5 !). ROR dziala tak, ze 7bit idzie na miejsce 0 a 6 na miejsce 7. Czyli Twoj kod powinien byc bez instrukcji SWAP abys mial swoje bity na pozycjach 0 i 1 ...

Link do komentarza
Share on other sites

Funkcja ROR przesuwa w prawo. Wartość bitu 7 idzie na bit 6, 6 na 5 itd. Dwie instrukcje ROR sprawiają, że dwa interesujące mnie bity idą na linię 4 i 5, a po SWAPie na 0 i 1.

Sytuacja, którą opisujesz wystąpiłaby w przypadku użycia funkcji ROL.

Link do komentarza
Share on other sites

masz racje ... wydaje sie ze powinno byc prawidlowo ... ale ja tez mialem przypadki ze mi nie dzialal symulator a w ukladzie rzeczywistym smigalo i na odwrot ... moze sprawdz czy tak zadziala:

in r16, PINB

andi r16, 0xC0

cpi r16, 0x00

breq najeden

cpi r16, 0x40

breq nadwa

cpi r16, 0x80

breq natrzy

rjmp ADCzerujAdres

i pod odbowiednia etyketa zmieniaj od razu porB na taki jaki trzeba

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.