PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : meine Probleme mit dem Interrupt



alecs
21.06.2005, 13:01
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

PicNick
21.06.2005, 16:08
Ehrlich, du solltest etwas deutlicher werden.
"funktioniert leider nicht so recht" ist als Voranalyse nicht wirklich umwerfend.

RHS
21.06.2005, 18:20
Hallo alecs,

wenn Du
On Int1 Mycounter
schreibst, erwartet Bascom keine Sub sondern ein Label:
Mycounter:
'Print "interrupt has occurent"
incr I
Return

- Reinhard -

alecs
21.06.2005, 19:26
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

RHS
21.06.2005, 19:55
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 -

alecs
22.06.2005, 09:14
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!

RHS
22.06.2005, 17:28
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 -

alecs
24.06.2005, 11:09
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

PicNick
24.06.2005, 11:13
@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)

alecs
24.06.2005, 11:35
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

PicNick
24.06.2005, 12:18
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.

25.08.2005, 16:44
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, 08: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

alecs
15.09.2005, 12:36
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

PicNick
15.09.2005, 15:30
Auf jeden Fall kannst du in der Mycounter routine das dis- und enablen schmeissen, das macht schon der AVR für dich.

Guy
16.09.2005, 10:39
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