so der Testaufbau mit Laserlichtschranken ist fertig

ich benutze 2 1mW Laserpointer und zwei Empfänger vom goßen "C" (Bausatz 117420).

leider erkennen die Lichtschranken bei zu großer Geschwindigkeit nichts mehr... Muss ich mir mal den Schaltplan ansehen, ob man da etwas an der Geschwindigkeit machen kann...

Hier erst mal mein fertiger Code mit 7Seg.Anzeige:

Code:
'7 Segmentanzeige im multiplexbetrieb mit 2 Laserlichtschranken an PIN 4 (INT0) & PIN 5 (INT1)
' für die Anzeige wird ein kompletter Port (0-7 = 7Seg+DP) benötigt
' für Anzeigen mit gemeinsamer Anode
'
' Anschlüsse:
' -----------
'                           7 Segmente = PB 0 - PB 7 (PB0=DP)
'                           4 Anzeigen = PC 4 - PC 1 (4 Anzeigen / 4 Transistoren)
'Z                          5 Anzeigen = PC 5 - PC 1 (5 Anzeigen) PC5 = Einerstelle ganz rechts!!!!
'e
'i
'c
'h
'e
'n     PORTB.X
'||7|6|5|4|3|2|1|0 |Dezimal
'| _________________
'||G|F|E|D|C|B|A|DP| \/
'0| |X|X|X|X|X|X|  |126
'1| | | | |X|X| |  | 12
'2|X| |X|X| |X|X|  |182
'3|X| | |X|X|X|X|  |158
'4|X|X| | |X|X| |  |204
'5|X|X| |X|X| |X|  |218
'6|X|X|X|X|X| |X|  |250
'7| | | | |X|X|X|  | 14
'8|X|X|X|X|X|X|X|  |254
'9|X|X| |X|X|X|X|  |222
'______________________
'=|X| | |X| | |X|  |146 (drei waagerechte Striche)
'F|X|X|X| | | |X|  |226
'-|X| | | | | | |  |128
'
'weitere mögliche Buchstaben:
'A-B-C-D-E-F-G-H-I-J-L-O-P-R-S-U
'
'
'
'ZEITMESSUNG FUNKTIONIERT
'kurze Beschreibung:
'Die 1te Lichtschranke setzt den Timer1 auf 0.
'Die 2te Lichtschranke schreibt den Wert vom Timer1 in eine Variable.
'Da die Lichtschranken einen festen Abstand von 30cm haben,
'kann in der Do...Loop in KM/h umgerechnet werden. Die beiden Lichtschranken
'zählen eine Variable(SPERRE) hoch, um versehentliches doppelt betätigen
'einer Lichtschranke zu verhindern. Wenn der Timer1 nach ca 2,2 Sekunden Überläuft,
'wird die Variable zurückgesetzt um für eine neue Messung bereit zu sein.
'LED an = Messung bereit. LED aus = SPERRE aktiv


'RECHNUNG ms:
'8MHz / Teiler 256 = 31250 Schritte / Sec oder / 1000ms
'1Schritt = 0,032ms
'Also x Schritte * 0,032ms  = ms

'RECHNUNG KM/h:
'0,0003*3600000/100ms=10,8KM/h
'3*360/100ms=10,8KM/h
'1080/100ms=10,8KM/h

'ZUSAMMEN:
'1080/0,032/Schritte = KM/h
'33750/Schritte = KM/h
'
'337500 eine NULL mehr um das Komma zu verschieben!!!
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------


$regfile = "m8def.dat"                                      'AT-Mega8

$hwstack = 32
$swstack = 8
$framesize = 24

$crystal = 8000000                                          'Quarz: 8 MHz
'$baud = 9600                                                'Baudrate der UART: 9600 Baud
'-------------------------------------------------------------------------------
''Konfiguration LCD
'Config Lcd = 20 * 4
'Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.0 , Rs = Portd.1
'Cursor Off Noblink

'-------------------------------------------------------------------------------
'Konfiguration Ein- / Ausgänge
Ddrb = &B11111111                                           '1 Ausgang, 0 Eingang => Pin PB7-0 als Ausgang
Ddrc = &B1111110                                            '1 Ausgang, 0 Eingang => Pin PC6-1 als Ausgang; 0 als Eingang
Ddrd = &B11110011                                           '1 Ausgang, 0 Eingang => Pin PD7-4,1&0 als Ausgang; 2&3 als Eingang

'Pullup´s
Portd = &B0001100                                           'PullUp von Pin PD2&3 aktivieren


'-------------------------------------------------------------------------------
'Konfiguration Timer0 für 7 Segmentanzeige, Taster
Config Timer0 = Timer , Prescale = 1024
On Timer0 Timer0_isr
Const Timervorgabe0 = 245                                   '781 mal / Sekunde!!!
Enable Timer0
Enable Interrupts


'-------------------------------------------------------------------------------
'TIMER1 Konfiguration für Messzeit Lichtschranke:
Config Timer1 = Timer , Prescale = 256                      'Teiler
Enable Timer1
Enable Interrupts
On Timer1 Errorhandler
Enable Interrupts

'-------------------------------------------------------------------------------
Config Int0 = Rising                                        'Falling                                       'wechsel von High auf Low
Config Int1 = Rising                                        'Falling                                       'wechsel von High auf Low
Enable Int0
Enable Int1
On Int0 Isr0
On Int1 Isr1

'-------------------------------------------------------------------------------
'Alias
Led Alias Portc.6                                           'Status LED  -  1=bereit

'-------------------------------------------------------------------------------
'Variablen Anzeige:



'Variablen für die 7Seg. routine
Dim Wertstr As String * 5
Dim Y As Byte
Dim Tempbyte As Byte

Dim Digit As Byte                                           'Variable für Digitansteuerung

Dim Fivedigitdisplay As String * 5                          'Anzeige im Ganzen

'führende Nullen entfernen
Dim Digit_aus As Bit                                        'Merker =0 wenn Stelle =0


'KM/h Messung / Rechnung:
Dim Schritte As Word                                        'Wert vom Timer
Dim Schritte_old As Word
Dim Kmh As Long                                             'Single
Dim Sperre As Byte                                          '1= gesperrt, wenn Lichtschranke 1 betätigt wurde
                                                             '2= gesperrt, wenn Lichtschranke 2 betätigt wurde


'Dim Lcdmerker As Word                                       'lcd anzeigen

'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Setzen:

Digit_aus = 0

'alle Segmente aus
Portb = 0
Digit = 0


'===============================================================================
Do
'===============================================================================
If Schritte_old = Schritte Then                             'Vergleich, ob neuer Messwert vorhanden oder nicht
'nix
Else
Kmh = 337500 / Schritte                                     'Timerwert in KM/h umrechnen
'Print "Geschwindigkeit: " ; Fusing(kmh , "###.#" ) ; " KM/h"
Schritte_old = Schritte
'Lcdmerker = 1
End If

'Anzeige Messung BEREIT
If Sperre = 0 Then
Led = 1                                                     'es kann gemessen werden
Else
Led = 0                                                     'es kann nicht gemessen werden
End If


''Wert auf LCD ausgeben
'If Lcdmerker = 1 Then
'Cls
'Locate 1 , 1
'Lcd Kmh ; " KM/h:"
'Lcdmerker = 0
'End If

Loop




'-------------------------------------------------------------------------------
'===============================================================================
'-------------------------------------------------------------------------------
'Sprungmarken
'-------------------------------------------------------------------------------
'===============================================================================
'-------------------------------------------------------------------------------


'-------------------------------------------------------------------------------
'ISR für Lichtschranken
'-------------------------------------------------------------------------------
Isr0:                                                       'Aufruf bei Lichtschranke 1 per Interrupt
If Sperre = 0 Then
 Timer1 = 0                                                 'Timer auf 0 setzen
 Sperre = 1                                                 'für Lichtschranke 1 sperren
 Portb = 0                                                  'alle Segmente aus
 Stop Timer0
 End If
 'Print "int0 geht"                                          'nur zum testen
Return



Isr1:                                                       'Aufruf bei Lichtschranke 2 per Interrupt
If Sperre = 1 Then
 Schritte = Timer1                                          'Timerwert übernehmen
 Sperre = 2                                                 'für Lichtschranke 1 UND 2 sperren damit Auto wirklich komplett durchgefahren ist
 Start Timer0
End If
 'Print "int1 geht"                                          'nur zum testen
Return



Errorhandler:                                               'wenn Timer1 überläuft
 Sperre = 0                                                 'nächste Messung freigeben
 'Print "ÜBERLAUF"                                           'nur zum testen
Return

'-------------------------------------------------------------------------------
Timer0_isr:                                                 'Timer0-Interruptroutine  (312 x pro Sekunde)
'-------------------------------------------------------------------------------
  Timer0 = Timervorgabe0
  'If Sperre = 0 Then
  Gosub 7seganzeige                                         'Routine für 7 Segmentanzeige
  'End If
  Return




'-------------------------------------------------------------------------------
7seganzeige:
' Code 7 Segmentanzeige:
'-------------------------------------------------------------------------------



   'Formatiere das Display
   Wertstr = Str(kmh)
   Fivedigitdisplay = Format(wertstr , "   00")             'Nullen geben die Anzahl der Stellen an, damit die Stellen richtig gesetzt werden


   ' jeder Lauf durch die Hauptschleife zeigt ein anderes Digit
   Incr Digit

   Portb = 0                                                'Ghosting vermeiden
    If Digit = 5 Then                                       'mache das , bis 5 erreicht ist
   Digit = 0

   End If

   ' addiere 1 zum Digitcounter, weil MID 1-basiert ist
   Y = Digit + 1
   ' und hol das Digit, das wir brauchen
   Wertstr = Mid(fivedigitdisplay , Y , 1)


   'Anzeige auswählen
   Tempbyte = 2 ^ Digit                                     'Tempbyte = 1,2,4,8,16

   'Digitansteuerung auf portC: PC1-5
    Portc = Tempbyte * 2                                    'Umdreh   = 2,4,8,16,32




'Führende Nullen entfernen:




 'Dieser Teil erledigt die Wandlung in 7 Segment Code

 'Für Anzeigen mit gemeinsamer Anode
  Select Case Wertstr

           Case "0" : Portb = 126                           'NULL
           Case "1" : Portb = 12                            'EINS
           Case "2" : Portb = 182                           'ZWEI
           Case "3" : Portb = 158                           'DREI
           Case "4" : Portb = 204                           'VIER
           Case "5" : Portb = 218                           'FÜNF
           Case "6" : Portb = 250                           'SECHS
           Case "7" : Portb = 14                            'SIEBEN
           Case "8" : Portb = 254                           'ACHT
           Case "9" : Portb = 222                           'NEUN
           Case " " : Portb = 0                             'nichts - kein Segment
          'Case Else : Portb = 128                           'mittleres Segment
           Case Else : Portb = 226                          '"F"
  End Select





  'Komma setzen
  'If Portc = 2 Then Portb.0 = 1                             '4 Kommastellen
  'If Portc = 4 Then Portb.0 = 1                             '3 Kommastellen
  'If Portc = 8 Then Portb.0 = 1                             '2 Kommastellen
  If Portc = 16 Then Portb.0 = 1                            '1 Kommastelle