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





Zitieren

Lesezeichen