AVR - troche kodu, gdzies blad ?

May 12, 2004 3 Replies

Witajcie Moze ktos z grupowiczow mnie oswieci ;>



W CodeVision pisze tak:



PORTA=0x01; DDRA=0x01; pin 0 wyjscie, reszta wejscia DDRB.0=1; wyjscie do swiecenia dioda DDRB.1=1;



if(PINA.1) petla_dobra(); else petla_zla();



gdzie petla_dobra() mruga dioda zielona na PORTB.0 a petla_zla() mruga dioda na PORTB.1. Zwieram PORTA.0 z PORTA.1 i tu sa schody, bo na PINA.1 powinien wykryc 1 z PORTA.0 a tak nie jest. Swiecenie jednej z diod zalezy tylko od ustawienia portu. Probowalem wiec tak :



#asm petla: clr r25 in r25,$1B ; czytam port A ror r25 ; bit 1 przesuwam do carry ror r25



brcs dobry ; jesli w carry 1 to znaczy ze na PINA.1 wykryl jedynke i skacze do "dobry" ldi r25,2 ; tu tylko zapalam diode na PORTB.1 out $18,r25 JMP petla dobry: ldi r25,1 ; a tu zapalam diode na PORTB.0 out $18,r25 JMP petla #endasm



No i w zaleznosci czy zwieram, czy rozwieram, powinny sie gasic i zapalac odpowiednie diody, ale nadal tego nie wykrywa. Swieci albo jedna, albo druga, w zaleznosci czy piny wejsciowe ustawie jako Tri-state czy z "pull-up resistor". Pytanie wiec.... co moze byc przyczyna, ze ani if(PINA.1) ani in r25,$1B nie wykrywa poprawnie stanu ?


pozdr Marcin



U¿ytkownik "aciuh" snipped-for-privacy@obronet.org napisa³ w wiadomo¶ci news:c7rrk5$3ui$1@213.216.87.131...

na PORTA.0 masz stan 1

jesli wejscie PINA.1 dasz z pullup'em to nie odroznisz stanu kiedy PINA.1 dostaje 1 z pullup'a a kiedy jest zwarte do 1 z PORTA.0

nie wiem co chesz zrobic ale sytuacje poprawi jak dasz PINA.1 z pull'upem a na PORTA.0 wystawisz 0

wtedy po zwraciu PORTA.0 z PINA.1 bedziesz mial na nim 0 a gdy nie beda zwarte to na PINA.1 bedzie 1

OK dziala tak jak mowisz... ale czy instukcja in r25,$1B zmienia kierunek calego portu ? Z tego co widze to tak, bo musialem uzywac instrukcji if(PINA.1==0) zeby zadzialalo :) No i czy na wejsciu trojstanowym mozna wykryc jedynke ? Czy tylko moge wykrywac zero na wejsciu z PullUpem ?

pozdr Marcin

U¿ytkownik "aciuh" snipped-for-privacy@obronet.org napisa³ w wiadomo¶ci news:c7t5pc$ua$1@213.216.87.131...

"in" nie zmienia kierunku portu, do ustawienia czy dany pin jest WY czy WE sluzy port DDRA (dla PORTA)

jesli dany bit w DDRA jest 1 to odpowiadajacy mu pin jest WY jesli dany bit w DDRA jest 0 to odpowiadajacy mu pin jest WE

i dodatkowo gdy bit jest WE to wtedy stan danego bitu w PORTA okresla czy WE jest z pullup'em (1 na danym bicie w PORTA) lub tri-state (0 na danym bicie w PORTA)

stan wejscia zawsze odczytuje sie z PINA odczyt z PORTA zwraca to co do niego wpisales a nie stan na pinie

na tri-state mozna wykryc oba stany 1 - 0

tylko gdy wejscie pracuje jako tri-state to zawsze musi byc do czegos podlaczone nie mozna go zostawic wiszacego w powietrzu poniewaz ma bardzo duza impedancje wejsciowa (jak bramka tranzystora MOS) wiec jego stan moze sie przypdkowo zmieniac np od dotkniecia pinu procka palcem

jesli stosujesz wykrywanie stanu klawisza to ewidentnie masz sytuacje przy rozwartym klawiszu, ze pin wisi w powietrzu wiec koniecznie trzeba dodac rezystor albo na zewnatrz albo wewnatrz (wlaczyc pull'up)

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required