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...
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/