Hallo zusammen, ich habe seit drei Tage eine Funktion mit Verzögerung probiert aber nicht geschafft. Ich habe mit der Delay-Funktion probiert und geschafft aber leider passt nit mit der Aufgabe(mit eine verzogerung funktioniert die anderen befehlen nicht). ich will jetzt mit interrupt oder Timer Probiert.ich habe viel probiert und nicht geschafft. ich verwende PIC18F4550 in Programm MPLAB mit compiler C (20MHz). ich moechte ein kleines Beispiel wo das Signal 100ms später kommt. ich habe schon im Forum gesucht aber nicht gefunden. ich brauche euer Hilfe Gruß
TMR0 benutzen! wenn du FOSC von 20Mhz hast, dann wird der Timer mit 5Mhz also alle 0,2us einen takt hochgezählt. dieser Timer ist 8 bittig, also kannste ohne prescaler(der Takt, der auf den Timer geht, wird vorgeteilt) nur bis 51 us pause erzeugen. am besten wäre ein interrupt mit tmr0 oder tmr1(16 biggig) im interrupt hast du dann nen zähler, der beim x-ten interrupt dein ereignis auslöst. oder wenn während der verzögerung nix passieren soll, dann kannste ne for schleife verwenden, in der du x-mal bis zum tmr0-überlauf wartest for(x-mal) { tmr0 = 0; while(tmr0 < ...); } das wäre dann die unelegante, einfache lösung!
hier mal der interrupt mit tmr 0 #include "int16CXX.h" //Brauchste für Interrupts #pragma origin 4 interrupt serverX( void) { int_save_registers if(T0IF) // T0 übergelaufen? { OPTION = 1; //Prescaler einstellen TMR0 = 200; //Timer-Startwert initialisieren T0IF = 0; //Flag zurücksetzen //hier aktion z.B. Zähler, d. bei x-tem interrupt was tut } int_restore_registers } // Interrupt-Routine zu ende
3. Möglichkeit: void delay_ms(uns16 ms) // pause { while (ms) { OPTION = 2; // Vorteiler auf 8 einstellen TMR0 = 131; // 125 * 8 = 1000 (= 1 ms) while (TMR0); // Abwarten einer Millisekunde ms--; // "ms" mit jeder Millisekunde erniedrigen } } dann aufrufen mit : delay_ms(100) // du musst den prescaler noch auf deine Taktung anpassen // bei OPTION = 2 wird FOSC/4 durch 8 geteilt. die 125 die du da siehst, kommen wie folgt zustande: 256-131(8bittiger zähler läuft ja über nach 125 takten wenn er mit 131 ini wird.)
wenn du bis morgen warten kannst, kann ich dir von zu hause ein dummy-timer-interrupt-progrämmchen mitnehmen, das genau für deinen PIC passt... @ Latissimo: bist du sicher, dass "int16CXX.h" zur C18-bibliothek gehört? edit: arbeitest du mit dem Microchip-USB-bootloader? falls ja -> ich hatte auch meine probleme bis die interrupts liefen (nur vektor ummapen ging nicht)
Oh ja kann sein, dass das bei andern compilern anders ist! Denke aber, dass du immer so eine headerfile brauchst, wie auch immer diese bei dem jeweiligen comiler heißt.
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.