Forum: Mikrocontroller und Digitale Elektronik Wie kann ich timer0 mehr als 65535µs laufen lassen


von Thomas (Gast)


Lesenswert?

ich habe problem mit der eingabe der werten in den timer0, die werte 
sind  grösser als 65535, das heißt, dass ich eine verzögerung brauche 
die z.b. 800000µs lang ist. arbeite mit dem pic18 µc mit 32MHZ ext. 
takt.
danke für hilfe!

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:
> ich habe problem mit der eingabe der werten in den timer0, die werte
> sind  grösser als 65535, das heißt, dass ich eine verzögerung brauche
> die z.b. 800000µs lang ist.

Was hindert dich daran, 2 Verzögerungen a' 40000 zu machen?

von Thomas (Gast)


Lesenswert?

und wie? wenn ich fragen darf?

von gtf (Gast)


Lesenswert?

Hat der Pic etwa keinen Prescaler vorm Timer?

von LuXXuS 9. (aichn)


Lesenswert?

Und du kannst ja auch in der ISR vom Timer eine Variable hochzählen.

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:
> und wie? wenn ich fragen darf?

Na, wie machst du es denn jetzt, dass du eine Verzögerung von zb 40000 
µs realisierst?

(Ich kann nicht PIC. Ich wüsste wie ich das auf einem AVR mache. Die 
Technik wird aber auch auf einem PIC nicht soviel anders sein. Also: 
gesetz den Fall die Zeit ist in einem Bereich, der sich ausgeht. wie 
würdest du das machen? Und dann benutzt du dieselbe Technik und eine 
zusätzliche Variable die bis 2 zählt. 2 * 40000 Wartezeit ergibt 80000)

von stephan (Gast)


Lesenswert?

Das Register T0CON hat die Bits T0PS0 bis T0PS2 als Kriterium für den 
Vorteiler, der bis 1:256 gehen kann. Bingo! Im Datenblatt steht alles.

von dfgn (Gast)


Lesenswert?

Und warum liest Thomas (Gast) das nicht selbst?

Gast

von stephan (Gast)


Lesenswert?

Ist ein bisserl schwierig, die Datenblätter für die 18er PICs haben 
meist mehr als 400 Seiten ...

von xdbgcxb (Gast)


Lesenswert?

Und wieviel davon beschreiben die Timer - genau, ein Bruchteil davon.
Aber das merkt man leider immer oefter, lesen lassen ist wohl "in".


Gast

von AVR (Gast)


Lesenswert?

Die bei den AVRs genauso, aber die sind in Kapitel unterteilt und eine 
Suche gibt es ja auch. Ich gehe mal schwer davon aus, dass das bei den 
PICs genauso ist

von stephan (Gast)


Lesenswert?

AVR und PIC sind eher eine Glaubensfrage ... :)

von ccx (Gast)


Lesenswert?

Auch bei den Datenblättern für PICs gibt es Kapitel und sogar ein 
Inhaltsverzeichnis !!!

von Thomas (Gast)


Lesenswert?

also ich muss eine dynamische verzögerung schaffen die bei ca. 1-2 
sekunden anfängt und endet im µs bereich ca. 100-150µs, habe auch an den 
prescaler gedacht aber weiß noch nicht wie ich es organisieren muss, 
aber trotzdem danke für die antworten sorry für kurze pause bei mir

von Thomas (Gast)


Lesenswert?

bis jetzt habe ich das so organiesiert:

#include <p18f1320.h>
#pragma config OSC = HS
#pragma config PWRT = ON              //Power Up Timer
#pragma config WDT = OFF             // Watchdog Timer

#define HIGH_uint(x) (unsigned char)  ((x)>>8)  //liefert High-Teil
#define LOW_uint(x)  (unsigned char)  (x)       //liefert Low-Teil


volatile long int p1=31622;
volatile long int p;
static float r=5E-10;
volatile long int l;
volatile long int k,j,i,s;
long int f;
char z=0;
unsigned long int ps=500;

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!!!
{
 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;}
 p=p1*(1-r*p1*p1);
 p1=p;
 f=65535-p1;
 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);
}
aber der wert p1 kann auch größer sein als 65535, deswegen war die 
frage.

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:

> aber der wert p1 kann auch größer sein als 65535, deswegen war die
> frage.

Schon klar.
Aber
  zu setzender Prescaler =  ( p1 / 65535 ) + 1
  p1 = p1 / gesetzter Prescaler

Du errechnest ein p1 von 80000

Daraus ergibt sich ein Prescaler von
    ( 80000 / 65535 ) + 1 = 2
und ein tatsächlich am Timer einzustellender Wert von 80000 / 2 = 40000

muss man halt ein bischen rechnen


In eine Kiste passen maximal 65535 Äpfel.
Wieviele Kisten werden benötigt, wenn 80000 Äpfel vorhanden sind und in 
jede Kiste gleich viele Äpfel hinein sollen und wieviele Äpfel sind dann 
in jeder Kiste

Da du jeden beliebigen Prescaler von 1 bis 255 benutzen kannst, ist die 
Sache sogar noch einfacher als wie wenn es da auch noch Beschränkungen 
gäbe.

von Thomas (Gast)


Lesenswert?

ok war einfach, danke sehr

von Peter D. (peda)


Lesenswert?

Ich fürchte, float-Rechnung im Interrupt ist keine gute Idee.

Hier mal ein Beispiel wie man aufm AVR einen 8Bit-Timer auf 32Bit pimpt:

Beitrag "AVR Timer mit 32 Bit"

Da es in C ist, sollte es leicht auf den PIC anzupassen sein. Da heißen 
die Bits und Register eben nur anders.


Peter

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.