So, mein erster Entwurf. Musst evtl noch Fehler ausmerzen, habe gerade keine Zeit zum testen.
Du könntest mehr Reserve rausholen, wenn du nen schnelleren Quarz nimmst, die Baudrate erhöhst, den Code optimierst...
Code:
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600 'Baudrate der UART: 9600 Baud
'Config Timer1 = Timer , Prescale = 64
'On Timer1 Timer_irq
'Const Timervorgabe = 7936 ' Const 7936
Config Timer1 = Timer , Prescale = 8
On Timer1 Timer_irq
Const Timervorgabe = 54016
Ddrd = &B00000000
Ddrc = &B11111111
Portd = &B11111111
Dim Sek As Byte
Dim Sekunden As Byte
Dim P3 As Byte
Dim P4 As Byte
Dim A As Byte
Dim T0 As Long
Dim T1 As Long
Dim E1 As Long
Dim Durchl40 As Long
Declare Sub Durchlauf10s
Declare Sub Ledon
Declare Sub Main
Declare Sub Abfragen
Declare Sub Ende
Declare Sub Zler1
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output
Config Portd.2 = Input
Enable Timer1
Enable Interrupts
'Main:
Led1 Alias Portc.1
Summer Alias Portc.2
Laser Alias Portc.3
P3 Alias Pind.3
Eingang Alias Pind.2
'P4 Alias Pind.3
Main:
Sek = 0
'----------------------------------------------------------
'######## einschalten Portd.2 ####################
'----------------------------------------------------------
'Do
' Debounce Pind.2 , 0 , Abfragen , Sub 'Entprellt
'Loop
'----------------------------------------------------------
'######## Abfrage des Portd.3 ###################
'----------------------------------------------------------
Sub Abfragen()
Set Laser 'Portc.3 = 1
'A = 0
'Do
Zler1:
'Waitms 25
'P3 = Pind.3
If P3 = 0 Then
Set Led1 'Led An
' set summer ' Summer an Portc.2 an
A = A + 1
Print " A " ; A
If A = 8 Then
Gosub Ledon
End If
'Goto Zler1
Else
Reset Led1 'Led Aus
' reset summer ' Summer an Portc.2 aus
A = 0
End If
End Sub
'loop
'----------------------------------------------------------
'############ Led und Summer #############################
'----------------------------------------------------------
Ledon:
A = 0
T0 = 0
T1 = 0
Print "S" 'Senden ein S über RS232
Sekunden = 0 ' Sek auf 0 stellen dass die 10 S
'Do
'For I = 1 to 40
If Sekunden < 10 Then
Portc.0 = 1 'Led zeigt 10 Sek.an
' Print " " ; Sekunden ' Kontrolle der Skunden
Else
Portc.0 = 0 'Led wird aus geschaltet
' Sekunden = 0 'Sekunden werden auf 0 gestzt
Goto Ende
End If
'Print Pind.4 ; " " ' Kontrolle des Portsd.4
If P4 = 1 Then
' Print "0" 'Senden ein 0 über RS232
Portc.1 = 0 ' Led aus Portc.1
Portc.2 = 0 ' Summer an Portc.2 aus
T0 = T0 + 1
Print "0" ; " " ; T0
Else
' Print "1" 'Senden ein 1 über RS232
Portc.1 = 1 ' Led ein Portc.1
Portc.2 = 1 ' Summer an Portc.2 ein
T1 = T1 + 1
Print "1" ; " " ; T1
End If
Return
'Waitms 25 ' Abfrage alle 25 ms
'Loop
'Next I
'------------------------------------------------------------
'####### Ende ###############
'------------------------------------------------------------
Ende:
E1 = T0 + T1
Print "E" 'Senden ein E über RS232
Print " "
Print " "
Print " Treffer = " ; T1
Print " N.Treffer = " ; T0
Print " "
Print " Gesammt = " ; E1
Print " "
Print " Sekunde = " ; Sekunden
Print " "
Print " "
T0 = 0
T1 = 0
Sekunden = 0
Reset Led1 ' Led an Portc.1 aus
Reset Summer ' Summer aus Portc.2
Reset Summer ' Laser einschalten
Goto Main
'-------------------------------------------------------------
'########## Timer Skundenbasis #############################
'-------------------------------------------------------------
Timer_irq:
Timer1 = Timervorgabe
Sek = Sek + 1
If Sek = 40 Then
Incr Sekunden
Sek = 0
End If
Call Abfragen
If Sekunden = 10 Then
Sekunden = 0
Goto Ende
End If
return
End
Lesezeichen