Hi,
also in diesem Beispiel ist die Zeile mit dem Enable Interrupts auskommentiert, dann kann das nicht gehen !
Hallo,
ich möchte die Zeit zwischen Interrupt0 und Interrupt1 messen. Wenn bei Int0 ein high Signal kommt soll der Timer1 gestartet werden und wenn high bei Interrupt2 kommt soll der Timer gestoppt werden. Aber irgendwie reagiert das Programm nicht auf die Interrupts. Weiß jemand warum?
Code:'7Segmentanzeige mit 5 (oder 4) Anzeigen $regfile = "ATtiny2313.dat" 'ATTiny2313 $crystal = 18432000 '18,4320MHz Quarz $hwstack = 64 ' default use 32 for the hardware stack $swstack = 64 ' default use 10 for the SW stack '_______________________________________________________________________________ Ddrb = &B11111111 'PortB = Ausgang (PB0=A usw.) Ddrd = &B1110011 'PortD = Ausgang (PD0=Anzeige1, PD4=A2, PD5=A3, PD6=A4) PD2/3 =INT Config Int0 = Rising 'Falling 'wechsel von High auf Low Config Int1 = Rising 'Falling 'wechsel von High auf Low Enable Int0 Enable Int1 '_______________________________________________________________________________ Dim Anzeige_akt As Word 'Aktuelle Zeitmessung Dim Anzeige_str As String * 5 'Zeit als String Dim Anzeige_str_len As Byte 'String-Länge Dim Anzeige_ziffer As String * 1 'Aktuelle Ziffer Dim Anzeige_pos As Byte 'Aktuelle Ziffer im String Dim I As Byte 'Allgem. Laufzahl I = 1 Dim Zeit As Single 'gemessene Zeit von Timer1 Dim Kmh As Single 'Geschwindigkeit '_______________________________________________________________________________ 'TIMER0 Konfiguration für Ziffernwechsel: Config Timer0 = Timer , Prescale = 256 ' Timer0 für Anzeige Const T0_preload = &H70 ' Startwert Timer0 für 500Hz Tcnt0 = T0_preload On Timer0 Timer_irq_led ' Timer0-Overflow-Interrupt Enable Timer0 ' Timer0 starten Sreg.7 = 1 'Globale Interruptfreigabe '_______________________________________________________________________________ 'TIMER1 Konfiguration für Messzeit: Config Timer1 = Timer , Prescale = 1024 Const Timervorgabe = 0 '29535 -> 0,5 Hz On Timer1 Timer_irq_kmh 'Unteprogramm aufrufen 'Enable Interrupts '_______________________________________________________________________________ Do ' Dauerschleife als Hauptprogramm Waitms 250 Anzeige_akt = Timer1 'Zeit 'Wert zum anzeigen Loop '_______________________________________________________________________________ Timer_irq_led: Tcnt0 = T0_preload 'Timer wieder laden Anzeige_str = Str(anzeige_akt) ' Wert in String umwandeln Anzeige_str_len = Len(anzeige_str) ' Stringlänge messen Anzeige_pos = Anzeige_str_len - I Anzeige_pos = Anzeige_pos + 1 Anzeige_ziffer = Mid(anzeige_str , Anzeige_pos , 1) Portd = 0 'Ghosting vermeiden Select Case Anzeige_ziffer 'Ziffer auf Port Case "0" : Portb = 63 'NULL Case "1" : Portb = 6 'EINS Case "2" : Portb = 91 'ZWEI Case "3" : Portb = 79 'DREI Case "4" : Portb = 102 'VIER Case "5" : Portb = 109 'FÜNF Case "6" : Portb = 125 'SECHS Case "7" : Portb = 7 'SIEBEN Case "8" : Portb = 127 'ACHT Case "9" : Portb = 111 'NEUN Case Else : Portb = 0 End Select 'Segment wählen If I = 1 Then Portd.0 = 1 'EINER 'If I = 2 Then Portd.1 = 1 'ZEHNER If I = 2 Then Portd.4 = 1 'HUNDERTER 'Portb.7 = 1 'Kommastelle End If If I = 3 Then Portd.5 = 1 'TAUSENDER If I = 4 Then Portd.6 = 1 'ZEHNTAUSENDER I = I + 1 'Nächste Ziffer If I >= 6 Then I = 1 'max Anzeigen angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden) Return Irq0: 'Aufruf bei Lichtschranke 1 per Interrupt Timer1 = 0 'Timer auf 0 setzen Start Timer1 'Timer starten Portb.7 = 1 Return Irq1: 'Aufruf bei Lichtschranke 2 per Interrupt Stop Timer1 'Timer stoppen 'Zeit = Timer1 Portb.7 = 0 Return Timer_irq_kmh: 'Aufruf jede oder jede halbe Sekunde Timer1 = Timervorgabe 'AUF TIMER EINSTELLUNG ACHTEN!!!!!!! Return
...
Hi,
also in diesem Beispiel ist die Zeile mit dem Enable Interrupts auskommentiert, dann kann das nicht gehen !
Hallo TobiasBlome,
du hast vergessen, anzugeben was passieren soll:
On Int0 Irq0
On Int1 Irq1
Enable Interrupts muß vermutlich auch ausgeklammert werden
Gruß, Michael
Hallo und vielen Dank!
Enable Interrupts hab ich jetzt benutzt und On Int0 Irq0
On Int1 Irq1 steht auch drinn! Ergebnis es funktioniert!
aber was meins tdu mit:
Enable Interrupts muß vermutlich auch ausgeklammert werden. Wie ausklammern?
Tobias
...
Tja dank euch funktioniert Teil 1 von meinem Programm - aber mal von vorne:
Also ich möchte eine Geschwindigkeit mit zwei Lichtschranken messen. Abstand 30cm und jede löst einen Interrupt aus(INT0 und INT1). Wenn INT0 kommt wird Timer1 gestartet. Nun möchte ich zählen wie oft Timer1 überläuft bis INT1 den Timer stoppt.
Irgendwie klappt das zählen vom Timerüberlauf nicht.
Kann mir jemand sagen warum und ob meine Vorgehensweise im Prinzip richtig ist?
Tobias
Code:'7Segmentanzeige mit 5 (oder 4) Anzeigen $regfile = "ATtiny2313.dat" 'ATTiny2313 $crystal = 18432000 '18,4320MHz Quarz $hwstack = 64 ' default use 32 for the hardware stack $swstack = 64 ' default use 10 for the SW stack '$baud = 9600 '_______________________________________________________________________________ Ddrb = &B11111111 'PortB = Ausgang (PB0=A usw.) Ddrd = &B1110011 'PortD = Ausgang (PD0=Anzeige1, PD4=A2, PD5=A3, PD6=A4) PD2/3 =INT Config Int0 = Rising 'Falling 'wechsel von High auf Low Config Int1 = Rising 'Falling 'wechsel von High auf Low Enable Int0 Enable Int1 On Int0 Irq0 On Int1 Irq1 '_______________________________________________________________________________ Dim Anzeige_akt As Word 'Aktuelle Zeitmessung Dim Anzeige_str As String * 5 'Zeit als String Dim Anzeige_str_len As Byte 'String-Länge Dim Anzeige_ziffer As String * 1 'Aktuelle Ziffer Dim Anzeige_pos As Byte 'Aktuelle Ziffer im String Dim I As Byte 'Allgem. Laufzahl I = 1 Dim T1ueberlauf As Single 'gemessene Zeit von Timer1 Dim Kmh As Single 'Geschwindigkeit '_______________________________________________________________________________ 'TIMER0 Konfiguration für Ziffernwechsel: Config Timer0 = Timer , Prescale = 256 ' Timer0 für Anzeige Const T0_preload = &H70 ' Startwert Timer0 für 500Hz Tcnt0 = T0_preload On Timer0 Timer_irq_led ' Timer0-Overflow-Interrupt Enable Timer0 ' Timer0 starten Sreg.7 = 1 'Globale Interruptfreigabe '_______________________________________________________________________________ 'TIMER1 Konfiguration für Messzeit Lichtschranke: Config Timer1 = Timer , Prescale = 1024 Const Timervorgabe = 0 '29535 -> 0,5 Hz On Timer1 Timer_irq_kmh 'Unteprogramm aufrufen Stop Timer1 Enable Interrupts '_______________________________________________________________________________ T1ueberlauf = 0 'Timer1Zähler auf 0 setzen Do ' Dauerschleife als Hauptprogramm 'Waitms 250 Anzeige_akt = T1ueberlauf 'Wert zum anzeigen Loop '_______________________________________________________________________________ Timer_irq_led: Tcnt0 = T0_preload 'Timer wieder laden Anzeige_str = Str(anzeige_akt) ' Wert in String umwandeln Anzeige_str_len = Len(anzeige_str) ' Stringlänge messen Anzeige_pos = Anzeige_str_len - I Anzeige_pos = Anzeige_pos + 1 Anzeige_ziffer = Mid(anzeige_str , Anzeige_pos , 1) Portd = 0 'Ghosting vermeiden Select Case Anzeige_ziffer 'Ziffer auf Port Case "0" : Portb = 63 'NULL Case "1" : Portb = 6 'EINS Case "2" : Portb = 91 'ZWEI Case "3" : Portb = 79 'DREI Case "4" : Portb = 102 'VIER Case "5" : Portb = 109 'FÜNF Case "6" : Portb = 125 'SECHS Case "7" : Portb = 7 'SIEBEN Case "8" : Portb = 127 'ACHT Case "9" : Portb = 111 'NEUN Case Else : Portb = 0 End Select 'Segment wählen If I = 1 Then Portd.0 = 1 'EINER 'If I = 2 Then Portd.1 = 1 'ZEHNER If I = 2 Then Portd.4 = 1 'HUNDERTER Portb.7 = 1 'Kommastelle End If If I = 3 Then Portd.5 = 1 'TAUSENDER If I = 4 Then Portd.6 = 1 'ZEHNTAUSENDER I = I + 1 'Nächste Ziffer If I >= 6 Then I = 1 'max Anzeigen angeben! damit Anzeige möglichst hell ist(bei 5Anzeigen muss bei der 6. wieder bei 1 Angefangen werden) Return Irq0: 'Aufruf bei Lichtschranke 1 per Interrupt Timer1 = 0 'Timer auf 0 setzen T1ueberlauf = 0 'Timer1Zähler auf 0 setzen Start Timer1 'Timer starten Return Irq1: 'Aufruf bei Lichtschranke 2 per Interrupt Stop Timer1 'Timer stoppen Return Timer_irq_kmh: 'Aufruf jede oder jede halbe Sekunde Timer1 = Timervorgabe 'AUF TIMER EINSTELLUNG ACHTEN!!!!!!! T1ueberlauf = T1ueberlauf + 1 'Timer1Zähler hoch zählen Return
...
Hallo TobiasBlome,
Im Int0 wird Timer1 gelöscht und von 0 gestartet.
Ungefähr jede Millisekunde beim Überlauf von Timer1 wird eine Variable hochgezählt, die erst bei Unterbrechung der 1. Lichtschranke wieder auf 0 gesetzt wird.
Im Int1 wird Timer1 gestoppt.
Wozu startest und löschst du Timer1 überhaupt? Du willst doch letztendlich die Takte zwischen beiden Ereignissen zählen?
Welche zu messende Geschwindigkeit erwartest du denn ungefähr?
Gruß, Michael
Hallo
also ich möchte ca. 10ms bis 1 sec messen und deswegen zähle ich wie oft der Timer überläuft. Deshalb wird der Timer auch einmalig mit der 1. Lichtschanke INT0 auf 0 gesetzt
Tobias
...
Hallo TobiasBlome,
ups, ich habe mich geirrt.Ungefähr jede Millisekunde beim Überlauf von Timer1
Timer1 wird ja mit 18432000/1024 = 18000 Hz getaktet
Ein Überlauf kommt dann alle 3,6 Sekunden.
Dein Timerinterrupt kommt also nicht in der erwarteten Zeit, deine Variable T1ueberlauf bleibt leer.
Gruß, MichaelWozu startest und löschst du Timer1 überhaupt? Du willst doch letztendlich die Takte zwischen beiden Ereignissen zählen?
ups
ich dachte der kommt 18000 mal pro sek....
das passt ja garnicht....
Eigendlich wollte ich den Timer mit INT0 Starten mit INT1 stoppen und dan die Zeit vom Timer ablesen. Weil ich dachte das dem 18000/sek durchläuft habe ich nur noch die Interrupts gezählt.
Wie würdest du das machen?
Tobias
...
aber... ist 18000Hz nicht = 18000 mal pro Sekunde
...
Lesezeichen