RTV forum PL | NewsGroups PL

Atmega nie reaguje na zmiany stanu linii sterujących kluczami CD4066 w pętli programu?

Nieposłuszna Atmega nie zmienia stanu li nii

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Atmega nie reaguje na zmiany stanu linii sterujących kluczami CD4066 w pętli programu?

Atlantis
Guest

Sun Sep 01, 2013 7:53 pm   



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?

Atlantis
Guest

Sun Sep 01, 2013 7:55 pm   



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

Quote:
#define ON2 |= _BV(7)

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

Atlantis
Guest

Sun Sep 01, 2013 7:57 pm   



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?

AK
Guest

Sun Sep 01, 2013 7:58 pm   



W dniu 2013-09-01 21:53, Atlantis pisze:
Quote:
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;
}
}

A nie powinno być:


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

Pozdr
AK

Quote:
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?


BartekK
Guest

Sun Sep 01, 2013 7:59 pm   



W dniu 2013-09-01 21:53, Atlantis pisze:
Quote:
int main (void)
{
while(1)
{
ON1;
_delay_ms(1000);
OFF1;
}
}
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
| sibi@drut.org GG:23319 tel +48 696455098 http://drut.org/
| http://www.allegro.pl/show_user_auctions.php?uid=338173

Sebastian Biały
Guest

Sun Sep 01, 2013 8:00 pm   



On 2013-09-01 21:53, Atlantis wrote:\
Quote:
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);
}

Jakub Rakus
Guest

Sun Sep 01, 2013 8:02 pm   



W dniu 01.09.2013 21:53, Atlantis pisze:

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

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

Michał Lankosz
Guest

Sun Sep 01, 2013 8:05 pm   



W dniu 2013-09-01 21:53, Atlantis pisze:
Quote:
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 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ł

Atlantis
Guest

Sun Sep 01, 2013 8:14 pm   



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

Quote:
A nie powinno być:

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

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

Adam Wysocki
Guest

Mon Sep 02, 2013 9:01 am   



Atlantis <marekw1986NOSPAM@wp.pl> wrote:

Quote:
Mam dziwny problem z Atmegą.

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/

elektroda NewsGroups Forum Index - Elektronika Polska - Atmega nie reaguje na zmiany stanu linii sterujących kluczami CD4066 w pętli programu?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map