bebop
08.07.2011, 14:16
Hallo,
ich beschäftige mich immer wieder mal mit dem Thema AVRs und deren Programmierung aber so ganz bin ich da noch nicht eingestiegen
Nun da meine Prüfungen vorbei sind habe ich mir zwei Mega 8 besorgt und einen Kodierschalter dazu. Meine Herausforderung war es die Schaltstellung des Schalters ab zu fragen und dann einen Impuls in verschiedenen Abständen an einem Pin aus zu geben. Diesen "Intervallauslöser" brauche ich für Stop-Motion-Filme.
Jetzt habe ich den Code im einfachsten Stil zusammengeschrieben und wollte das ganze testen aber der µC macht nur ein paar Zustandswechsel an der angeschlossenen LED und das war es dann. Würde sich da jemand mal erbarmen meinen Code anzusehen?
Was mache ich falsch und warum dauert der Abstand zwischen den Intervallen nicht 1 Sekunde wenn ich sage Waitms 1000, was mache ich falsch ?
Gruß Johannes
$regfile = "m8def.dat" ' Konfiguration mit extrenem Quarz
$crystal = 3686411
$hwstack = 40
$swstack = 16
$framesize = 32
Config Portc.4 = Output 'Das ist der Ausgang für den IR-Auslöser
Config Pind.0 = Input 'Mit PinD.0 -3 Werden die Pins des Codierschalters (PT65 303) verbunden
Config Pind.1 = Input
Config Pind.2 = Input
Config Pind.3 = Input
Pind.0 = 1 'Internen Pull-Up Widerstand eingeschalten
Pind.1 = 1
Pind.2 = 1
Pind.3 = 1
Do
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 0 Then '0,5 Sekunden
Waitms 20 '20 ms um ein Prellen abzuwarten
Portc.4 = 1
Waitms 500
Portc.4 = 0
Waitms 30 '30ms um dem Auslöser Zeit zu geben
End If
If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 0 Then '1 Sekunde
Waitms 20
Portc.4 = 1
Waitms 1000
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 0 Then '2 Sekunden
Waitms 20
Portc.4 = 1
Waitms 2000
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 0 Then '4 Sekunden
Waitms 20
Portc.4 = 1
Waitms 4000
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 0 Then '8 Sekunden
Waitms 20
Portc.4 = 1
Wait 8
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 0 Then '16 Sekunden
Waitms 16
Portc.4 = 1
Wait 4
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then '32 Sekunden
Waitms 20
Portc.4 = 1
Wait 32
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then '48 Sekunden
Waitms 20
Portc.4 = 1
Wait 48
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then '60 Sekunden
Waitms 20
Portc.4 = 1
Wait 60
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then '75 Sekunden
Waitms 20
Portc.4 = 1
Wait 75
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then '90 Sekunden
Waitms 20
Portc.4 = 1
Wait 90
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then '105 Sekunden
Waitms 20
Portc.4 = 1
Wait 105
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 1 Then '120 Sekunden
Waitms 20
Portc.4 = 1
Wait 120
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then '150 Sekunden
Waitms 20
Portc.4 = 1
Wait 150
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1 Then '180 Sekunden
Waitms 20
Portc.4 = 1
Wait 180
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1 Then '210 Sekunden
Waitms 20
Portc.4 = 1
Wait 210
Portc.4 = 0
Waitms 30
End If
Loop
End
ich beschäftige mich immer wieder mal mit dem Thema AVRs und deren Programmierung aber so ganz bin ich da noch nicht eingestiegen
Nun da meine Prüfungen vorbei sind habe ich mir zwei Mega 8 besorgt und einen Kodierschalter dazu. Meine Herausforderung war es die Schaltstellung des Schalters ab zu fragen und dann einen Impuls in verschiedenen Abständen an einem Pin aus zu geben. Diesen "Intervallauslöser" brauche ich für Stop-Motion-Filme.
Jetzt habe ich den Code im einfachsten Stil zusammengeschrieben und wollte das ganze testen aber der µC macht nur ein paar Zustandswechsel an der angeschlossenen LED und das war es dann. Würde sich da jemand mal erbarmen meinen Code anzusehen?
Was mache ich falsch und warum dauert der Abstand zwischen den Intervallen nicht 1 Sekunde wenn ich sage Waitms 1000, was mache ich falsch ?
Gruß Johannes
$regfile = "m8def.dat" ' Konfiguration mit extrenem Quarz
$crystal = 3686411
$hwstack = 40
$swstack = 16
$framesize = 32
Config Portc.4 = Output 'Das ist der Ausgang für den IR-Auslöser
Config Pind.0 = Input 'Mit PinD.0 -3 Werden die Pins des Codierschalters (PT65 303) verbunden
Config Pind.1 = Input
Config Pind.2 = Input
Config Pind.3 = Input
Pind.0 = 1 'Internen Pull-Up Widerstand eingeschalten
Pind.1 = 1
Pind.2 = 1
Pind.3 = 1
Do
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 0 Then '0,5 Sekunden
Waitms 20 '20 ms um ein Prellen abzuwarten
Portc.4 = 1
Waitms 500
Portc.4 = 0
Waitms 30 '30ms um dem Auslöser Zeit zu geben
End If
If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 0 Then '1 Sekunde
Waitms 20
Portc.4 = 1
Waitms 1000
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 0 Then '2 Sekunden
Waitms 20
Portc.4 = 1
Waitms 2000
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 0 Then '4 Sekunden
Waitms 20
Portc.4 = 1
Waitms 4000
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 0 Then '8 Sekunden
Waitms 20
Portc.4 = 1
Wait 8
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 0 Then '16 Sekunden
Waitms 16
Portc.4 = 1
Wait 4
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then '32 Sekunden
Waitms 20
Portc.4 = 1
Wait 32
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 0 Then '48 Sekunden
Waitms 20
Portc.4 = 1
Wait 48
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then '60 Sekunden
Waitms 20
Portc.4 = 1
Wait 60
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then '75 Sekunden
Waitms 20
Portc.4 = 1
Wait 75
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then '90 Sekunden
Waitms 20
Portc.4 = 1
Wait 90
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 0 And Pind.3 = 1 Then '105 Sekunden
Waitms 20
Portc.4 = 1
Wait 105
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 0 And Pind.2 = 1 And Pind.3 = 1 Then '120 Sekunden
Waitms 20
Portc.4 = 1
Wait 120
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 0 And Pind.2 = 0 And Pind.3 = 1 Then '150 Sekunden
Waitms 20
Portc.4 = 1
Wait 150
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 0 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1 Then '180 Sekunden
Waitms 20
Portc.4 = 1
Wait 180
Portc.4 = 0
Waitms 30
End If
If Pind.0 = 1 And Pind.1 = 1 And Pind.2 = 1 And Pind.3 = 1 Then '210 Sekunden
Waitms 20
Portc.4 = 1
Wait 210
Portc.4 = 0
Waitms 30
End If
Loop
End