Hallo, Bin neu auf diesem Gebiet. Daher stelle ich folgende Frage. Wie berechne ich die Zeit für einen Timer. Der Pic wird mit 4 MHz getaktet. Der Pic soll alle 50 ms einen Interrupt auslösen. Gruß Siegfried
Zuerst, Wieviele Häppchen zu 250ns sind in 50ms ? So hoch muss ein Zaehlen nun zaehlen, allenfalls gibt's noch einen selektierbaren Vorteiler.
Dreisatz und etwas gesunder Menschenverstand reicht dazu völlig aus. ...
Hallo Siegfried, also im Grunde hat jeder Timer ein Kontrollregister, in welchem du einen sogenannten Prescaler setzen kannst. Dies ist ein Vorteiler, welcher dir deine Oszillatorfrequenz teilt. Dann kommts drauf an, was du für einen Timer hast. 8 oder 16 bit. Ein 8-Bit Timer zählt, je nach eingestelltem Prescaler, von 0-255. Aber Vorsicht! Bei PICs bedeutet die Grundfrequenz für den Timer Quarzfrequenz / 4. Es sei denn, dein µC hat ne interne *4-PLL eingestellt. Die Vorgehensweise ist folgende: 1. Periodendauer der Frequenz/4 ausrechnen 1000ms / 1000000Hz => 0,001ms 2. deine benötigte Zeitdauer (50ms) durch die Periodendauer teilen. Falls du einen PreScaler zur Verfügung hast, kannst du den auch verwenden, indem du die Periodendauer damit multiplizierst. Somit hast du einen Wert, mit mit dessen Differenz zum Max-Wert, du das Timer-Register bei jeden Überlauf beladen musst.
Hallo Siegfried, DER PIC - gut, das es nur einen Typ gibt ; ) sonst ergänzend: http://www.sprut.de/electronic/pic/grund/inout.htm#timer Viel Spass dabei Dietmar
Hallo, übrigens, PIC = 18F252 Habe dieses Beispiel gefunden. /* Timer 2 Init */ PIR1bits.TMR1IF = 0; // BIT 0 TMR1 Overflow Interrupt Flag bit T1CONbits.T1OSCEN = 0; // BIT 3 Timer1 Oscillator Enable bit T1CONbits.TMR1CS = 0; // BIT 1 Timer1 Clock Source Select bit TMR1H = Timer1High; // => 238 TMR1L = Timer1Low; // => 120 T1CONbits.TMR1ON = 1; // BIT 0 Enable Timer1 INTCONbits.GIE = 1; // BIT 7 Global Interrupt Enable bit INTCONbits.PEIE = 1; // BIT 6 Peripheral Interrupt Enable bit PIE1bits.TMR1IE = 1; // BIT 0 TMR1 Overflow Interrupt Enable bit PIR1bits.TMR1IF = 0; // BIT 0 TMR1 Overflow Interrupt Flag bit //**hier 50ms => 20Hz EREIGNIS**// Wie kommt er auf die Werte 238 bzw 120 ? Gruß Siegfried
Das ist die Frage. Also bei diesen beiden Werten komme ich auf eine Taktfrequenz von 1.220.980, wenn ich mich nicht verrechnet habe.
Hallo, Weicht etwas von der Fragestellung ab. In der Interrupt Routine unterbinde ich mit "T1CONbits.TMR1ON = 0; // Timer ausschalten" einen weiteren Interrupt. dann die Code abarbeiten und am Schluß "T1CONbits.TMR1ON = 1; // Enable Timer1" zur erneuten freigabe. reicht dieses ""T1CONbits.TMR1ON = 1;" aus oder muß ich auch die Zeit erneut in die Register laden? Gruß Siegfried
Siegfried Saueressig wrote: > Hallo, > Weicht etwas von der Fragestellung ab. > In der Interrupt Routine unterbinde ich mit > "T1CONbits.TMR1ON = 0; // Timer ausschalten" > einen weiteren Interrupt. > dann die Code abarbeiten und am Schluß > "T1CONbits.TMR1ON = 1; // Enable Timer1" > zur erneuten freigabe. > reicht dieses ""T1CONbits.TMR1ON = 1;" aus oder muß ich auch die Zeit > erneut in die Register laden? > Gruß Siegfried Das sollte im Datenblatt stehen. Falls du Probleme hast, ein englisches Datenblatt zu lesen, musst du das hier einfach mal mit sagen. Es gibt genug, die damit umgehen können.
Hallo guten morgen, Wie anfangs geschriebe, bin ich neu auf diesem Gebiet. Datenblätter kann ich teilweise lesen/verstehen. Hauptgrund ist aber, das ich kein englisch in der Schule (1957-1965) gelernt habe. Versuch aber immer, das beste daraus zu machen. Ein gutes Buch habe ich noch nicht gefunden. Eins habe ich gekauft, hätte mir aber die 40 Euro sparen können. mit dem Timer bin ich weiter gekommen. Anhand dem Link von Dietmar habe ich gesehen, das der Timer vom übergebene Wert bis zum maximalem Zählerwert 0xFF bzw 0xFFFF läuft und dann bei Überlauf einen Interrupt auslößt. Also muß ich zum erneutem starten des Timers nicht nur das Bit "T1CONbits.TMR1ON" setzen, sonder auch davor die Werte für TMR1H & TMR1L Register übergeben. Habe aber noch eine Frage zum TMR1H & TMR1HL Register. z.B. Habe den Wert 1200. Dann ist 1200 : 256 = 4 Rest 176 das müsste doch falsch sein. Übergebe 4 dem TMR1H und 176 dem TMR1L. Ist dieses so richtig? 256-4=252 -> TMR1H und 256-176=80 -> TMR1L. Gruß Siegfried
Mach es doch andersrum: 2^16 sind 65.535, das ist der maximale Wert den der Timer annehmen kann. Du möchtest das er 1200 mal hochzählt, also 65.535-1200=64335. Und 64335 wiederum sind 1111.1011.0100.1111 in binärer Darstellung.
Hallo Alex, Danke für die Info. Das mit der binärer Darstellung ist klasse. Hast du dazu einen Rechner, der Dezimal nach Binärer arbeitet. Gruß an alle Siegfried
Hallo Siegfried, ein paar Tips, da Du scheinbar Herrn und Frau Google nicht kennst ; ) http://books.google.de/books?hl=de&id=Elui6MrASecC&dq=pic+k%C3%B6nig&printsec=frontcover&source=web&ots=oMEBeUExLT&sig=8ytIqLFxDq1SQWdirBvKm3eNdIk&sa=X&oi=book_result&resnum=5&ct=result Anne und Manfred König sind Urgesteine der PIC-Welt in Deutschland. Auch von Elektor gibt es PIC-Bücher. Die kenne ich aber nicht. Das heisst allerdings auch nichts. Dann http://www.fernando-heitor.de/ in Deutsch. Dann: Wie wäre es mit dem Windows-Rechner (Unter Zubehör) ?? Der kann unter "Wissenschaftlich" HEX DEC, etc. Gruss Dietmar
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.