I3: Die Dauer zwischen zwei Impulsen des Hallensers in ms wird bestimmt
allg. Überlegungen
in der Timerinterruptroutine wird der Zähler Impulsdauer hochgezählt
in der Interruptroutine des extInt0 wird die Variable ausgewertet
Impulsdauer sollte global deklariert sein
bei 1 km/h -> ungefähr 8 s zwischen zwei Radimpulsen -> 8s entsprechen 8000 gezählten Impulsen
Variable Impulsdauer muss ein unsigned int sein -> 16 Bit Wert -> 0...65535 -> bis zu 65 s zwischen zwei Impulsen auflösbar auf 1 ms
der Algorithmus der Zeitdauerbestimmung zwischen zwei Impulsen ist prinzipiell folgendermaßen aufgebaut
Variante 1:
die Variable impulsdauer wird als unsigned long deklariert und ist damit 32 Bit lang. Sie zählt ungefähr 22 Bit Sekunden, was ca. 4 Mio Sekunden, also 1000 h, entsprechend 40 Tage zählt. Damit kann die Variable impulsdauer als Tripdauer aufgefasst werden.
in der externen Interruptroutine wird die impulsdauer gelesen und zu impalt die Differenz gebildet. Anschließend wird impalt=impdauer gesetzt.
teilt man die Differenz durch 1000, so hat man den ganzzahligen Zeitanteil in Sekunden und kann den z.B. über Port 3 binär anzeigen.
Variante 2:
die Impulsdauer wird nur gelesen und dann immer wieder rückgesetzt auf 0
das ist einfach, man kann aber die Tripdauer nicht mehr bestimmen...
der Algorithmus der Zeitdauerbestimmung zwischen zwei Impulsen wird folgendermaßen auf dem µC umgesetzt
entscheiden Sie sich für eine Variante und implementieren Sie diese in DAVE Bench
es muss die impulsdauer global deklariert werden weil sie im Timer 0 Interrupt inkrementiert und im externen Interrupt ext0 gelesen wird.
globale Variablen sollten in main.c in der 'Global Variables'-Section mit "typ name=Vorinitialisierung;" deklariert werden und in den C-Sourcen, in denen sie genutzt werden unter 'imported global Variables' mit "extern typ name;" verfügbar gemacht werden.
kontrollieren der Impulsdauer auch wieder über den logic analyzer. Impulsdauer im LA bestimmen und mit Variable impulsdauer vergleichen...