Hallo, da bin ich wiederDie Hardware hab´ ich geändert und nun kann ich jedes Segment auf jeder Anzeige einzeld ansteuern
![]()
leider musste ich die Ausgänge etwas anders belegen und nun flimmern alle Anzeigen wild durcheinander.
im Original wurden alle 5 anzeigen nacheinander durchgewechselt bzw. die Variable hochgezählt: For Zaehler = 1 To 5 ABER ich musste PD0,PD4,PD5,PD6 belegen - also eine große Lücke - kann mir jemand helfen wie ich den Zähler auch so zählen lassen kann? Also 0-6 aber ohne 1, 2 und 3 jemand eine Idee?
Tobias
Code:'Drehzahlmesser für 4-Zylinder Motoren ' (c) formtapez (Oktober 2003) ' 5-stellige Version (ungetestet) ' Hardware: ' --------- ' PD0: gelbe LED (ab 6250 Umdr./min.) ' PD6: Signaleingang ' PB0-PB6: 7-segment - Segment A bis G ' PD1-PD5: 7-segment - Ziffer - Select 'ICH Led1=PD0, L2=PD4, L3=PD5, L4=PD6 $regfile = "ATtiny2313.dat" 'AT90S2313 $crystal = 20000000 '8MHz Quarz Ddrb = &B11111111 'PortB = Ausgang Ddrd = &B1110011 'PortD = Ausgang bis auf PD3+2 Dim Icount As Long At &H60 Dim Wcountlo As Word At &H60 Overlay Dim Wcounthi As Word At &H62 Overlay Dim Temp As Integer At &H80 Dim Temp2 As Integer At &H80 Overlay Dim Y As String * 5 At &H70 Dim Z(5) As Byte At &H70 Overlay Dim Frequenz As Long Dim Freq As Word Dim Freq1 As Word Dim Freq2 As Word Dim Timeout As Byte Dim Impulse As Byte Dim X(5) As Byte Dim Test As Integer Dim Test2 As Integer Dim Zaehler As Byte 'für LED Anzeige wählen... Timeout = 0 On Icp1 Oncapture On Ovf1 Onoverflow Config Timer1 = Timer , Prescale = 64 , Capture Edge = Rising Enable Icp1 Enable Ovf1 Enable Interrupts '******************* '* Start-Animation * '******************* ' Do ' Portb = 1 ' Portd = 2 ' Waitms 50 ' Portd = 4 ' Waitms 50 ' Portd = 8 ' Waitms 50 ' Portd = 16 ' Waitms 50 ' Portb = 2 ' Waitms 50 ' Portb = 64 ' Waitms 50 ' Portd = 8 ' Waitms 50 ' Portd = 4 ' Waitms 50 ' Portd = 2 ' Waitms 50 ' Portb = 16 ' Waitms 50 ' Portb = 8 ' Waitms 50 ' Portd = 4 ' Waitms 50 ' Portd = 8 ' Waitms 50 ' Portd = 16 ' Waitms 50 ' Portb = 4 ' Waitms 50 ' Portb = 64 ' Waitms 50 ' Portd = 8 ' Waitms 50 ' Portd = 4 ' Waitms 50 ' Portd = 2 ' Waitms 50 ' Portb = 32 ' Waitms 50 ' Loop Until Portb = 32 'läuft nur 1x durch 'Temp2 = 1 'Bis zum 1. Impuls '****************************************** '* Hauptschleife - LED-Anzeigen ansteuern * '****************************************** Main: Incr Timeout 'Bei Timeout: 0 U/min. If Timeout = 10 Then Timeout = 10 Freq = 0 Y = Str(freq) Z(1) = 0 Z(2) = 0 Z(3) = 0 Z(4) = 0 Z(5) = 48 End If For Test2 = 1 To 5 'Wert sichern ..... X(test2) = Z(test2) Next Test2 For Test2 = 1 To 400 '..... und 400 mal Anzeigen For Zaehler = 0 To 6 Test = X(zaehler) Select Case Test Case 48 : Portb = 63 Case 49 : Portb = 6 Case 50 : Portb = 91 Case 51 : Portb = 79 Case 52 : Portb = 102 Case 53 : Portb = 109 Case 54 : Portb = 125 Case 55 : Portb = 39 Case 56 : Portb = 127 Case 57 : Portb = 111 Case Else : Portb = 0 End Select 'Anzeige auswählen??? Portd.zaehler = 1 Waitus 100 'Zeit für jede Anzeige Portd.zaehler = 0 Next Zaehler Next Test2 Goto Main '************************************* '* Interrupt-Routine (Zeiten messen) * '* (wird bei jedem Impuls ausgelöst) * '************************************* Oncapture: Disable Icp1 Incr Impulse If Impulse = 8 Then Impulse = 0 Timeout = 0 Wcountlo = Timer1 Timer1 = 46000 'Frequenz = 240000000 / Icount 'Umrechnung für 4-Zylinder Wcounthi = 0 Freq2 = Freq1 Freq1 = Frequenz Frequenz = Freq1 + Freq2 Frequenz = Frequenz / 2 Freq = Frequenz 'If Freq > 5999 Then Portd.0 = 1 Else Portd.0 = 0 ' gelbe LED ab 6000 U/min If Freq < 150 Then Freq = 0 Y = Str(freq) Z(1) = 0 Z(2) = 0 Z(3) = 0 Z(4) = 0 Z(5) = 48 Else Y = Str(freq) If Z(4) = 0 Then 'Führende Nullen eliminieren Do Z(5) = Z(4) Z(4) = Z(3) Z(3) = Z(2) Z(2) = Z(1) Z(1) = 0 Loop Until Z(5) > 0 End If End If End If Temp = 1 Enable Icp1 Return Onoverflow: Incr Wcounthi Return







Zitieren
Lesezeichen