TobiasBlome
27.10.2007, 22:22
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?
'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
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?
'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