www.mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie? wenn ich fragen darf?

Autor: gtf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat der Pic etwa keinen Prescaler vorm Timer?

Autor: LuXXuS 909 (aichn)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dfgn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und warum liest Thomas (Gast) das nicht selbst?

Gast

Autor: stephan (Gast)
Datum:

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

Autor: xdbgcxb (Gast)
Datum:

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


Gast

Autor: AVR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR und PIC sind eher eine Glaubensfrage ... :)

Autor: ccx (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok war einfach, danke sehr

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.