PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hardware Interrupts - Bascom ich bitte um Hilfe!



tms2002
12.05.2005, 12:45
Hallo,

Ich möchte 2 ir sensoren in bascom auswerten. Es gibt bei meinen Atmega16 ja 2 Interrupteingänge

Wie kann ich sobalt eine logische spannung von 5 oder 0volt anliegen das das Programm unterbrochen wird, und es an eine spezielle stelle im Program springt.

Hat jemand mir vieleicht ein paar Codeschipsel oder ähnliches?


Ich würde mich über jegliche Beiträge freuen! O:)



Viele Grüße an alle Roboterbauer

flori

x-ryder
12.05.2005, 15:12
was willstn nun, bei 5V oder bei 0V oder abwechselnd?

tms2002
12.05.2005, 16:30
sobalt einer der beiden auf 0volt also logisch bit 0 wird soll er etwas ausführen

x-ryder
12.05.2005, 16:36
$regfile="m16def.dat"
$crystal=7372800 'musste für dich noch ändern

config int0 = falling
config int1 = falling

enable int0
enable int1

enable interrupts

on int0 int0_isr
on int1 int1_isr

do
'...
loop

int0_isr: 'isr=InterruptServiceRoutine
'tue dies bei INT0 auslösung
return

int1_isr: 'isr=InterruptServiceRoutine
'tue dies bei INT1 auslösung
return

das sollte es gewesen sein ^^

tms2002
12.05.2005, 16:38
danke du hast mir sehr geholfen!...ich werde dies im laufe des tages ausprobieren!

chr-mt
12.05.2005, 19:58
Bevor du dich wunderst....
Wenn du ein LCD angeschlossen hast, kann es unter Umständen zu Störungen in der Anzeige kommen, wenn du gerade auf's LCD schreibst und zum gleichen Zeitpunkt ein Interrupt auftritt.
Ich disable die Interrupts vor'm schreiben auf's LCD und schalte sie sofort danach wieder ein.
Falls einer eine bessere Lösung für das LCD Problem hat, bitte her damit !

Gruß
Christopher

x-ryder
12.05.2005, 20:11
wie viele ints benutzt du denn im programm?

RCO
12.05.2005, 20:15
Ich disable die Interrupts vor'm schreiben auf's LCD und schalte sie sofort danach wieder ein.
Falls einer eine bessere Lösung für das LCD Problem hat, bitte her damit !

Also soweit ich weiß, wird das öfter/immer so gemacht. Wenn man irgendwelche operationen macht, wo nichts dazwischen Funken darf: INTERRUPT aus und wieder an. Da führt wohl kein Weg dran vorbei, es sei denn du erzeugst künstlich nen Interrupt und schreibst in diesen die LCD Routinen. Es stimmt doch, dass Interrupts, die während einer ISR auftreten, nach der gerade aktuellen ISR ausgeführt werden, oder?

chr-mt
12.05.2005, 20:25
Es stimmt doch, dass Interrupts, die während einer ISR auftreten, nach der gerade aktuellen ISR ausgeführt werden, oder?
Keine Ahnung ;) hängt das nicht mit der Priorität der Interrupts zusammen ?
Würde mich auch interessieren, ob ein Interrupt mit höherer Priorität einer ISR "dazwischenfunken" kann.
Oder muß ich dann in der ISR selber die Interrupts disablen und am Ende der ISR wieder einschalten um sowas zu verhindern ??

Gruß
Christopher

tms2002
12.05.2005, 20:33
besitzt der Atmega16 2 oder 3 externe Interrupts? aus den Pinbelegungen des Datenblattes kann ich 3 entnehmen Int0 int1 und Int2/AIN0 was bedeutet AIN0? muss ich irgendwelche fusebits aktivieren um diesen nutzen zu können, oder hat der mega16 nur 2 externe Interrupts?


viele grüße

florian

hacker
12.05.2005, 20:41
hi,

wollte nicht unbendingt einen neuen thread aufmachen:

es gibt also bei einem mega8/16 2 bzw. 3 HARDWARE interrupts....gibts auch software interrupts, die man auf jeden x-beliebigen pin anwenden kann? weil sonst kann man ja immer nur 2 bz.w 3 sensoren oder sonstiges ein interrupt auslösen lassen...

gruss hacker

chr-mt
12.05.2005, 20:43
Hi,
Hab' das Datenblatt gerade nicht hier, aber AIN0 ist ein Eingang des Analogkomparators.

Gruß
Christopher

RCO
12.05.2005, 20:48
gibts auch software interrupts, die man auf jeden x-beliebigen pin anwenden kann?

Nein leider nicht, man könnte aber mehrere Sensoren über Dioden an einen Imterruptpin legen und dann während des Interrupts schnell schauen, welcher Sensor es war. Man legt einen Sensor also an einen IO und mit einer Diode an den Interruptpin. Voraussetzung ist natürlich, dass die Sensoren den gleichen Pegel haben.

hacker
12.05.2005, 20:59
ahja...und wie machen hier des dann die meisten wenn se mer sensoren haben..(was eigentlich im durchschnitt der fall ist denk ich mal) ..tun die die ganze zeit pollen?

x-ryder
12.05.2005, 21:22
ja, bzw.
besseres pollen: in einem intervall immer mal wieder scannen oder
intelligentes pollen: egal welcher sensor nun angesprungen ist, er löst den selben interrupt aus, daraufhin scannt der µc alle einmal ab und guckt welcher es war

Martin

hacker
13.05.2005, 11:38
oki, danke euch !

gruss hacker :D

RCO
13.05.2005, 17:03
Es stimmt doch, dass Interrupts, die während einer ISR auftreten, nach der gerade aktuellen ISR ausgeführt werden, oder?


Keine Ahnung hängt das nicht mit der Priorität der Interrupts zusammen ?

Also, hab jetzt mal einen Experten gefragt, es ist folgendermaßen:
Wenn man sich in einer ISR befindet und ein weiterer Interrupt wird ausgelöst, dann wird die laufende Routine ganz normal zu ende geführt, genau ein Befehl im im hauptprogramm abgearbeitet und dann in die nächste ISR gesprungen. Wenn 2 Interrupts während einer laufenden ISR ausgelöst werden, dann läuft es genau so, die mit den höheren Priorität wird dann als nächstes bearbeitet.

chr-mt
13.05.2005, 21:26
Hi,
@RCO: danke für die Info.
Hab's durch Zufall gerade auch im Buch von Rowalt gefunden.
Seite 55
Da steht allerdings, daß nach dem ersten Interrupt sofort der nächste, je nach Priorität, ausgeführt wird, also nicht, daß noch ein Befehl im Hauptprogramm zwischen den Interrupts abgearbeitet wird.
Aber egal, Hauptsache es funkt mir in einen Interrupt kein zweiter dazwischen :D

Gruß
Christopher

RCO
13.05.2005, 21:46
Naja, dieser eine Befehl in der Hauptschleife soll wohl dazu dienen, dass das Hauptprogramm, auch wenn die ganze Zeit Interrupts auftreten, nicht völlig stehen bleibt, sondern, wenn auch sehr langsam, weiter läuft. Naja, ist ja erstmal nicht so wichtig.

chr-mt
13.05.2005, 22:46
Nee,
finde Ich schon wichtig und eine gute Information!
Der Sinn des einen Befehls war mir bis jetzt noch nicht klar, aber das ist einleuchtend. Macht Sinn.

Gruß
Christopher