Forum: Mikrocontroller und Digitale Elektronik timing timer0


von Thomas (Gast)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

ok habe etwas falsch gemacht in dem "else" abschnitt, so soll das 
aussehen
else {
 p=p1*(1-r*p1*p1);
 p1=p;
 zw=p1;
 f=65535-zw;
 T0CON=0b10000010;
  }
aber funktionieren tut es nicht!

brauche dringend hilfe

von Thomas (Gast)


Lesenswert?

hm niemand eine idee?

von Karl H. (kbuchegg)


Lesenswert?

Lies nochmal dein Eröffnungsposting.
Was ist eigentlich die Fragestellung?

"Sieht jemand den Fehler" kanns ja wohl nicht sein. Du hast mit keinem 
Wort erwähnt, was eigentlich der Fehler ist.

Und nein, eine derart lieblos hingeschluderte Berechnung kontrolliere 
ich jetzt nicht. Du hast einen Simulator. Lass ihn duchsteppen und sieh 
dir die Zahlenwerte an.

von Rene K. (draconix)


Lesenswert?

Um was für einen µC handelt es sich eigentlich?! Sehe ich das richtig 
das du aus deinem Interrupt eine Funktion aufrufst?! 
"Auf-Die-Finger-Klopf"

von Thomas (Gast)


Lesenswert?

pic18f1320

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.