PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] MC68HC05B6 C-Control Basic - Parallelprogramm via Interrupt?



alecxs
10.02.2004, 21:03
Habe den Motorola MC68HC05B6 mit C-Control Basic, und folgendes Problem:

Gibt es eine Möglichkeit, neben dem Hauptprogramm parallel ein weiteres Programm laufen zu lassen?

Beim Siemens C504 8051 in C programmiert gab es ja die Möglichkeit, einen Interrupt über einen automatischen Timer regelmäßig auslösen zu lassen, was den Effekt hatte daß man in der Interruptroutine ein eigenständiges Programm laufen lassen konnte, was parallel und unabhängig zu der main lief (bzw. wurde die main bei jedem Überlauf kurz unterbrochen, unabhängig davon ob diese sich gerade in einer Warteschleife befand).

Lösungsvorschläge wie ich dies über Basic programmieren kann?

Das Programm soll im Hauptprogramm endlos die Tastatur abfragen (wobei die Endlosschleife 0,2s pause enthält, um die Tastatur zu entprellen), die Eingabe auswerten und in eine globale Variable schreiben.

Unabhängig davon soll das Parallelprogramm aller 40 ms den AD auslesen, und dann den DA (durch de- oder inkrementieren) an eben diese globale Variable annähern.

Mein unvollständiger Quellcode:

#interrupt regler ' Interrupt deklarieren

#programm
'Tastaturabfrage und Auswertung
pause 10
goto programm

#regler
'Wert einregeln
pause 2
return interrupt

Im Conrad-Simulator springt das Programm sofort in den Interrupt und nie ins Hauptprogramm.

Manf
10.02.2004, 21:55
Die Befehlsausführungszeiten eines Basic programms sind soweit ich das schon überprüft habe nicht für 40ms Wechsel geeignet. Ein Port Toggle dauert schon mehr als eine Millisekunde. Die Antwort liegt bestimmt in der Ausführungszeit auch wenn ich nicht alle Zeiten gemessen habe.

Manfred.

alecxs
10.02.2004, 23:10
Okay die Zeiten seien jetzt mal fiktiv, da ich den Regler im Endeffekt bestimmt sowieso langsamer betreiben muß, damit er nicht zu stark überschwingt. Die Problemstellung bleibt aber, wie bekomme ich die Ausführung einer Befehlskette in einem vorgegebenen Zeitintervall hin, parallel zum Hauptprogramm, in dem viel größere Pausen vorkommen? Hat schon mal jemand etwas mit Interrupt und/oder Timer in Basic programmiert? Gibt es vielleicht eine ganz andere Lösung, ohne Interrupt?

alecxs
22.03.2004, 20:02
Okay,

das mit dem Interrupt könnte funktionieren, wenn da nicht das Problem mit dem PWM wäre. Um mit dem Interrupt regelmäßig aus dem Hauptprogramm in die Parallelroutine springen zu können, genügt es ein PWM mit der gewünschten Frequenz auf den IRQ zu legen.

Beim MC68HC05B6 kann man die Frequenz des PWM aber nicht vorgeben, richtig? Die Möglichkeit einen Digitalport zu toggeln scheidet aus, da dafür ja wieder eine extra Routine notwendig wäre.

Gibt es vielleicht eine Möglichkeit in Assembler die Frequenz zu ändern?

Manf
22.03.2004, 20:32
Es gab leider wenig Antworten auf die Frage, und ich habe die Lösung auch nicht. Trotzdem meine Bemerkung:

Ein CC1-PWM als Interrupt Timer zu nehmen halte ich für aussichtslos, ich habe noch nicht gehört, daß die Frequenz geändert werden kann und sie ist mit 1953 Hz für einen Basic Interrupt viel zu hoch.

Wie ist es mit BEEP in Dauerfunktion. Der BEEP Ausgang liefert bei der Dauer d=0 ein Dauersignal mit der Frequenz 250kHz / t.
t kann >256 sein in Beispielen sind 2-byte Werte angegeben.
Wenn er bis 25000 geht, dann kann man ja 10 mal pro Sekunde eine ganz kurze Interrupt-Bearbeitung durchführen. Besser ist es natürlich einen externen Teilerbaustein, (ich nehme immer ganz gerne den MC4040 der alle Binärteilungen bis 2^12 an getrennten Ausgängen anbietet) dazu zu nehmen.
Manfred

23.03.2004, 12:24
Naja, man könnte sich an den Timer-Output-Compare-Interrupt hängen (siehe z.B http://ccintern.dharlos.de/faq.htm#20msbeschl). Dort dann einfach den IRQ-Eingangs-Interrupt auslösen lassen, dann sollte das BS nach dem nächsten Basic-Befehl in die Interrupt-Funktion springen.

Aber unabhängig davon sei erwähnt, dass man sich bei der C-Control davor hüten sollte, längere Anweisungen in die Interrupt-Funktion zu implementieren, da es einen dicken fetten Bug im BS gibt, der den Stack durcheinanderwirbelt, bzw. zuvor abgelegte Werte nicht mehr wieder herstellt. Interrupt-Funktion also nur so gering wie möglich verwenden (z.B. einfach eine Variable setzen, die dann das Hauptprogramm immer wieder überprüft).

27.03.2004, 22:19
Vielen Dank für die Tipps!

Auf die Idee mit dem BEEP Ausgang bin ich noch gar nicht gekommen. Man könnte diesen bei der Initialisierung einmalig aufrufen, und dann müßte er ja ewig weiterlaufen. Ich werde das testen.

Mit Assembler habe ich mich bisher nicht beschäftigt, das mit dem Timer-Output-Compare-Interrupt klingt sehr kompliziert, soweit ich das verstanden habe müßte man dazu die Assembler-Routine des Timers um den Aufruf des IRQ ergänzen. Das wären dann nur max. 20ms Abstand oder?

Was heißt BS - OS? Wie lang ist denn zu lang? In der Interruptroutine steht ungefähr so viel:

#regler

if v_soll < v_ist then goto dekrementieren
if v_soll > v_ist + 5 then goto inkrementieren

#set

PWM = PWM_DA

return interrupt

---

#inkrementieren

PWM_DA = PWM_DA + 1

' Sicherung bei Ausfall des AD-Wandlers
if PWM_DA > 116 then PWM_DA = 116 ' obere Grenze PWM 45% ~ 2V

goto set

---

#dekrementieren

PWM_DA = PWM_DA - 1

' Sicherung bei Ausfall des AD-Wandlers
if PWM_DA > 116 then PWM_DA = 0 ' untere Grenze PWM 0% ~ 0V

goto set

---

Gibt es mit dieser Menge schon Stack-Probleme?