Co je spatne?

BuFran BuFran@seznam.cz
Pátek Říjen 1 17:44:23 CEST 2004


> #define admask 0x86
> #define adif   0x10
> #define adsc   0x40

>    uint16_t i, h, l;
>    uint8_t value, prevval;

>    for (i=1; i<256; i++) {
>        // Start conversion, loop until it is done
>        ADCSRA = admask | adsc;
>        while (ADCSRA & adsc) ;
>        ADCSRA = ADCSRA | adif;
>        // Read value

Tohle :

>        l = ADCL;
>        h = ADCH;
>        value = ((h << 8) | l) >> 2;

 se da lepe napsat jako

         value = ADCW;



> /**/      char buffer[10];
> /**/      sprintf( buffer, "%x%x", ADMUX, (h<<8) | l);
> /**/      DisplayText( buffer);

>        if (prevval!=value) return 0xFF;

predpokladam, ze je to ve funkci, jinak tady navrati 0xFF ??

>        prevval = value;
>    }


> /*************************/

> Kdyz je kod oznaceny /**/ tam, kde ted je, vse funguje spravne a pri
> zmene napeti na vstupech AD prevodniku se meni displej. Kdyz ovsem tento
> kod dam az za cyklus na pozici oznacenou /*************************/,
> tak to porad zobrazuje 3FF bez ohledu na to, co je ne vstupu. Uz nad tim
> badam druhy den a porda na nic nemuzu prijit. Nevite, v cem je chyba?

Tipuju na optimalizaci, zkuste ji vypnout -O0 a nebo dat promenne
value vlajku VOLATILE

> Prekladam to pomoci nejnovejsi verze WinAVR. Pokud enkdo vite o 
> disassembleru pro ATmega8535, budu moc rad - prohlednu si primo 
> prelozeny kod a treba budu moudrejsi.

viz RTFM, parametry gcc (generuje vysledny ASM, z ktereho se sestavi
ELF, a pote se smaze ASM. Parametrem se mazani ASM da vypnout)

P.S. jedno doporuceni: Je lepsi definovat procesor v MAKEFILE a pak v
projektu dat #include <io.h> (resp <avr/io.h>) a pouyivat konstanty
jiz preddefinovane (v iom8535.h). Nazvy maji shodne jako katalog,
akorat VELKYM TISKACIM pismem. (a je treba pouzit _BV() makro. Vyhnete
se pripadnym #define a je jednodussi portace na jiny uP.

ADCSRA |= _BV(ADIF) ;


Jinak jeste k otazce cteni ADCW, nedoporucuji cist ADCW vicekrat ve
Free-Running modu ... Dela to paseku, kdy se nekdy zahazuji vysledky
apodobne.

Ted me trklo - value je uint8_t ?? nema byt uint16_t ?? takhle jsou
veskere posuvy marne, pouzije se jen hodnota l (8 bitu - 1 registr).

-- 
Best regards
 BuFran




Další informace o konferenci Hw-list