Gast
#1648347
hallo, komme einfach nicht mehr weiter mit meinem timer0, und dem
interrupt.
hier ist mein programm:
#include <p18f1320.h>
#pragma config OSC = HS //32MHZ
#pragma config PWRT = ON //Power Up Timer AN
#pragma config WDT = OFF // Watchdog Timer AUS
#define HIGH_uint(x) (unsigned char) ((x)>>8) //liefert High-Teil
#define LOW_uint(x) (unsigned char) (x) //liefert Low-Teil
static float p1=316220;
static float p,pp,pp1;
const float r=5E-13;
static unsigned int f,zw;
static char z=0;
void hiserv(void); // Prototyp Serviceprogramm
#pragma code einsprung=0x08 // Einsprungadresse
void einsprung (void) // Hilfsfunktion für Sprung
{
_asm GOTO hiserv _endasm // Assembler: Sprung nach Servicefunktion
}
#pragma code // System Codebereich
#pragma interrupt hiserv // Kennwort interrupt veranlasst
void hiserv(void) // Rücksprung aus Interrupt!!!
{
INTCONbits.GIE = 0;
if(z==0){LATB=0x05;}
if(z==1){LATB=0x06;}
if(z==2){LATB=0x0A;}
if(z==3){LATB=0x09;}
if(z<4){z=z+1;}
if(z==4){z=0;}
TMR0H=HIGH_uint(f);
TMR0L=LOW_uint(f);
INTCONbits.TMR0IF = 0; // Timer0 Anzeigeflag löschen
}
// System Codebereich
void main(void)
{
TRISB=0b11110000;
ADCON1 = 0x7f;
LATB=0x00;
f=65535;
TMR0H=HIGH_uint(f);
TMR0L=LOW_uint(f);
T0CON=0b10000010;
RCONbits.IPEN = 0; // Interruptsteuerung nicht priorisiert
INTCONbits.TMR0IF = 0; // Timer0 Anzeigeflag löschen
INTCONbits.TMR0IE = 1; // Timer0 Interrupt freigeben
INTCONbits.GIE = 1; // Interrupts global freigeben
while(1){
if(p1>65535){
p=p1*(1-r*p1*p1);
p1=p;
pp1=p1/32;
zw=pp1;
f=65535-zw;
T0CON=0b10000111;
}
else {
p=p1*(1-r*p1*p1);
p1=p;
pp1=p1/32;
zw=pp1;
f=65535-zw;
T0CON=0b10000010;
}
}
}
das programm soll den zweiten interrupt nach ca.300369µs auslösen den
nächsten interrupt soll laut der berechnung nach ca. 587188µs sein. ich
überprüfe das ganze mit dem pic18 simulator. kann jemand sagen wo der
fehler liegt, was mache ich falsch??? danke.