-
Is ok, ich wollt nur mal sehen, ob die INt1-Bits auch richtig gesetzt werden
Code:
IN r24,MCUCR
ANDI r24,0xF3 ; da putz er die Mode-Bits ok
ORI r24,0x0C ; er setzt beide --> rising ok
OUT MCUCR,r24
IN r24,GIMSK
ORI r24,0x80 ; enbable int1 ok
OUT GIMSK,r24
SEI ; enable interrupts ok
das ist also pipifein, kann man nicht meckern. Ich hab gesehen, du hast einen Ellenlangen print in der ISR. Aber der sollte auch nix machen.
Wie vermutet, kann's nur ein Problem in der Hardware sein.
Das mit 0 und 5 verbinden wird wohl sehr prellen, da gäb ich nix drauf.
Ich glaub, mit einer anständigen Außenbeschaltung (schmitt-trigger) wird sich das Problem in nix auflösen.
Und sollte doch der mega einen Fehler haben, wird sich das dann rausstellen.
-
ich denk mal deinem programm fehlt nur ein gescheiter rücksprung aus der interrupt stelle
du startest das programm
gehst in eine schleife
es wird ein int ausgelöst und ausgeführt
aber wo soll es dann weiter gehen ?
... setze mal deine do loop in eine subrotine so richtig mit sub xx
und end sub
mfg sven
-
Hallo Sven,
> aber wo soll es dann weiter gehen ?
genau da wo der Interrupt aufgetreten ist. Ist schließlich Sinn und Zwck eines Interrupts an beliebiger Stelle im Programm ausgeführt werden zu können und anschließend genau da weiterzumachen.
Ciao,
Werner
-
Hallo Leute, ich hab mich nun seit Langen mal wieder mit meinem Problem mit den INterrupts beschäftigt, und hab mein Prblem immer noch nicht gelöst.
Ich habe an den Hardware-Interrupt-PIN (PORT D, PIN3 -> INT0 oder PORT D, PIN4 -> INT1) den Ausgang von meinem SHARP GP1A70R (Gabellichtschranke) an diesen Port angeschlossen dort liegt bei LOW 0,08 Volt und bei High 3,7Volt an.
Jedoch wenn ich den Interrupt auf Rising stelle, dann läuft meine Variable ständig hoch ohne das sich der Wert am Sensor ändert und wenn ich auf Falling setze bleibt die Variable = 0 ...
Was mach ich denn nur Falsch, ich weiß wirklich nicht mehr weiter...
hier noch mal mein Programm:
Code:
Declare Sub Mycounter()
$regfile = "m32def.dat"
Dim I As Word
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Tccr1b = Tccr1b Or &H02 'Prescaler = 8
On Int1 Mycounter
Config Int0 = Rising 'interrupt für high level
Enable Int0
Enable Interrupts
I = 0 ' I auf Null setzen
Do
'main loop starts here
Print "this is a test for interrupts I = " ; I
Waitms 100
Loop
End
Mycounter:
Disable Interrupts
Incr I
Enable Interrupts
Return
-
Auf jeden Fall kannst du in der Mycounter routine das dis- und enablen schmeissen, das macht schon der AVR für dich.
-
Hallo,
Ich habe ja erst mit BASCOM begonnen, aber warum du den Timer da einstellst, verstehe ich nicht.
Und wie PicNich schreibt "das dis- und enablen schmeissen" denn währen einem Interrupt kann kein zweites aufgerufen werden.
Ich würde das so machen.
Code:
Dim I As Integer
Enable Interrupts
Enable Int0
On Int0 Label2
Do
Loop
End
Label2:
Incr I
Return
Ich frage mich ob das nicht an deinem Pegel liegt. Ich weis jetzt nicht wie der Pegel bei AVR sein muß damit der erkannt wird. Zum Testen nehme ich immer ein Flip-Flop mit einem Wechselschalter. Da bin ich sicher, daß ich einen sauberen Pegel von 0 oder 5 Volt habe. Und hundertprozentig keine Prellung.
Mit freundlichen Grüßen
Guy