-
1. Data: 2013-09-01 21:53:27
Temat: Nieposłuszna Atmega nie zmienia stanu linii
Od: Atlantis <m...@w...pl>
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?
-
2. Data: 2013-09-01 21:55:52
Temat: Re: Nieposłuszna Atmega nie zmienia stanu linii
Od: Atlantis <m...@w...pl>
W dniu 2013-09-01 21:53, Atlantis pisze:
> #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.
-
3. Data: 2013-09-01 21:57:40
Temat: Re: Nieposłuszna Atmega nie zmienia stanu linii
Od: Atlantis <m...@w...pl>
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?
-
4. Data: 2013-09-01 21:58:19
Temat: Re: Nieposłuszna Atmega nie zmienia stanu linii
Od: AK <a...@g...com>
W dniu 2013-09-01 21:53, Atlantis pisze:
> 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
> 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?
>
-
5. Data: 2013-09-01 21:59:58
Temat: Re: Nieposłuszna Atmega nie zmienia stanu linii
Od: BartekK <s...@d...org>
W dniu 2013-09-01 21:53, Atlantis pisze:
> 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
| s...@d...org GG:23319 tel +48 696455098 http://drut.org/
| http://www.allegro.pl/show_user_auctions.php?uid=338
173
-
6. Data: 2013-09-01 22:00:31
Temat: Re: Nieposłuszna Atmega nie zmienia stanu linii
Od: Sebastian Biały <h...@p...onet.pl>
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);
}
-
7. Data: 2013-09-01 22:02:30
Temat: Re: Nieposłuszna Atmega nie zmienia stanu linii
Od: Jakub Rakus <s...@o...pl>
W dniu 01.09.2013 21:53, Atlantis pisze:
> 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
-
8. Data: 2013-09-01 22:05:28
Temat: Re: Nieposłuszna Atmega nie zmienia stanu linii
Od: Michał Lankosz <m...@t...pl>
W dniu 2013-09-01 21:53, Atlantis pisze:
> 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ł
-
9. Data: 2013-09-01 22:14:34
Temat: Re: Nieposłuszna Atmega nie zmienia stanu linii
Od: Atlantis <m...@w...pl>
W dniu 2013-09-01 21:58, AK pisze:
> 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... ;)
-
10. Data: 2013-09-02 09:01:15
Temat: Re: Nieposłuszna Atmega nie zmienia stanu linii
Od: g...@s...invalid (Adam Wysocki)
Atlantis <m...@w...pl> wrote:
> 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/