www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Signalzeiten messen mit PIC18F


Autor: Chris H. (xkris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche grad mit einem PIC18F Pausenzeiten eines Rechtecksignals zu 
erfassen. Das zu messende Signal liegt an einem Interrupt-fähigen Pin.

Das Programm funktioniert folgendermaßen:
Bei der Initialisierung wird der Pin so konfiguriert, das er bei 
fallender Flanke einen Interrupt auslöst. Wenn dies der Fall ist, 
springt er in die ISR und startet den Timer indem ich den Timer_enable 
der vorher 0 war toggle.
Dann wird der Interrupt wieder aktiviert (muss per software gemacht 
werden)und so konfiguriert, das er bei steigender Flanke auslöst. Dann 
wird die ISR verlassen. Wenn die steigende Flanke kommt und einen 
interrupt auslöst, springt das Programm wieder in die ISR, toggelt den 
Timer, also stoppt ihn diese Mal, der Wert wird ausgelesen, der 
Interrupt wieder scharf geschaltet und wieder auf falling edge gesetzt, 
so dass er bei nächster fallender Flanke wieder anfängt zu messen, dann 
wird der Timer noch genullt und das wars.

Aber leider spuckt der Algoritmus nicht die Timerwerte aus, die ich 
erwarte. Kann es sein, dass der Prozessor langsamer läuft oder das sonst 
irgendetwas anders ist, wenn ich per ICSP programmiere und debugge? Oder 
hab ich etwas grundlegendes übersehen?Ich benutze die MPLAB IDE und 
programmiere in C.

Nachtrag: Mein Messsignal ist ein normales 1kHz Rechtecksignal, also 
0.5ms Pausenzeit, die ich gern messen würde. Mein PIC läuft mit 40Mhz, 
als ein Timercount entspricht einem Befehlszyklus = 4 Taktzyklen = 
0.1µs, sollte also genügen

Autor: Dirk F. (sensornix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Welchen PIC? Welcher Timer? Was misst du? Was sollte herauskommen?
Has du dir mal die Errata-Sheets angesehen, ob der Timer auch so
tut wie im Datenbaltt angegeben?

Grüße SensorNix

Autor: Chris H. (xkris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also ich benutze den PIC18F458.Ich habe RB5 über einen 4.7k pullup auf 
+5V liegen. RB5 ist verbunden mit RB1/INT1 welcher als Interrupt Pin 
konfiguriert ist. In periodischen Abständen schalte ich RB5 auf Input 
low, ziehe somit das Signal an RB1 ebenfalls auf low. Dieses Ereignis 
soll den Timer starten. Wenn RB5 nach einer gewissen Zeit wieder auf 
Eingang geschaltet wird, also hochohmig, liegen an RB1 und RB5 wieder 
5V, dann reagiert der Interrupt wieder auf dieses Ereignis und der Timer 
wird angehalten und der Wert ausgelesen.

if(INTCON3bits.INT1IF)   //INT1 has occurred
  {
    INTCON3bits.INT1IF = 0;   //***bit0***  clear INT1 interrupt flag
    T0CONbits.TMR0ON = !T0CONbits.TMR0ON;   // ***bit7*** toggle timer start/stop bit
    if (!T0CONbits.TMR0ON)   // if timer has just been stopped...
    {
      timer_value=TMR0L+(TMR0H*0x100);  //writes timer value to variable
      TMR0L=0x00;   //clears timer registers
      TMR0H=0x00;
      INTCON2bits.INTEDG1 = 0;  //set INT1 for stopping on falling edge
    }
    else
    {
      INTCON2bits.INTEDG1 = 1;  //set INT1 for stopping on rising edge
    }
    
  }

Das seltsame ist, wenn ich mir den Inhalt des Timer Registers nach
TMR0L=0x00;
TMR0H=0x00; 

anzeigen lassen, stelle ich fest, dass TMR0H sich davon nicht 
beeindrucken läßt. Es behält seinen Wert. TMR0L hingegen hat 
anschliessend 0x00, so wie ich es eigentlich auch erwarte.

Autor: Dirk F. (sensornix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muß nicht erst das High Byte und anschießend das Low Byte geschrieben 
weden?

Autor: Dirk F. (sensornix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Datenblatt Abschnitt 11.4

timer_value=TMR0L+(TMR0H*0x100);

könnte auch Probleme machen.
Wird der Ausdruck von vorne oder von hinten abgearbeitet?

Autor: Chris H. (xkris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast Recht, das war der Grund für Problem

Danke nochmals

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.