paul88
16.04.2007, 20:42
Hallo Leute, bin neu hier und auch neu in der Mikrocontroller-Programmierung. Habe mich an einem AtMega8 mit 8 MHz und wollte einen Zähler für die Blitze der DigiCam (die ja bekanntlich je nach Modell mehrere Blitze aussenden) bauen.
Also LED an einen Transistor und diesen an INT1, fallende Flanke gekoppelt. Wenn er ausgelöst wird, zählt er eine Variable jeweils um 1 hoch = Anzahl der Blitze. Diese "Meßdauer" beträgt 3 Sekunden, dann erfolgt in einer Schleife die Anzeige der Anzahl der Blitze (je nach Höhe der Variablen) über eine 2te LED und einen Beep.
Leider bekomme ich recht unterschiedliche Werte: zwischen 1 und 11 mal "Beept" es; Ergebnis nicht reproduzierbar.
Wurde besser, nachdem ich die "waitms 5" in die Interruproutine eingebaut habe, ist aber auch nicht das gelbe vom Ei.
Der Bascom-Code:
$regfile = "m8def.dat" 'Die Anweisung bestimmt Controllertyp
$crystal = 8000000 'Die Frequenz des verwendeten Quarzes
$baud = 2400 'Die Baudrate für RS232 Ausgabe.
'------------------------------------------------------------------------------
' LED-Ansteuerung
Config PinB.0 = Output 'Port PB0 wird als Ausgang definiert
Led1 Alias PortB.0
Config PinD.2 = Output 'Port PD2 wird als Ausgang definiert
Led2 Alias PortD.2
Led2 = 0
Led1 = 0 '
'------------------------------------------------------------------------------
' Summer
Config PinB.3 = Output 'Leitung 2 des Summers auf GND
PortB.3 = 0
Sound PortD.4 , 300 , 450 'BEEP
'------------------------------------------------------------------------------
'Interrupteingang INT 1 = CON1-14 auf High, damit ein definiter Pegel geschaffen wird
PortD.3 = 1
Config Int1 = falling 'configuriere Int1 Auf Low Level
On Int1 Isr_von_int1 'springe Zu Isr_von _int1
Enable Int1 'einschalten Von Interrupt Int1
Enable Interrupts 'einschalten Der Interrupts
dim cnt as Byte , a as Byte
Do
Led2 = 1
cnt = 0
waitms 3000
Led2 = 0
waitms 500
for a = 1 to cnt
Led1 = 0
Waitms 200
Sound PortD.4 , 30 , 650
Led1 = 1
Waitms 200
next
Led1 = 0
Loop
Isr_von_int1: 'isr Von Int1
incr cnt
waitms 5
Return
Wer kann mir das erklären? Ist der AtMEga mit Bascom eventuell zu langsam?
Danke im Voraus
Also LED an einen Transistor und diesen an INT1, fallende Flanke gekoppelt. Wenn er ausgelöst wird, zählt er eine Variable jeweils um 1 hoch = Anzahl der Blitze. Diese "Meßdauer" beträgt 3 Sekunden, dann erfolgt in einer Schleife die Anzeige der Anzahl der Blitze (je nach Höhe der Variablen) über eine 2te LED und einen Beep.
Leider bekomme ich recht unterschiedliche Werte: zwischen 1 und 11 mal "Beept" es; Ergebnis nicht reproduzierbar.
Wurde besser, nachdem ich die "waitms 5" in die Interruproutine eingebaut habe, ist aber auch nicht das gelbe vom Ei.
Der Bascom-Code:
$regfile = "m8def.dat" 'Die Anweisung bestimmt Controllertyp
$crystal = 8000000 'Die Frequenz des verwendeten Quarzes
$baud = 2400 'Die Baudrate für RS232 Ausgabe.
'------------------------------------------------------------------------------
' LED-Ansteuerung
Config PinB.0 = Output 'Port PB0 wird als Ausgang definiert
Led1 Alias PortB.0
Config PinD.2 = Output 'Port PD2 wird als Ausgang definiert
Led2 Alias PortD.2
Led2 = 0
Led1 = 0 '
'------------------------------------------------------------------------------
' Summer
Config PinB.3 = Output 'Leitung 2 des Summers auf GND
PortB.3 = 0
Sound PortD.4 , 300 , 450 'BEEP
'------------------------------------------------------------------------------
'Interrupteingang INT 1 = CON1-14 auf High, damit ein definiter Pegel geschaffen wird
PortD.3 = 1
Config Int1 = falling 'configuriere Int1 Auf Low Level
On Int1 Isr_von_int1 'springe Zu Isr_von _int1
Enable Int1 'einschalten Von Interrupt Int1
Enable Interrupts 'einschalten Der Interrupts
dim cnt as Byte , a as Byte
Do
Led2 = 1
cnt = 0
waitms 3000
Led2 = 0
waitms 500
for a = 1 to cnt
Led1 = 0
Waitms 200
Sound PortD.4 , 30 , 650
Led1 = 1
Waitms 200
next
Led1 = 0
Loop
Isr_von_int1: 'isr Von Int1
incr cnt
waitms 5
Return
Wer kann mir das erklären? Ist der AtMEga mit Bascom eventuell zu langsam?
Danke im Voraus