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