[ Pioneer cdj 200 @ 07.12.2014. 16:39 ] @
Imam jedan problem i hitno mi je (jer moram večeras predati zadaću). Dakle koristim Timer0 s prekidom za brojanje 5 sekundi, PIC radi na 10 kHz i treba mi 16-bitni counter. Stvar je da 16-bitna opcija na Timer0 ne radi! Kad stavim 8-bitni, uredno generira prekide, ali kad prebacim na 16-bitni, ništa. I onda sam se malo igrao i shvatio da on broji samo niže bitove odnosno TMR0L a TMR0H ne mrda od postavljene vrijednosti. A budući da se prekid izaziva kod prelaska sa FFFF na 0000, prekida neće nikad biti jer moj counter očito kad dođe na 00FF, prelazi opet u 0000, gornji bitovi se nikad ne mjenjaju! Kako je to moguće!?? A do tog zaključka sam došao tako što sam u main dijelu programa, unutar while(1) petlje probao staviti neki if (TMR0L = 0xFE) npr. i uredno se izvrši ono što je unutar if uvjeta. I ako recimo stavim if(TMR0H = početna_vrijednost) isto tako će se izvršiti. Ako stavim if(TMR0H = 0x05) npr a početna vrijednost je 0x00, nikad neće ući u taj if. EDIT: budući da radim u Proteusu simulaciju, stavio sam u Watch Window timer kao Internal Timer 0 i tamo se svih 16-bitova inkrementira i debugger pokazuje neku aktivnost kad sa FFFF prede u 0000 ali prekid i dalje ne radi. Je li to bug u programu? Evo moj kod: Code: /* Main.c file generated by New Project wizard * * Created: uto pro 2 2014 * Processor: PIC18F1220 * Compiler: MPLAB C18 */ #include <p18f1220.h> #pragma config WDT = OFF #pragma config PWRT= ON #pragma config MCLRE=OFF void high_isr(void); // prototip prekidne rutine #pragma code high_vector=0x08 // direktiva pretprocesoru – slijedi // prekidni vektor void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm // skoci na prekidnu rutinu } #pragma code // kraj prekidnog vektora #pragma interrupt high_isr // direktiva pretprocesoru - slijedi prekidna rutina visokog prioriteta void high_isr (void) { PORTB = 0xFF; } #pragma code // kraj programskog koda prekidne rutine void main() { PORTB = 0; // Brisanje porta B TRISB = 0; // Svi portovi porta B izlazni INTCON = 0xA0; // Uključivanje prekida T0CON = 0x88; // Postavljanje i pokretanje brojaca, 16-bit, interni clock, bez prescalera*/ TMR0L = 0x00; TMR0H = 0xFF; // 0x09 while (1){ } } [Ovu poruku je menjao Pioneer cdj 200 dana 07.12.2014. u 17:55 GMT+1] |