PIC18F-timer für Minuten und Stunden
#include<p18f452.h>
void T0_init();
void main()
{
TRISC=0; //Configure PortB as output Port.
LATC=0x01;
T0CON=0x07; //Prescaler= 1:256, 16-bit mode, Internal Clock
T0_init();
while(1)
{
//Initialize Timer0
LATC=0x00;
T0_init(); //Delay for 1 sec
LATC=0x01;
T0_init(); //Again delay for 1 sec
}
}
void T0_init()
{
int a=0;
//while(a<2) //{
TMR0H=0xF0; //Values calculated for 1 second delay with 4MHz crystal
TMR0L=0xBD; //4/4MHz =1us=1us*prescaler=256us=1sec/256u=0xF42-(FFFF)=F0BD
T0CONbits.TMR0ON=1; //Timer0 On
while(INTCONbits.TMR0IF==0); //Wait until TMR0IF gets flagged
T0CONbits.TMR0ON=0; //Timer0 Off
INTCONbits.TMR0IF=0; //Clear Timer0 interrupt flag
// a++;
// }
}
Es ist sehr genau Verzögerung und es tut seine Arbeit, aber ich will mehr Verzögerungen wie Stunden oder Minuten. Also , was zu tun ist für längere Verzögerungen. Ich habe mit einem Zähler, der inkrementiert auf alle gekennzeichnet, aber es funktioniert nicht.
- Jeder Körper zu Hause ich warte auf Antworten keine Antworten??
- Ich bin mir nicht sicher, aber es ist möglich, dass Sie zum aktivieren der interrupt zuerst durch Einstellung TMR0IE=1.
- Ist
int a
the counter probiert? Wenn ja, müssen Sie es erklären, 'static'. - Machen Sie einen Zähler-variable oder wickeln Sie Ihre delay-Funktion in einem
for
Schleife (oder zwei, oder drei) ist wirklich nicht schwer. Probieren Sie es aus. - vielen Dank für ur Sorge, aber ich muss mit timer in diesem.
- Statisch bedeutet, dass ein Wert nicht zerstört werden oder ist es etwas anderes?
- Ja, ein variable gibt es für die Lebensdauer des Programms. Ihre variable
int a
nur zugewiesen (nur besteht), wenn die Funktion " void T0_init()' wird aufgerufen. - Ja, und brauchen nur noch einen in dieser Funktion 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht ein erfahrener Programmierer sind und nicht genau wissen, wo Sie wollen Ihre Verzögerungen, aber ich hatte versucht, eine lange Verzögerung mit pic18f4550, aber es hat nicht funktioniert, D. H. für Minuten und Stunden. Aber ich habe gedacht, mit einem IC wie CD4060 oder DS1307. Sie können Folgen Sie diesem link für CD4060: http://dmohankumar.wordpress.com/2012/05/13/design-your-circuit-part-ii-cd-4060-timer/. Für DS1307 können Sie überprüfen, in studentcompanion Website: http://www.studentcompanion.co.za/post/Digital-Clock-using-PIC-Microcontroller-and-the-DS1307-Real-Time-Clock-XC8-Compiler/. Ich Wünsche Ihnen viel Erfolg, Dank
vergessen, die internen timer und eine busy-wait-routine auf eigene Faust: machen Sie zuerst eine 1-Sekunden-delay-routine (sehr einfach, es zu tun genau, kümmern sich um die Anruf-und retf Ausführungszeit!), dann machen Sie eine 1-minütige Verzögerung routine auf der Oberseite der ersten, dann machen Sie eine 1-Stunden-delay-routine auf die 1-minute... you get the idea.
Einer Sekunde 1000000 Mikrosekunden, das ist weniger als 256*256*256=16777216. Also ein 256-prescaled 16-bit-timer ist ausreichend, um zu zählen, eine zweite. Aber es ist nicht genug zu zählen, eine minute.
Die Lösung ist das hinzufügen einer
for
Schleife zum zählen der Sekunden. Und noch eine für Minuten und eine für Stunden, wie vorgeschlagen von @Andrew .Einer Quelle der Unsicherheit ist, dass der überlauf des Timers wird aktiviert, sobald in der
while()
Schleife. Also, wenn lange Berechnungen durchgeführt werden, die Schleife, die Präzision verringern. Um dies zu überwinden, die Verwendung von interrupts ist der Weg zu gehen. Was auch immer geschieht, der überlauf des Timers Auftritt, wird der interrupt-flag ausgelöst wird und die Unterbrechung einer Funktion ausgeführt wird, innerhalb von wenigen Zyklen.Da nichts getan in der
while(1)
Schleife wollte ich mit derSLEEP()
Befehl um einiges Energie. Leider ist der timer0 wird ausgeschaltet, indem dieSLEEP()
Befehl. Es ist nicht der Fall, der timer1, aber timer1 ein 8-prescaled 16-bit-timer... Also eine for-Schleife benötigt, um zu zählen der zweite.Hier ist ein code zusammengestellt durch XC8 und getestet mit dem simulator von MPLAB X...
Die Dauer der "zweiten" unterworfen, Vorsicht...Spielen mit
TMR1H
,TMR1L
undnb
erforderlich sein.Und mit einem externen Taktgeber (Quarz) ist besser : Wie man Timer1 genauer als eine real time clock?
<xc.h>
ist der header entsprechend den xc8 compiler. Gehen Sie zuproject->properties->Conf[default]
(Rechtsklick auf Projekt-Namen) und wählen Sie XC8 als compiler-toolchain. Ein freies (nicht-freie) version des xc8 heruntergeladen werden können im Mikrochip. Oder versuchen Sie, ändern Sie die Kopfzeile, indem Sie#include<p18f452.h>
. Und Sie haben können, um so etwas wie#pragma code high_vector=0x08
vorvoid high_isr(void)
,#pragma code low_vector=0x18
vorvoid low_isr(void)
und#pragma code
vor main.PIR1bits.TMR1IF
erhöht und die high-priority-interrupt-routinehigh_isr()
genannt wird.nb
zählt die Anzahl der überläufe...ich brauchte es, weil timer1 kann nicht zählen, eine zweite direkt da der prescaler von timer1 kann nicht höher sein als 8. Also timer1 Schleifen ab 0, wennnb==0
und ab 23*256+184 wennnb==1
. Der Zählerseconds
wird erhöht, wennnb==1
. Hinweis :256*256*2-23*256-184=125000
seconds
,minutes
undhours
funktionieren, das problem isthours%2==1
ist nicht der modulo-Funktion...Siehe microchip.com/forums/m255849.aspx zum Beispiel. Mithours-2*(hours/2)==1
kann den trick tun... ich werde das Bearbeiten der Antwort...