Archiv verlassen und diese Seite im Standarddesign anzeigen : meine Probleme mit dem Interrupt
hallo ich habe ein kurzes Testprogramm geschrieben um den Hardware- Interrupt zu testen.
Immer wenn ein Interrupt ausgelöst wird soll meine Variable I um 1 incrementiert werden doch das funktioniert leider nciht so recht...
wo liegt mein Fehler ?
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 Int1 = Rising 'rising for high level/ falling low level
Enable Int1
Enable Interrupts
I = 0
Do
Print "this is a test for high-level interrupts I = " ; I
'main loop starts here
Sound Portd.7 , 700 , 750 'BEEP
Waitms 10
Loop
End
Sub Mycounter()
'Print "interrupt has occurent"
I = I + 1
End Sub
Ehrlich, du solltest etwas deutlicher werden.
"funktioniert leider nicht so recht" ist als Voranalyse nicht wirklich umwerfend.
Hallo alecs,
wenn Du
On Int1 Mycounter
schreibst, erwartet Bascom keine Sub sondern ein Label:
Mycounter:
'Print "interrupt has occurent"
incr I
Return
- Reinhard -
Sorry PicNick, das nächste Mal mache ich eine bessere Fehlerbeschreibung.
Vielen vielen Dank Reinhard, das war das Problem.
Doch nun steh ich vor folgenden Problem, mein Variable I steiger ständig ihren Wert und das ganz unregelmäßig, obwohl nix am Port D angeschlossen ist. Die Variable startet bei 131 und steigert sich im nächsten Schritt auf 202 und im dritten Schritt ( print Ausgabe ) auf 432. Und dabei setzte ich doch die Variable am Programmstart auf 0.
seht ihr den Fehler ?
Danke
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 Int1 = Rising 'interrupt für high level
Enable Int1
Enable Interrupts
I = 0 ' I auf Null setzen
Do
Print "this is a test for high-level interrupts I = " ; I
'main loop starts here
Waitms 10
Loop
End
Mycounter:
Incr I
Return
Hallo alecs,
obwohl nix am Port D angeschlossen ist.
das könnte das Problem sein. Der Port ist auf keinen
definierten Pegel und "schwingt" hin & her ... und der Interrupt
wird dadurch ausgelöst.
vermutet einfach mal: - Reinhard -
Hallo Reinhard,
ich habe nun die kontakte für Int1 und Int2 auf Masse und einmal direkt auf 5V geschlossen, doch in diesem Fall geschieht keine Print-Ausgabe mehr, ist das ein ständiger Interrupt ? Ich hab beide Kombinationen mit Rising und Falling ausgetestet doch immer wieder beim anschließen keine Print-Ausgabe.
Ist nix angeschloßen läuft die Printausgabe und die Variable ändert ihren Wert sehr schnell wie schon beschrieben und sie startet auch nicht bei 0, was auch sehr komisch ist!
Hallo alecs,
Dein Problem liegt definitiv daran, das Port D unbeschaltet
praktisch in der Luft hängt.
Wenn Du folgenden Code einfügst, sollte es funktionieren:
Config Portd = Input
Portd = &HFF
Unbeschaltete Ports solltest Du in einen definierten Zustand
bringen. Die 2 Zeilen schalten den Port D auf Eingang und
aktivieren die internen Pullup's.
Das Dein Zähler so springt und nicht bei 0 anfängt, liegt an
Deinen 10ms Pause. In der Zwischenzeit sind schon wieder
ein paar Interrupts durch ...
- Reinhard -
Hallo Reinhardt,
ich versteh es einfach nicht.
haben den Interrupt auf Rising und es ist egal ob ich Masse oder 5 Volt anlege es wird immer ein Interrupt ausgelöst.
Auch die 2 Zeilen haben keine Änderung verschafft :(
Ich wollte es wirklich als Zähler nutzen aber solange es nicht theoretisch funktioniert brauch ich auch keinen Schmidttrigger oder ähnliches anschließen.
Ich weiß jetzt wirklich nicht mehr was da nicht stimmen sollte.
Im eigentlichen Sinne wird ja auch nur Int1 verwendet und somit ist es ja auch egal wie Int2 und die anderen am Port D belegt sind (sind alle frei) oder ? Kann der Int1 auch noch von einem andern Port ausgelöst werden ?
danke
Alex
@alecs:
Kannst du die Hexfile reinstellen, ich schau mal, ob die Sache compilermäßig koscher ist.
Mega32 hab ich gesehen
Welche BasCom version ? (Help-about)
Hi,
ich habe die Version 1.11.7.7 ...
hier der HEX File :
:100000000C942A00189500000C94740018950000B8
:10001000189500001895000018950000189500002C
:10002000189500001895000018950000189500001C
:10003000189500001895000018950000189500000C
:1000400018950000189500001895000018950000FC
:10005000189500008FE58DBFC0E4E0E44E2E88E0E7
:100060008EBFD8E0F8E05F2EEEEFF7E0A0E6B0E05C
:1000700088278D933197E9F787E689B980E080BDBD
:1000800088E18AB966248D9A8C9A83EA8FBD80E0D4
:100090008EBDBB27AEE48C9182608C9380E081BBE7
:1000A0008FEF82BB85B7837F8C6085BF8BB78068FD
:1000B0008BBF789480E090E0A0E6B0E08D939C93B5
:1000C000E0EBF2E00E94C700A8E2B8E0E0E6F0E072
:1000D0000E94FF000E94BF000E94CE0080E991E0D4
:1000E0000E94DE000C9460000F921F922F923F92AC
:1000F0004F925F927F92AF92BF920F931F932F9375
:100100003F934F935F936F937F938F939F93AF939F
:10011000BF93CF93DF93EF93FF938FB78F93EEED62
:10012000F2E00E94C7000E94CE00A0E6B0E00D9170
:100130001C9141E050E0040F151FA0E6B0E00D93C4
:100140001C938F918FBFFF91EF91DF91CF91BF9162
:10015000AF919F918F917F916F915F914F913F915F
:100160002F911F910F91BF90AF907F905F904F9014
:100170003F902F901F900F901895F894FFCFA8E212
:10018000B8E08D91882311F00CD0FBCF08950E9428
:10019000ED00802D11F005D0FACF08958DE001D04B
:1001A0008AE05D9BFECF8CB908953197F1F70895F1
:1001B000689462F80895E89462F80895EF93FF93C5
:1001C000EE27E82BE92B31F0E0EAFFE03197F1F779
:1001D0000197D1F7FF91EF910895C89531960020CE
:1001E0000895000F111F221F331F089500951095C9
:1001F000209530950F5F1F4F2F4F3F4F089501916E
:1002000010810EC001911191219130810BC001919B
:10021000108117FF05C03FEF2FEF04C000811127A9
:100220002227332737FF03C0E1DF8DE28D93CF9381
:10023000DF93CF92DF92EF92AA24BB24CC24DD245B
:10024000EE2440E2CAE0DD2755E093E38881890F80
:1002500087FD9F7083FD907F891B89935A95A9F72D
:10026000C0DFAA1CBB1CCC1CDD1CEE1C4A9551F740
:10027000E894EFE0FF2782910ED0EB30E0F71EF01C
:1002800068948A2D0CD088278D93EF90DF90CF90C3
:10029000DF91CF910895982F829501D0892F8F708B
:1002A000805D26F0803309F4089568948D93089555
:1002B00074686973206973206120746573742066A3
:1002C0006F7220686967682D6C6576656C20696E51
:1002D00074657272757074732049203D2000696ED8
:1002E0007465727275707420686173206F636375D2
:0602F00072656E7400004F
:00000001FF
Is ok, ich wollt nur mal sehen, ob die INt1-Bits auch richtig gesetzt werden
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
Werner_Just
26.08.2005, 09:01
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:
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.
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.