szimon Napisano Grudzień 19, 2010 Udostępnij Napisano Grudzień 19, 2010 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. Cytuj Link do komentarza Share on other sites More sharing options...
razors Grudzień 20, 2010 Udostępnij Grudzień 20, 2010 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 ... Cytuj Link do komentarza Share on other sites More sharing options...
szimon Grudzień 20, 2010 Autor tematu Udostępnij Grudzień 20, 2010 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. Cytuj Link do komentarza Share on other sites More sharing options...
razors Grudzień 20, 2010 Udostępnij Grudzień 20, 2010 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 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Pomocna odpowiedź
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!