Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

z ATmega88 na ATmega32 (projekt AVR444)

Szklok
-
-
Posty: 7
Rejestracja: 7 kwie 2010, o 19:05
Lokalizacja: Rybnik

z ATmega88 na ATmega32 (projekt AVR444)

Postautor: Szklok » 7 kwie 2010, o 19:17

Witam

Projekt nad którym pracuję, a który dedykowany jest na ATmegę88 chcę przenieść na ATmegę32.

Chciałbym w tym poście zawrzeć uwagi do jakich dochodzę.

1. Odniesienie się do Digital Input Disable Register 0 – DIDR0

Program przewiduje ustawienie digital input buffers on ADC channels, których ATmega32 nie posiada :/. Czy ktoś mógłby mi wyjaśnić mniej więcej czego one dotyczą? W nocie katalogowej jest o nich taka wzmianka:
• Bit 5..0 – ADC5D..ADC0D: ADC5..0 Digital Input Disable
When this bit is written logic one, the digital input buffer on the corresponding ADC pin is disabled.
The corresponding PIN Register bit will always read as zero when this bit is set. When an
analog signal is applied to the ADC5..0 pin and the digital input from this pin is not needed, this
bit should be written logic one to reduce power consumption in the digital input buffer.
Note that ADC pins ADC7 and ADC6 do not have digital input buffers, and therefore do not
require Digital Input Disable bits.
Proszę się nie krępować i podpowiedzieć nawet jeśli pytanie miało być głupie :P

MDz
-
-
Posty: 365
Rejestracja: 29 mar 2003, o 13:35
Lokalizacja: Warszawa
Kontaktowanie:

Postautor: MDz » 7 kwie 2010, o 22:25

Jeżeli wykorzystujesz linie portów jako analogowe wejścia ADC to ich część cyfrowa pozostaje nieużywana. DIDRx pozwala na wyłączenie tegoż fragmentu co daje pewne niewielkie oszczędności energii.

W M32 tej możliwości nie masz więc musisz usunąć fragmenty kodu odwołujące się do symbolu nieznanego w danym uC.

--
MDz

Szklok
-
-
Posty: 7
Rejestracja: 7 kwie 2010, o 19:05
Lokalizacja: Rybnik

Postautor: Szklok » 9 kwie 2010, o 14:22

Ok rozumiem, że funkcja ta jest wyłączona i że trzeba to po prostu zadeklarować.

2. Przedstawiam kawałek programu:
// Set up Timer/counter0 for PWM, output on OCR0B, OCR0A as TOP value, prescaler = 1.
TCCR0A = (0 << COM0A1) | (0 << COM0A0) | (1 << COM0B1) | (0 << COM0B0) | (0 << WGM01) | (1 << WGM00);
TCCR0B = (1 << WGM02) | (0 << CS02) | (0 << CS01) | (1 << CS00);
OCR0A = PWM_TOP_VALUE;
Posilę się poniższym obrazkiem:

Obrazek

Mega 32 nie posiada tej funkcji WGM02 mam rozumieć, że nie da się na niej jednocześnie wykorzystać dwóch PWM tak jak jest to zapisane wyżej?

czy wystarczy taka modyfikacja?
TCCR0 = (1<< COM01) | (0<< COM00) | (0<< WGM01) | (1<< WGM00);
OCR0A = PWM_TOP_VALUE;

Szklok
-
-
Posty: 7
Rejestracja: 7 kwie 2010, o 19:05
Lokalizacja: Rybnik

Postautor: Szklok » 13 kwie 2010, o 19:09

3. PCIN0.

W nocie aplikacyjnej AVR443 wykorzystane są przerwania dla hallotronów na trzech pinach PB1, PB2, PB3 dzięki obsłudze przerwań PCINT1, PCINT2 i PCINT3 na tych wejściach. Mega32 nie posiada takich przerwań, czy moja zabawa na tym uC dobiega końca?

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 14 kwie 2010, o 09:22

W nocie aplikacyjnej AVR443 wykorzystane są przerwania dla hallotronów na trzech pinach PB1, PB2, PB3 dzięki obsłudze przerwań PCINT1, PCINT2 i PCINT3
Nie moge teraz sprawdzić, ale czy ATmega32 rzeczywiście nie ma przerwań typu "PinChange"?
Jeśli nie, to spróbuj podłączyć halotrony do innych pinów (i przerwań). Wprawdzie będziesz musiał zmieniać aktywne zbocze, ale zaoszczędzisz na sprawdzaniu skąd przyszło przerwanie.
Jeśli i tak się nie da, to możesz "sXOR-ować" wyjścia wszystkich halotronów i podłączyć do komparatora analogowego - on ma na pewno wykrywanie każdej zmiany na wejściu.

Szklok
-
-
Posty: 7
Rejestracja: 7 kwie 2010, o 19:05
Lokalizacja: Rybnik

Postautor: Szklok » 17 kwie 2010, o 13:10

Dzięki za odpowiedź, wizja przeniesienia tego projektu na Mega32 jest dla mnie niestety zbyt dużym wyzwaniem. Dlatego jeśli to będzie możliwe pozostanę przy dedykowanym układzie a sam projekt tylko wrzucę na darmowy kompilator z AVR GCC.

Szklok
-
-
Posty: 7
Rejestracja: 7 kwie 2010, o 19:05
Lokalizacja: Rybnik

Re

Postautor: Szklok » 19 gru 2010, o 13:32

Witam, powracam do tematu.

Jak już wspominałem przeniesienie programu na Atmegę32 nie ma większego sensu jeśli chodzi o ten projekt. Zrealizowałem układ w oparciu o Atmegę48 i o to na jaki problem napotkałem.

W załączniku zamieściłem obraz z przebiegami na wyjściu: kolor żółty to sygnał halla, pozostałe przebiegi to wartości prądów poszczególnych faz. Program przewiduje pętlę 6-ciu różnych stanów w zależności od sygnałów z 3 hallotronów, które są odbierane przez mikrokontroler na wejścia PCINT. Jak widać na początku przebiegi wydają się być prawidłowe, program realizuje pełną pętlę, oraz dwa kolejne kroki po czym z niewiadomych powodów następuje przerwa ok. 80ms i kolejna inicjacja. Z czego to może wynikać? Czy z jakichś powodów uC może się resetować?
Załączniki
print_000.png
Ostatnio zmieniony 19 gru 2010, o 18:57 przez Szklok, łącznie zmieniany 2 razy.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 19 gru 2010, o 15:47

Watchdog wyłączony?? Wyłącz, albo umieść w programie zerowanie watchdoga.

Szklok
-
-
Posty: 7
Rejestracja: 7 kwie 2010, o 19:05
Lokalizacja: Rybnik

Postautor: Szklok » 19 gru 2010, o 19:19

Nie używam watchdoga. W dokumentacji Atmega88 dowiaduję się o trzech możliwościach resetu uC. Są to Power-on Reset, Brown-out oraz Watchdog.O ile trzeci odpada, o tyle drugi dotyczy przekroczenia określonego poziomu napięcia zasilania Vcc i musi być aktywowany, a pierwszy świadczy jakby o tym, że przy załączeniu zasilania aktywny jest reset i po jakimś czasie układ się załącza. Wydaje mi się, że z jakiegoś powodu napięcie zasilania spada do jakiejś wartości krytycznej, jego źródłem jest bowiem stabilizator napięcia zasilany ze źródła wysokiego napięcia zasilania silnika. Postaram się ograniczyć wpływ zakłóceń kondensatorami między masą a zasilaniem tych układów..

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 19 gru 2010, o 19:26

Szklok, trzeci wcale nie musi odpadać. W niektórych układach watchdog jest defaultowo włączony, i jeśli się go nie używa, trzeba go wyłączyć. W dodatku jest do tego specjalna procedura. W czym jest napisany kod tego programu?

Ale faktycznie od wyeliminowania zakłóceń warto zacząć.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Postautor: Tomasz Gumny » 19 gru 2010, o 20:29

W dokumentacji Atmega88 dowiaduję się o trzech możliwościach resetu uC. Są to Power-on Reset, Brown-out oraz Watchdog.
No to odczytaj i zapisz gdzieś (w nieinicjowanym RAM-ie lub EEPROM-ie) źródło ostatniego resetu.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 21 gości