Avr studio, atmega32 - neodhalitelný problém ?

Petr Tomasek tomasek@etf.cuni.cz
Pondělí Duben 13 22:04:25 CEST 2009


On Mon, Apr 13, 2009 at 09:58:46PM +0200, Bear John Grills wrote:
> Zapisoval jsem puvodne na port tyto hodnoty pomoci OR, jenze jak jsem se 
> snazil prijit na problem tak jsem to zapsal takto. Samosdrejme tam patri 
> or, aby se zachovaly hodnoty na ostatnich pinech.
> Musim rici, ze ani po dalsim dni laborovani jsem problem neodhalil.
> Skutečne jsem zoufalý!

Co takhle se podivat na asembler, co leze z kompilatoru?
Tak muzete pripadne vyloucit, ze by to bylo spatnym kompilatorem :)

> Bear
> 
> Miroslav Šinko napsal(a):
> > Co mate na ostatnych pinoch portu A? Alebo inac: preco pri nulovani 3
> > spodnych pinov zachovavate hodnoty ostatnych, ale pri zapise (1, 2, 4)
> > ich nulujete?
> >
> > miro
> >
> > 2009/4/12, Bear John Grills <bear.j.grills@gmail.com>:
> >   
> >> Zdravim,
> >>  cele odpoledne, vlastne, cely dnesni den se tady trapim s nesvary meho
> >> programu ktery pisu pro atmega32 v avr studiu v c.
> >> Na portu A mam 3x spolecne katody segmentovek(3) ktere jsou spinane
> >> tranzistorem. Takze od pa0 az po pa2 ridim log. jednickou, jaka z nich
> >> se ma rozsivit.
> >> Pravidelne obnovovani resim timer/counterem.
> >> JENZE.
> >> V simulatoru(debuggeru) vse ok. Nejdrive se vynuluji ty 3 bity a
> >> nasledne se pomoci bit. posunu aplikuje na jeden z nich log. 1, ktera
> >> tam beha z prava do leva.
> >> Jenze idylku vam zkazi az to, kdyz vysledek nakopnete do mikroprocesoru.
> >> Poslouzi ukazka toho kodu. Takto naprosto neefektivne, prasacky napsany
> >> kod je vysledek vylucovaci metody hledani problemu.
> >>
> >> volatile int display_i = 1; // cislo ukazujici na vybranou segmentovku
> >> (pokusne cislo jedna jako vychozi) (pozn. i kdyz tam neni volatile porad
> >> to dela to same)
> >> ......
> >> ISR(TIMER0_OVF_vect)    // TC0 overflow
> >> {
> >>
> >>
> >>    PORTA &=~(0x7);
> >>    asm("nop");
> >>
> >>    if(display_i==0) {
> >>        PORTA = 0x1;
> >>        display_i = 1;
> >>    }
> >>    else if(display_i==1) {
> >>        PORTA = 0x2;
> >>        display_i = 2;
> >>    }
> >>    else if(display_i==2) {
> >>        PORTA =    0x4;
> >>        display_i = 0;
> >>    }
> >>
> >>    TCNT0=0x00;
> >> }
> >>
> >>
> >> Jak jsem rekl, v simulatoru OK. Ale pokud je to v prociku, nepracuje
> >> to.. zůstane "blikavě(střídavě, tak jak mají svítit i ostatní)" svítit
> >> pouze ta segmentovka prostřední, čili číslo jedna. (mám je "číslované" z
> >> prava od 0). A zjistil jsem, co je ten problém..
> >> Ten výraz PORTA &=~(0x7);.
> >> Pokud tam není, segmentovky se střídají a svítí všechny jak mají.
> >> Jak může mít ten výraz vliv na to, že se to celé "sekne" na te
> >> prostřední segmentovce? To mi nejde na rozum!
> >>
> >> Prostě pokud tam je PORTA &=~(0x7);, tak to skace do tech vetvi jak ma,
> >> ale pokud to neni vetev, do ktere se da skocit pokud display_i==naprosto
> >> původní hodnota(v našem případě ta jednička), neaplikuje to to PORTA =
> >> 0x1;(např.)
> >>
> >> Čím to může být?
> >> Jsem z toho vazne jelen..
> >>
> >> Díky
> >>  Bear
> >>
> >>
> >>     
> > _______________________________________________
> > HW-list mailing list  -  sponsored by www.HW.cz
> > Hw-list@list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
> >
> >   
> 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

-- 
Petr Tomasek <http://www.etf.cuni.cz/~tomasek>
Jabber: butrus@jabbim.cz
SIP: butrus@ekiga.net



Další informace o konferenci Hw-list