Re: Avr studio, atmega32 - neodhalitelný problém ?

Miroslav Šinko sinkomiro@gmail.com
Pondělí Duben 13 21:07:00 CEST 2009


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
>
>



Další informace o konferenci Hw-list