Moin.
Hab ein kleines Problem mit dem angehängten Programm.
Der Pin INT0 (PD2) wird mit einem 4,7k-Widerstand auf Masse gezogen; Impuls ist ein 5V-Puls.
Kurze Beschreibung:
Das Programm ist ein Drehzahlmesser, der aus den Impulsen der Zündspule die Drehzahl errechnen und auf einem 4stelligen 7-Seg. Display anzeigen soll.
Nach dem Selbsttest, bei dem nacheinander alle Segmente einzeln durchlaufen, soll die Zeit zwischen 2 Impulsen gemessen werden. Dieser Abstand wird dann in die Drehzahl umgerechnet. Läuft der Timer über (Motor steht, Drehzahl zu langsam), dann soll auf dem Display "----" erscheinen. Ansonsten die 4-stellige Drehzahl mit evtl führenden Nullen.
Ohne Impuls erscheint nach dem Selbsttest auch die "----"
Bei Eingang eines Impulses startet der AVR aber neu.
Stimmt da Softwaretechnisch was nicht?
MfG
Code:
Code:$regfile = "m8def.dat" $crystal = 8000000 '$prog &HFF , &HE1 , &HD9 , &H00 $framesize = 32 $swstack = 32 $hwstack = 32 '7 Segmente Config Pinc.5 = Output : Ledsega Alias Portc.5 Config Pinc.4 = Output : Ledsegb Alias Portc.4 Config Pinc.3 = Output : Ledsegc Alias Portc.3 Config Pinc.2 = Output : Ledsegd Alias Portc.2 Config Pinc.1 = Output : Ledsege Alias Portc.1 Config Pinc.0 = Output : Ledsegf Alias Portc.0 Config Pinb.5 = Output : Ledsegg Alias Portb.5 'Segmentauswahl Config Pind.5 = Output : Z1 Alias Portd.5 Config Pind.6 = Output : Z2 Alias Portd.6 Config Pind.7 = Output : Z3 Alias Portd.7 Config Pinb.0 = Output : Z4 Alias Portb.0 'Timer-Config Enable Interrupts Config Timer1 = Timer , Prescale = 8 On Timer1 Isrtimer1 Timer1 = 0 Enable Timer1 'Interrupt Config Int0 = Rising Enable Int0 On Int0 Isrint0 'Variablen & Subs Declare Sub Getsegs Dim Ledchar As String * 1 Dim Char1 As String * 1 Dim Char2 As String * 1 Dim Char3 As String * 1 Dim Char4 As String * 1 Dim Sega As Bit Dim Segb As Bit Dim Segc As Bit Dim Segd As Bit Dim Sege As Bit Dim Segf As Bit Dim Segg As Bit Dim Ziffer As Word Dim Ledstring As String * 4 Dim Messbeginn As Long Dim Messende As Long Dim Taktdauer As Long Dim Drehzahl As Double 'Hier Selbsttest; aus Übersichtlichkeitsgründen rausgenommen Do Char1 = Mid(ledstring , 1 , 1) Char2 = Mid(ledstring , 2 , 1) Char3 = Mid(ledstring , 3 , 1) Char4 = Mid(ledstring , 4 , 1) For Ziffer = 1 To 4 If Ziffer = 1 Then Z1 = 1 : Z2 = 0 : Z3 = 0 : Z4 = 0 Ledchar = Char1 End If If Ziffer = 2 Then Z1 = 0 : Z2 = 1 : Z3 = 0 : Z4 = 0 Ledchar = Char2 End If If Ziffer = 3 Then Z1 = 0 : Z2 = 0 : Z3 = 1 : Z4 = 0 Ledchar = Char3 End If If Ziffer = 4 Then Z1 = 0 : Z2 = 0 : Z3 = 0 : Z4 = 1 Ledchar = Char4 End If Getsegs If Sega = 1 Then Ledsega = 1 : Waitms 1 : Ledsega = 0 : End If If Segb = 1 Then Ledsegb = 1 : Waitms 1 : Ledsegb = 0 : End If If Segc = 1 Then Ledsegc = 1 : Waitms 1 : Ledsegc = 0 : End If If Segd = 1 Then Ledsegd = 1 : Waitms 1 : Ledsegd = 0 : End If If Sege = 1 Then Ledsege = 1 : Waitms 1 : Ledsege = 0 : End If If Segf = 1 Then Ledsegf = 1 : Waitms 1 : Ledsegf = 0 : End If If Segg = 1 Then Ledsegg = 1 : Waitms 1 : Ledsegg = 0 : End If Next Loop Sub Getsegs Select Case Ledchar Case "0" Sega = 1 : Segb = 1 : Segc = 1 : Segd = 1 : Sege = 1 : Segf = 1 : Segg = 0 Case "1" Sega = 0 : Segb = 1 : Segc = 1 : Segd = 0 : Sege = 0 : Segf = 0 : Segg = 0 Case "2" Sega = 1 : Segb = 1 : Segc = 0 : Segd = 1 : Sege = 1 : Segf = 0 : Segg = 1 Case "3" Sega = 1 : Segb = 1 : Segc = 1 : Segd = 1 : Sege = 0 : Segf = 0 : Segg = 1 Case "4" Sega = 0 : Segb = 1 : Segc = 1 : Segd = 0 : Sege = 0 : Segf = 1 : Segg = 1 Case "5" Sega = 1 : Segb = 0 : Segc = 1 : Segd = 1 : Sege = 0 : Segf = 1 : Segg = 1 Case "6" Sega = 1 : Segb = 0 : Segc = 1 : Segd = 1 : Sege = 1 : Segf = 1 : Segg = 1 Case "7" Sega = 1 : Segb = 1 : Segc = 1 : Segd = 0 : Sege = 0 : Segf = 0 : Segg = 0 Case "8" Sega = 1 : Segb = 1 : Segc = 1 : Segd = 1 : Sege = 1 : Segf = 1 : Segg = 1 Case "9" Sega = 1 : Segb = 1 : Segc = 1 : Segd = 1 : Sege = 0 : Segf = 1 : Segg = 1 Case "-" Sega = 0 : Segb = 0 : Segc = 0 : Segd = 0 : Sege = 0 : Segf = 0 : Segg = 1 Case "B" ' = Blank Sega = 0 : Segb = 0 : Segc = 0 : Segd = 0 : Sege = 0 : Segf = 0 : Segg = 0 Case "L" Sega = 0 : Segb = 0 : Segc = 0 : Segd = 1 : Sege = 1 : Segf = 1 : Segg = 0 Case "o" Sega = 0 : Segb = 0 : Segc = 1 : Segd = 1 : Sege = 1 : Segf = 0 : Segg = 1 End Select End Sub Isrint0: Messende = Timer1 Taktdauer = Messende - Messbeginn Drehzahl = 30 / Taktdauer ' 2 Takte pro Umdrehung Drehzahl = Fix(drehzahl) Ledstring = Str(drehzahl) 'Länge auf 4 Zeichen anpassen If Len(ledstring) = 1 Then Ledstring = "000" + Ledstring If Len(ledstring) = 2 Then Ledstring = "00" + Ledstring If Len(ledstring) = 3 Then Ledstring = "0" + Ledstring If Len(ledstring) > 4 Then Ledstring = Right(ledstring , 4) Timer1 = 0 Messbeginn = Timer1 Return Isrtimer1: 'Bei Überlauf (= Motor steht) Display auf "----" Ledstring = "----" Return End







 
			
			 
					
					
					
						 Zitieren
Zitieren


Lesezeichen