Wie kann ich timer0 mehr als 65535µs laufen lassen

#1645040
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)
Gast #1645168
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
Gast #1645177
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.
#1645197
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren