izmenjeno 1 put, poslednji put Pioneer cdj 200 07.12.2014. u 17:55
Izmene poruke
- Pioneer cdj 20007.12.2014. u 17:55zapis iz teksta poruke
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:
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){
}
}
/* 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){
}
}
Potpis
...njemu i kućno zvonce zvoni u A klasi... hh