Nieposłuszna Atmega nie zmienia stanu li nii

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
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?

Re: Nieposłuszna Atmega nie zmienia stanu linii
W dniu 2013-09-01 21:53, Atlantis pisze:

Quoted text here. Click to load it

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

Re: Nieposłuszna Atmega nie zmienia stanu linii
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?

Re: Nieposłuszna Atmega nie zmienia stanu linii
W dniu 2013-09-01 21:53, Atlantis pisze:
Quoted text here. Click to load it
A nie powinno być:

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

Pozdr
AK

Quoted text here. Click to load it


Re: Nieposłuszna Atmega nie zmienia stanu linii
W dniu 2013-09-01 21:58, AK pisze:

Quoted text here. Click to load it

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


Re: Nieposłuszna Atmega nie zmienia stanu linii
W dniu 2013-09-01 21:53, Atlantis pisze:
Quoted text here. Click to load it
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)...


--  
| Bartłomiej Kuźniewski
| snipped-for-privacy@drut.org  GG:23319  tel +48 696455098  http://drut.org/
We've slightly trimmed the long signature. Click to see the full one.
Re: Nieposłuszna Atmega nie zmienia stanu linii
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);
}

Re: Nieposłuszna Atmega nie zmienia stanu linii
W dniu 01.09.2013 21:53, Atlantis pisze:

Quoted text here. Click to load it

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.


--  
Pozdrawiam
Jakub Rakus

Re: Nieposłuszna Atmega nie zmienia stanu linii
W dniu 2013-09-01 21:53, Atlantis pisze:
Quoted text here. Click to load it

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.

--  
Michał

Re: Nieposłuszna Atmega nie zmienia stanu linii

Quoted text here. Click to load it

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: http://www.elektroda.pl/rtvforum/topic809004.html

Tak w ramach ciekawostki.

--  
"zanim nastala era internetu, kazdy wiejski glupek siedzial w swojej wiosce"
http://www.chmurka.net/

Site Timeline