Hallo Leute,
Ich bin noch ein Neuling was Mikrokontroller angeht und hoffe ihr könnt
mir helfen. Ich habe mir eine Schaltung mit einem PIC16f877A gebaut die
mir auf dem Port RB0 ein High bzw. Low –Signal liefert und arbeite mit
MPlab und dem Hi-Tech C Compiler. Mein Ziel ist es die Zeit zwischen dem
High und Low-Signal zu messen. Meine Idee war es den Timer1 bei High zu
starten und bei Low zu stoppen. Die Schaltung arbeitet mit einem
Uhrenquarz.
Da wäre auch schon meine erste Frage. Wie lege ich den externen Takt
fest?
Mein Code:
void timer_init()
{
TMR1IF =1;
T1CON =0b00000000;
GIE =1;
PEIE =1;
TMR1IE =1;
TMR1H=0;
TMR1L=0;
}
void ports_init()
{
TRISA = 0b11111111;
TRISB = 0b11111101;
PORTB = 0b00000010;
PORTD = 0b11111111;
TRISD = 0b00000000;
ADRESL=1;
ADRESH=0;
}
void main(void)
{
ports_init();
timer_init();
while(1){
if (RB0 == 1)
{
TMR1ON = 1;
}
if (RB0 == 0)
{
TMR1ON = 0;
Time = 256*TMR1H+TMR1L;
TMR1H = TMR1L = 0;
Time = Time/128;
}
}
}
Nun meine Fragen:
Wird mein gestarteter Timer in der Variable TMR1H und TMR1L gespeichert?
Entsteht der Überlauf von TMR1L automatisch?
Wird die Zeit ohne Prescaler richtig berechnet?
Vielen Dank für eure Hilfe!!!
Gast
#3049152
Du schaltest den Timer1-Interrupt frei, ich sehe aber kein Interuptroutine dafür. Weiss jetzt nicht ob der HiTech Compiler automatisch eine leerer Interruptroutine erzeugt, aber wenn nicht, landet dein Programm bei 1. Timer1 Überlauf im Nirwana (genaugenommen auf der Adresse 0x0004 und was dort steht weiss ich nicht und du auch nicht). Also würde ich auf jeden Fall TMR1IE mal auf 0 setzen. Timer1 ist ein 16-Bit Timer. Überlauf von TMR1L nach TMR1H erfolgt automatisch. Da der Prescealer auf 1:1 steht und der interne Takt verwendet wird, steht in TMR1H/L die Anzahl der Fosc/4 Takte. Wie lange <Fosc/4> ist hängt vom verwendeten Quarz ab.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.