Nieposłuszna Atmega nie zmienia stanu li

Sep 01, 2013 9 Replies

Mam dziwny problem z Atmegą. W układzie dwie linie są wykorzystywane do sterowania kluczami CD4066. Makrodefinicje włączające i wyłączające klucz wyglądają standardowo:



#define ON1 PORTC |= _BV(2) #define OFF1 PORTC &= ~_BV(2) #define ON2 |= _BV(7) #define OFF2 PORTD &= ~_BV(7)



Jeśli na początku programu ustawię którąś z linii w konkretnym stanie - wszystko jest ok. Napięcie na porcie się pojawia, albo nie. Sygnał jest puszczany, albo nie.



Dziwna rzecz zaczyna się dziać, gdy w nieskończonej pętli próbuję zrobić cykliczne włączanie i wyłączanie klucza:



int main (void) { while(1) { ON1; _delay_ms(1000); OFF1; } }



Program z uporem maniaka trzyma się stanu ustawionego na początku i za nic nie chce go zmienić...



Jaką przyczynę typujecie? Błąd w programie, uszkodzony port Atmegi, a może CD4066 coś miesza?


W dniu 2013-09-01 21:53, Atlantis pisze:

Tutaj oczywiście miało być: #define ON2 PORTD |= _BV(7) Błąd powstał podczas redagowania wiadomości - w programie jest ok.

I jeszcze jedno - czy podłączenie do masy nieużywanych kluczy z CD4066 (zarówno sterowanie jak i końcówki "włączników") może mieć jakiś negatywny wpływ na działanie układu?

W dniu 2013-09-01 21:53, Atlantis pisze:

A nie powinno być:

int main (void) { while(1) { ON1; _delay_ms(1000); OFF1; _delay_ms(1000); } }

Pozdr AK

W dniu 2013-09-01 21:53, Atlantis pisze:

A ta pętla robi: ON1; czekaj1000 OFF1; ON1; czekaj1000 OFF1; ON1; czekaj1000 OFF1; ON1; .... itd Czyli raz ci mignie ON > 1000ms > OFF, a potem dostajesz tylko krótkie mignięcia o szerokości kilku cykli procesora (prawie nic)...

On 2013-09-01 21:53, Atlantis wrote:\ > while(1) > { > ON1; > _delay_ms(1000); > OFF1; > }

Kiedyś dawałem studentom taką zagadkę czemu nie działa :)

while(1) { ON1; _delay_ms(1000); OFF1; _delay_ms(1000); }

W dniu 01.09.2013 21:53, Atlantis pisze:

Kiedyś też z czymś podobnym walczyłem - jak się okazało, po nakierowaniu przez grupowiczów, przyczyną był kompilator i jego opcje optymalizacji - uznawał tego typu konstrukcje za zbędne - zobacz w asemblerze jak to wygląda.

W dniu 2013-09-01 21:53, Atlantis pisze:

W tej pętli na wyjściu 1 stan OFF będzie przez jakieś ułamki mikrosekundy. Mierząc woltomierzem na pewno będzie stan ON przez cały czas. Dodaj delay za OFF1.

W dniu 2013-09-01 21:58, AK pisze:

Faktycznie. Jak widać faktycznie nie opłaca się siedzieć zbyt długo nad projektem... ;)

Problem już rozwiązany, ale ja nie o tym. Czasami gdy jest podobny problem i nie sprowadza się do braku delaya, warto sprawdzić fusebity (np. JTAGEN).

Przykład:

formatting link
Tak w ramach ciekawostki.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required