Avr studio, atmega32 - neodhalitelný problém ?

Bear John Grills bear.j.grills@gmail.com
Pondělí Duben 13 21:58:46 CEST 2009


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

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




Další informace o konferenci Hw-list