Enterprise
09.06.2007, 14:15
Hallo Forum,
Ich möchte über einen Atmega8 3,686 Mhz getaktet.
Den Portd.3 alle 25ms abfragen ob dieser Port auf Masse liegt.
Dieses soll genau 10 Sekunden dauern.
Dann müsste ich ja 400 Werte bekommen, das ist nicht der Fall.
Ich bekomme mal 307,317,323,... Werte heraus nie die 400.
$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
Ddrd = &B00000000
Ddrc = &B11111111
Portd = &B11111111
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
Declare Sub Ledon
Declare Sub Main
Declare Sub Abfragen
Declare Sub Ende
Declare Sub Zler1
Enable Timer1
Enable Interrupts
Main:
'----------------------------------------------------------
'######## einschalten Portd.2 ####################
'----------------------------------------------------------
Do
Debounce Pind.2 , 0 , Abfragen , Sub 'Entprellt
Loop
'----------------------------------------------------------
'######## Abfrage des Portd.3 ###################
'----------------------------------------------------------
Abfragen:
Portc.3 = 1
A = 0
Do
Zler1:
Waitms 25
P3 = Pind.3
If P3 = 0 Then
Portc.1 = 1 'Led An
' Portc.2 = 1 ' Summer an Portc.2 an
A = A + 1
Print " A " ; A
If A = 8 Then
Goto Ledon
End If
Goto Zler1
Else
Portc.1 = 0 'Led Aus
' Portc.2 = 0 ' Summer an Portc.2 aus
A = 0
End If
Loop
'----------------------------------------------------------
'############ Led und Summer #############################
'----------------------------------------------------------
Ledon:
T0 = 0
T1 = 0
Print "S" 'Senden ein S über RS232
Sekunden = 0 ' Sek auf 0 stellen dass die 10 S
Do
If Sekunden < 1 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
P4 = Pind.3
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
Waitms 25 ' Abfrage alle 25 ms
Loop
'------------------------------------------------------------
'####### 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
Portc.1 = 0 ' Led an Portc.1 aus
Portc.2 = 0 ' Summer aus Portc.2
Portc.3 = 0 ' Laser einschalten
Goto Main
'-------------------------------------------------------------
'########## Timer Skundenbasis #############################
'-------------------------------------------------------------
Timer_irq:
Timer1 = Timervorgabe
Incr Sekunden
Return
End
Kann mir jemand helfen welche Werte falsch sind.
mfg
Enterprise
Ich möchte über einen Atmega8 3,686 Mhz getaktet.
Den Portd.3 alle 25ms abfragen ob dieser Port auf Masse liegt.
Dieses soll genau 10 Sekunden dauern.
Dann müsste ich ja 400 Werte bekommen, das ist nicht der Fall.
Ich bekomme mal 307,317,323,... Werte heraus nie die 400.
$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
Ddrd = &B00000000
Ddrc = &B11111111
Portd = &B11111111
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
Declare Sub Ledon
Declare Sub Main
Declare Sub Abfragen
Declare Sub Ende
Declare Sub Zler1
Enable Timer1
Enable Interrupts
Main:
'----------------------------------------------------------
'######## einschalten Portd.2 ####################
'----------------------------------------------------------
Do
Debounce Pind.2 , 0 , Abfragen , Sub 'Entprellt
Loop
'----------------------------------------------------------
'######## Abfrage des Portd.3 ###################
'----------------------------------------------------------
Abfragen:
Portc.3 = 1
A = 0
Do
Zler1:
Waitms 25
P3 = Pind.3
If P3 = 0 Then
Portc.1 = 1 'Led An
' Portc.2 = 1 ' Summer an Portc.2 an
A = A + 1
Print " A " ; A
If A = 8 Then
Goto Ledon
End If
Goto Zler1
Else
Portc.1 = 0 'Led Aus
' Portc.2 = 0 ' Summer an Portc.2 aus
A = 0
End If
Loop
'----------------------------------------------------------
'############ Led und Summer #############################
'----------------------------------------------------------
Ledon:
T0 = 0
T1 = 0
Print "S" 'Senden ein S über RS232
Sekunden = 0 ' Sek auf 0 stellen dass die 10 S
Do
If Sekunden < 1 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
P4 = Pind.3
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
Waitms 25 ' Abfrage alle 25 ms
Loop
'------------------------------------------------------------
'####### 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
Portc.1 = 0 ' Led an Portc.1 aus
Portc.2 = 0 ' Summer aus Portc.2
Portc.3 = 0 ' Laser einschalten
Goto Main
'-------------------------------------------------------------
'########## Timer Skundenbasis #############################
'-------------------------------------------------------------
Timer_irq:
Timer1 = Timervorgabe
Incr Sekunden
Return
End
Kann mir jemand helfen welche Werte falsch sind.
mfg
Enterprise