Nieposłuszna Atmega nie zmienia stanu li

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?

Reply to
Atlantis
Loading thread data ...

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.

Reply to
Atlantis

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?

Reply to
Atlantis

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

Reply to
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)...

Reply to
BartekK

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); }

Reply to
Sebastian Biały

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.

Reply to
Jakub Rakus

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.

Reply to
Michał Lankosz

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

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

Reply to
Atlantis

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.

Reply to
Adam Wysocki

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.