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!
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?
Hat der Pic etwa keinen Prescaler vorm Timer?
Und du kannst ja auch in der ISR vom Timer eine Variable hochzählen.
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)
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.
Und warum liest Thomas (Gast) das nicht selbst? Gast
Und wieviel davon beschreiben die Timer - genau, ein Bruchteil davon. Aber das merkt man leider immer oefter, lesen lassen ist wohl "in". Gast
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
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.