Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: PWM-Frequenz erhöhen und Echtzeituhr nutzen Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 10.08.2006 1:00)
 Als Antwort auf Re: PWM-Frequenz erhöhen und Echtzeituhr nutzen von Tommy - 8.08.2006 0:04
Dietmar nutzt:  CC1-M-Unit V1.1, Advanced CC1-Unit, Open-Micro, Open-Mini, Open-Mini M-Unit, Open-Mini Station, B-Control, sonstige
Hallo Tommy

> Wenn ich den unten Stehenden Code in mein Programm einbinde, dann wird der PWM-Takt auf 200Hz erhöht und die Uhr geht trotzdem, richtig?

Korrekt.

> Kann ich die PWM-Routinen ganz normal einbinden oder muß da was gemacht werden?

Du mußt auf jeden Fall beachten, daß die IIAR (PROC TOFL_iiar INLASM) unmittelbar am Programmbeginn stehen muß, damit sie der Kontroller bei einem aktivierten User-Interrupt aufruft. Sinnvollerweise nach INCLUDE "OM.DEF" und nach den Definitionen. Die PWM-Routinen wurden von René als normale Subroutinen ausgelegt und belegen deshalb keinen System-Interrupt. Du solltest sie deshalb hinter das Hauptprogramm stellen.

Um den Sourcecode möglichst übersichtlich zu gestalten, sollten alle IIARs und zusammengehörige Prozeduren/Subroutinen in Include-Dateien untergebracht werden und auf die folgende Art und Weise in das Hauptprogramm eingebunden werden. Jedes Programm sollte so wie folgt aufgebaut sein und es sollten zuerst alle DEF-Dateien, dann die IIA und am Ende die PRO und eventuelle TAB-Dateien eingebunden werden. Damit ist man in jedem Fall auf der sicheren Seite. Der Compiler positioniert den Code nicht um, sondern legt ihn so ab, wie vom Anwender vorgegeben.

INCLUDE "OM.DEF"           'Include-Datei mit Definitionen

DEFINE ...                 'Definitionen fuer das Hauptprogramm und die verwendeten Softwaremodule

INCLUDE "TOFL.IIA"         'Include-Datei mit IIARs (Interrupt-Service-Routinen)

#main                       'Das Hauptprogramm.

END

INCLUDE "PWM.PRO"          'Include-Datei mit Prozeduren/Subroutinen (Softwaremodule)
INCLUDE "DATEN.TAB"        'Include-Datei mit Tabellen (Daten)

> Könntest du den code wohl noch ein bißchen kommentieren? Ich will mein Assembler ja verbessern.

Gern. Allerdings eignet sich dieser Code eher nicht so gut zum Lernen von Assembler. Interruptroutinen sind etwas schwerer zu durchschauen und zu schreiben. Am besten liest Du Dir zuerst die Kommentare im Hauptprogramm, hinter dem Label #main, durch. Einige Infos zu FREERAM und anderen Dingen befinden sich auch in der OM-Doku. Umfangreiche englischsprachige Infos zur Assemblerprogrammierung gibt es in CPU08RM.pdf und einigen Application Notes von Freescale.

INCLUDE "OM.DEF"

DEFINE TOflZaehler FREERAM2

' --- Die Assembler-Interruptroutine ------------------------------------------------------

' Das Schluesselwort INLASM kennzeichnet die folgende PROCEDURE als Inline-Assembler-
' routine (IAR). Dadurch, und dass sie unmittelbar am Anfang des Programms steht, wird
' sie zu einer IIAR, also zu einer Interrupt-Inline-Assemblerroutine, die bei einem
' aktivierten User-Interrupt gestartet wird. Der OCBASIC-Compiler setzt automatisch ein
' "GOTO main" vor die Routine und springt auf diese Weise zum Hauptprogramm.

' Durch Setzen des UIRTOFL-Bits läßt sich eine Inline-Interrupt-Assemblerroutine (IIAR)
' oder eine Assemblerroutine im SYSCODE-Bereich in den TIMOFL-Interrupt einbinden. Sobald
' der Interrupt auftritt, wird die Assemblerroutine aufgerufen, wobei im Akkumulator der
' Wert #iTOFL (gleich #$10) und im X-Register die Adresse von FREERAM übergeben wird. Die
' Routine sollte mit "RTS" und gelöschtem Carry-Bit ("CLC") beendet werden, weil die OM
' den TIMOFL-Interrupt als TIMER-Interrupt verwendet und periodisch alle 20 ms aufruft.
' Wird dagegen mit gesetztem Carry-Bit ("STC") beendet, ignoriert das System den aktuellen
' Interrupt. Der TIMER und die Uhr wird also nicht weitergezaehlt.

PROC TOFL_iiar INLASM

! cbeqa #iTOFL,TOFL_iiar_1   'Springe zu TOFL_iiar_1, falls Akkumulator gleich #iTOFL
! jmp TOFL_iiar_end+2       'Falls ungleich, dann zur naechsten IIAR in der Kette springen

#TOFL_iiar_1
! inc TOflZaehler           'Erhoehe den Inhalt der Speicherzelle TOflZaehler um eins
! lda TOflZaehler           'Lade den Inhalt der Speicherzelle in den Akkumulator
! cmp #4                     'Vergleiche den Inhalt des Akkumulators mit dem Wert #4
! bne TOFL_iiar_2           'Springe zu TOFL_iiar_2, falls Akku ungleich ist
! clr TOflZaehler           'Bei Gleichheit: Speicherzelle TOflZaehler loeschen
! clc                       'Carry-Flag loeschen (Betriebssystem verarbeitet den Interrupt)
! rts                       'Ruecksprung zum Betriebssystem

#TOFL_iiar_2
! stc                       'Carry-Flag setzen (Betriebssystem ignoriert den Interrupt)
! rts                       'Ruecksprung zum Betriebssystem

END PROC

#TOFL_iiar_end               'Direkt hier hinter muss die naechste IIAR in der Kette folgen

' --- Das Hauptprogramm -------------------------------------------------------------------

#main

' Mit dem folgenden Befehl wird der in der Interruptroutine verwendete Zaehler auf Null
' gesetzt. Das ist notwendig, weil auf der OM der FREERAM-Speicher uninitialisiert bleibt.

TOflZaehler=0

' Durch Setzen des UIRTOFL-Bits läßt sich eine Inline-Interrupt-Assemblerroutine (IIAR)
' oder eine Assemblerroutine im SYSCODE-Bereich in den TIMOFL-Interrupt einbinden. Sobald
' der Interrupt auftritt, wird die Assemblerroutine aufgerufen, wobei im Akkumulator der
' Wert #iTOFL (gleich #$10) und im X-Register die Adresse von FREERAM übergeben wird. Die
' Routine sollte mit "RTS" und gelöschtem Carry-Bit ("CLC") beendet werden, weil die OM
' den TIMOFL-Interrupt als TIMER-Interrupt verwendet und periodisch alle 20 ms aufruft.
' Wird dagegen mit gesetztem Carry-Bit ("STC") beendet, ignoriert das System den aktuellen
' Interrupt. Der TIMER und die Uhr wird also nicht weitergezaehlt.

UIRTofl=ON

' Der 'TIM Clock Source' wird vom internen Bustakt abgeleitet. Ein Prescaler legt fest, in
' welchem Frequenzverhaeltnis die beiden Takte stehen. Der Bustakt ist bei der OM standard-
' maessig 3.2 MHz. Der TIM-Takt kann 50 kHz bis 3.2 MHz betragen. Dieser TIM-Takt wird auf
' der OM mittels Modulo-Register durch 1000 geteilt und ergibt den TIMER-, bzw. PWM-Takt.
' Standardmaessig liegt er bei 50 Hz. Der TOFL-Interrupt wird also 50 mal in der Sekunde
' ausgeloest. Die TIMER-Variable der OM wird deshalb alle 20 ms erhoeht. Mit dem folgenden
' Befehl wird der Kontroller so konfiguriert, daß der TOFL-Interrupt 200 mal in der Sekunde
' auftritt. Siehe dazu auch Beitrag 10313 im Forum.

TSC=&b01000100

' Ein wenig Code zur Verdeutlichung, daß die Echtzeituhr korrekt arbeitet.

WHILE TRUE
  WAIT TIMER=0
  PRINT SECOND
  WAIT TIMER<>0
WEND

Viele Grüße
Dietmar

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten: