Kapryśny kod w winavr (attiny2313).

Mar 05, 2005 7 Replies

Czesc,



w ramach poznawania AVRow napisalem sobie taki kod jak nizej; wgrany do ATtiny2313, zewn. kwarc, podlaczony do 7447 i 2 przyciskow. Problem polega na tym, ze czasami wszystko dobrze dziala, tj. nacisniecie przyciskow zwieksza/zmniejsza wartosc na wyswietlaczu a czasami jedno nacisniecie powoduje przeskok o 2 wartosci lub nie powoduje nic (nawet przytrzymanie przycisku). Co sie dzieje? I czy da sie to jakos rozwiazac?


-----------------------------------------------------------------



#include <avr/io.h>



#include <inttypes.h>



#include <avr/delay.h>



#define F_CPU 4000000UL


/* PORTB (PIN0..PIN1) -- podlaczone do 7447 */ /* PORTD (PIN5) -- przycisk reset zwierajacy */ /* PORTD (PIN4) -- przycisk reset zwierajacy */



int main() { uint8_t i;



DDRB = 0xFF; PORTB = 0xFF;



DDRD = 0x00; PORTD = 0xFF;



i = 0;



PORTB=14;


while (1) {



while (bit_is_clear(PIND,5) || bit_is_clear(PIND,4)) ; _delay_ms(10);



if (bit_is_clear(PIND,5)) { i++; if (i > 9) i=0; PORTB = i; }



if (bit_is_clear(PIND,4)) {



if (i == 0) { i=9; } else { i--; } PORTB = i; }


while (bit_is_clear(PIND,5) || bit_is_clear(PIND,4)); } return(0); }


-----------------------------------------------------------------



Filip Ozimek snipped-for-privacy@mielonka.polbox.pl> napisał(a):

Witam :)

Pewnie ! Tylko Twój biedny procek wykonuje to , co mu kazałeś ,tylko że Tobie chodzi o coś innego :( ..

Rozumiem , że przy wciśnięciu zwierają pin proca do masy (GND) ???

..

Powyższa pętla czeka na zwolnienie obu klawiszy - czy o to Ci chodziło ?? Mniemam że nie ??

Tu brakuje nawiasów klamrowych.

Znów czekamy na zwolnienie klawiszy.

Może tak ? .. while (1) {

while (bit_is_set(PIND,5) && bit_is_set(PIND,4)) ; _delay_ms(10);

if (bit_is_clear(PIND,5)) { i++; if (i > 9) { i=0; } } if (bit_is_clear(PIND,4)) { if (i == 0) { i=9; } else { i--; } }

PORTB=i; while (bit_is_clear(PIND,5) || bit_is_clear(PIND,4)); _delay_ms(10); //przy puszczaniu tez drgają ;-) } ...

Tak.

Po zwarciu do masy pojawi się stan niski, klawisze będą wciśnięte. Tak mi się zdaje.

Gdzie? Do if(bit_is_clear...)? Bo chybą są? Czy do if (i > 9)? Tam jest jedna instrukcja, więc blok jest IMHO zbędny.

Co będzie lepsze? outb()? PORTB=i;

Właśnie, tutuaj jest chyba błąd, powinno być zaprzeczenie !bit_is_clear(); czekam aż klawisz zostanie zwolniony, pojawi się stan wysoki.

Dzięki, sprawdze jak wróce do domu :)

Wpisałem Twój kod, ale działa bardzo podobnie (tj. podbnie nie działa :). Przyciski są ok, bezpośrednie zwarcie kabelkiem daje taki sam efekt. Spróbuję coś podobnego w asemblerze napisać, zobaczymy co wtedy.

Generalnie to sie naciales na drgania zestykow. Pamietaj ze w chwili zmiany przycisk generuje kilka szybkich impulsow.

Twoj kod mial jeden "blad" i Piotr go usunal - moze powieksz te delaye do 50ms .. i najlepiej w obu petlach while wsadz delaya.

A jesli nie pomoze .. to juz pozostaje tylko bardziej ambitne odklocanie zestykow ..

J.

Rozwiązałem to tak, że dałem delaya (~200-300ms) bez while, czyli dłuższe przytrzymanie przycisku powoduje zwiększanie się wartości (i to nawet jest dobre rozwizanie). Zauważyłem, że mocne i stanowcze naciśnięcie przycisku powoduje pożądany efekt; sprawdze jak się zachowują małe mikroprzełączniki, może tam będzie lepiej.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required