- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: MC68HC05B6 C-Control Basic - Parallelprogramm via Interrupt?

  1. #1
    alecxs
    Gast

    MC68HC05B6 C-Control Basic - Parallelprogramm via Interrupt?

    Anzeige

    Praxistest und DIY Projekte
    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.

  2. #2
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    71
    Beiträge
    13.075
    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.

  3. #3
    alecxs
    Gast
    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?

  4. #4
    alecxs
    Gast
    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?

  5. #5
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    71
    Beiträge
    13.075
    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

  6. #6
    Gast
    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).

  7. #7
    Gast
    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?

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen