Forum: Mikrocontroller und Digitale Elektronik ISR Routinen Auswahl ???


von Gerhard (Gast)


Lesenswert?

Hallo Leute,

ich hab wieder einmal ein etwas "komisches" Bascom Problem.
Ich will am Anfang des Programms 2 Pin's die mittels DIP Schalter
auf HI od . Lo gesetzt sind abfragen und je nach Wert
die Interrupt's INT0 und INT1 in verschiedene Interruptroutinen
springen lassen.

Mein Bascom-Programmteil:

Dip = Portd And &B00000011   'Portd.0 und Portd.1 abfragen
Select Case Dip
Case 2
 On Int0 ISR_0_4x Nosave
 On Int1 ISR_1_4x Nosave
 Enable Int0
 Enable Int1
Case 1
 On Int1 ISR_1_2x Nosave   '***********
 Enable Int1
Case 0
 On Int1 ISR_1_1x Nosave   '***********
 Enable Int1
End Select
Enable Interrupts

Nun sagt mir Bascom beim Compilieren (in den Zeilen mit den
Sternchen)dass die ISR schon definiert sind. Also Fehler !!

Hab's auch schon mit IF Then Else versucht . Geht auch nicht.
Hat da wer eine Lösung wie ich das machen kann.
Vielen Dank im Voraus.

Gruss Gerhard

von Thomas Oly (Gast)


Lesenswert?

Hallo,

hab von Bascom keine Ahnung in Assembler würd ichs aber so machen das
erstmal eine Interrupt-Routine angesprungen wird und dann erst hier zu
schauen wie die DIPS stehen kannst ja dan immer noch woanderst
hinspringen.

von Micha (Gast)


Lesenswert?

Hallo,
ebenfalls von BASCOM null Ahnung :-)
sieht so aus, als ob der Befehl on int... trallala
nur global verwendet wird.

Du könntest anstatt dessen das Ergebnis deiner DIP-Auslese-
Aktion (nur am Anfang wie ich jetzt interpretiere) in eine
Konfigurationsvariable schreiben.
Wenn die Interrupts dann bei dieser während des Programmablaufs
vorbeischauen, wissen die bescheid und du sparst dir
das herumgespringe in BASCOM.

Gruß,
Micha

von Profi (Gast)


Lesenswert?

ON INT1 bedeutet global, dass er bei einem Interrupt1
(Hardwareinterrupt) an die angegeben Adresse springt.

Diese Adresse kannst Du natürlich nur einmal angeben, also nicht
dynamisch.

Wie bereits vorgeschlagen, musst Du EINE INT0 und EINE INT1 Adresse
angeben, und dort die Dipswitches (oder den Zwischenspeicher dafür)
abfragen.

von Gerhard (Gast)


Lesenswert?

Hallo,

Danke für eure Antworten.
War mir schon klar dass es so geht.
Wollte nur vermeiden den Status der Schalter bzw. den Wert der
Variablen bei jedem Auftreten von INT0 bzw.INT1 abzufragen, weil
diese Routinen sehr zeitkritisch sind.
Deswegen wollte ich die Sache am Programm-Anfang einrichten.

Gruss Gerhard

von Profi (Gast)


Lesenswert?

Das ginge schon, wenn Du einen indirekten Jump machst, dessen Adresse im
Ram oder eonem Register steht. Vorher testest Du die Switches und setzt
die Adresse im Ram entsprechend.
Oder, wenn Dein uC Code im Ram ausführen kann, läßt Du den IRQ-Vektor
ins Ram zeigen und schreibst den entsprechenden jmp in Abhängigkeit von
den Switches ins Ram.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.