Archiv verlassen und diese Seite im Standarddesign anzeigen : MC68HC05B6 C-Control Basic - Parallelprogramm via Interrupt?
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.
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.
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?
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?
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
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).
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?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.