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

huda hudaklan@volny.cz
Úterý Duben 14 08:02:15 CEST 2009


Dobry den,
mel jsem jednou na ATMega162 podobny problem se ctenim z klavesnice.
Nakonec jsem program upravil takto, misto PORTB|=0x70

    asm ("sbi 0x18,5\n"); // kdyz je tu misto toho PORTB|=0x70 tak to zlobi
    asm ("sbi 0x18,6\n"); // protoze sem muze tuknout preruseni a zmenit
    asm ("sbi 0x18,7\n"); // prectenou hodnotu, se zakazem preruseni je to 
OK
Kompilator to prelozil OK, v asembleru to bylo take dobre.
Po prepsani do asembleru  nebo zakazem preruseni pred PORTB|=0x70 to
chodilo OK.
Take uz jsem si myslel, ze jsem uplne blbej. Treba to pomuze.

HUDA


----- Original Message ----- 
From: "Bear John Grills" <bear.j.grills@gmail.com>
To: <hw-list@list.hw.cz>
Sent: Sunday, April 12, 2009 6:10 PM
Subject: Avr studio, atmega32 - neodhalitelný problém ?


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





Další informace o konferenci Hw-list