
 Ŀ
            Tips und Tricks zum C-Control/BASIC Mikrokontroller            
 

 In dieser Textdatei stehen einige Tips und Tricks zur Programmierung des C-
 Control/BASIC Mikrokontrollers in BASIC und/oder Assembler und zu anderen
 Themen.

 Ŀ
               Assemblerprogramme auf den Rechenstack pushen               
 

 Selten benutze, kurze Assemblerprogramme muessen nicht unbedingt ins interne
 EEPROM programmiert werden. Viel effektiver ist es, diese einfach waehrend
 der Laufzeit des BASIC-Programms auf den Rechenstack zu pushen und
 anschliessend aufzurufen. Zu beachten ist hierbei, dass die
 Assemblerprogramme nicht laenger als 7 Words (14 Bytes) werden duerfen und
 das fuer das Laden des Rechenstack natuerlich relativ viel Zeit benoetigt
 wird. Immerhin muss der Rechenstack VOR JEDEM Aufruf des Assemblerprogramms
 geladen werden.

 Falls doch einmal ein Assemblerprogramm benoetigt wird, das laenger als 14
 Byte ist, koennen die Datenstrukturen die im Speicher hinter dem Rechenstack
 folgen als Zwischenspeicher fuer das Assemblerprogramm missbraucht werden.
 Das ist einerseits ein Word das zum Generieren der Zufallszahlen benoetigt
 wird (kann mit RANDOMIZE geaendert werden) und andererseits das USER-Ram zum
 Abspeichern der USER-Variablen. In das USER-Ram kann einfach durch Aendern
 von Variableninhalten geschrieben werden. Wenn alle aufgefuehrten
 Moeglichkeiten ausgenutzt werden, koennen Assemblerprogramme bis 40 Byte
 Laenge (14+2+24) waehrend der Laufzeit des BASIC-Programms
 zwischengespeichert und aufgerufen werden!

            Hier ein einfaches Beispiel, das den SYS-Befehl nutzt:

   print asmaufruf
   end
   
   ' Der SYS-Befehl in der BASIC-Unterroutine ASMAUFRUF ruft folgendes
   ' Assemblerprogramm auf:
   
   '0091 =        org $91
   '0091 : a604   lda #$4
   '0093 : b791   sta $91
   '0095 : a6d2   lda #$d2
   '0097 : b792   sta $92
   '0099 : 9d     nop
   '009a : 81     rts
   
   #asmaufruf
     sys &h91,&h9d81,&hb792,&ha6d2,&hb791,&ha604
   return


 Diese Art Assemblerprogramme in BASIC-Programme einzubinden erhoeht sogar
 die Lebensdauer des Mikrokontrollers. Laut Motorola vertraegt das interne
 EEPROM nur 10000 Schreibzyklen!


 Ŀ
                 Tabelleninhalte als BASIC-Token ausfuehren                
 

 Wenn Tabellen inmitten von BASIC-Codebereichen stehen, werden die Daten die
 in den Tabellen stehen als BASIC-Token ausgefuehrt. Diesen Umstand kann man
 sich zunutze machen um Token zu erzeugen, die der BASIC-Compiler nicht
 unterstuetzt.

       Hier ein Beispiel, das die Laenge der EEPROM-Datendatei ausgibt:

   open# for write
   print filelen
   print# 12
   print filelen
   print# 13
   print filelen
   close#
   print filelen
   end
   
   #filelen
     table filelentab
       7180  '28*256+12
     tabend
   return


 Ŀ
                PEEK und POKE-Funktionen in BASIC-Programmen               
 

 In der Datei DUMP.BAS (liegt dieser Informationssammlung bei) ist
 beschrieben wie mit Hilfe von kleinen Assemblerprogrammen die innerhalb des
 USER-Rams liegen PEEK und POKE-Funktionen nachgebildet werden koennen. Die
 dem C-Control/BASIC-Chip zugrundeliegende CPU unterstuetzt keine 16-Bit
 Zeiger, so das etwas getrickst werden muss, um Daten ausserhalb der Zeropage
 zu lesen oder zu schreiben.


 Ŀ
                Abspeichern ins interne EEPROM von BASIC aus               
 

 Auch Informationen zu diesem Thema stehen in der Datei DUMP.BAS.


 Ŀ
              Eigene Assembler-Interruptroutinen programmieren             
 

 Das Betriebssystem unterstuetzt das Einbinden von eigenen Assembler-
 Interruptroutinen, die im internen EEPROM (Adresse $101 bis $1ff) liegen
 muessen. Auf Adresse $50 bis $53 des RAMs gefinden sich Zeiger, in die die
 Adressen der eigenen Unterroutinen eingetragen werden muessen. Nach einem
 Reset werden diese Pointer mit dem Wert null (d.h.: keine User-
 Interruptroutine vereinbart) ueberschrieben.

 Als kleines Beispiel folgt ein Assemblerprogramm, das sich in den Timer
 Compare Interrupt einklingt und alle 20 Millisekunden den Zustand von Port A
 nach Port B kopiert. Wenn an Port B ein Ozilloskop oder LEDs angeschlossen
 werden, kann somit der Zustand von Port A ueberwacht werden. Das ist sehr
 sinnvoll bei einer BASIC M-Unit, denn hier ist Port A nicht vollstaendig
 herausgefuehrt. Zusaetzlich koennen (mit LEDs am Port B) die
 Zustandsaenderungen auf der SDA- und SCL-Leitung des I2C-Busses ueberwacht
 werden.


                           Hier das BASIC-Programm:
          (in der DOS-IDE eingeben und unter TIMERCMP.BAS speichern)

   sys &h101                     ' Interruptroutine in das System einbilden
   syscode "timercmp.s19"


                       Und hier das Assemblerprogramm:
     (ebenfalls in der DOS-IDE eingeben und unter TIMERCMP.ASM speichern)

     org $101
   
     lda #255                    ; Port B als Ausgang schalten
     sta $05
     lda #(mytimercmp-$100)      ; eigene Interruptroutine setzen
     sta $52
     rts                         ; Ruecksprung zu BASIC
   
   mytimercmp:
     lda $00                     ; Port A nach
     sta $01                     ;   Port B schreiben
     lda #1                      ; Betriebssystemroutine aufrufen
     rts                         ; Ruecksprung zum Betriebssystem


 Um eine eigene Interruptroutine in das System einzubinden muss einer der
 vier Userpointer (an Adresse $50, $51, $52 oder $53) mit der Adresse der
 entsprechenden Routine geladen werden. Da hierfuer nur ein Byte zur
 Verfuegung steht, wird die Adresse relativ zum Beginn des EEPROMs (Adresse
 $100) angegeben.

 Eine eigene Interruptroutine muss immer mit RTS (nicht RTI) beendet werden.
 Wird im Akkumulator als letzter Wert null gespeichert, dann wird die
 Betriebssystemroutine die eigentlich fuer das Bedienen des Interrupts
 zustaendig ist nicht mehr aufgerufen. Hiermit kann das Betriebssystem also
 voellig "ausgeschaltet" werden. Ich habe im obigen Beispiel als letzten Wert
 eine Eins in den Akkumulator gespeichert und so dem Betriebssystem
 signalisiert, dass die normale Routine weiterhin aufgerufen werden soll.

 Zu beachten ist auch, dass die eigene Interruptroutine nicht zu lang geraten
 darf, denn wenn ein weiterer Interrupt auftritt bevor die Interruptroutine
 abgearbeitet wurde fuehrt das zum "Verschlucken" von folgenden Interrupts.

   Die folgenden vier Pointer stehen fuer Interruptroutinen zur Verfuegung:

              $50 = IRQPTR (Userpointer fuer IRQ-Interrupt)
              $51 = CAPPTR (Userpointer fuer TIMERCAP-Interrupt)
              $52 = CMPPTR (Userpointer fuer TIMERCMP-Interrupt)
              $53 = OFLPTR (Userpointer fuer TIMEROFL-Interrupt)

 Leider ist es nicht moeglich, eigene Routinen in den Serial Communications
 Interface Interrupt, in SWI oder RESET einzubinden.

 Genauere Informationen wie ein Interrupt arbeitet oder welche Register nach
 einem Interrupt wieder initialisiert werden muessen, kann dem
 Betriebsystemlisting (CCBASROM.TXT) oder dem MC68HC05B6-Manual der Firma
 Motorola entnommen werden.


 Ŀ
                Benutzung der A/D-Ports als Digitaleingaenge               
 

 Es scheint wenig bekannt zu sein, dass die A/D-Ports als zusaetzliche
 digitale Eingaenge benutzt werden koennen. Hierzu steht, zusaetzlich zu den
 Ports mit denen der A/D-Wert (0..255) ausgelesen werden kann, der Port D an
 Adresse $03 zur Verfuegung. Leider unterstuetzt das Betriebssystem der C-
 Control/BASIC-Unit nicht dieses zusaetzliche Feature des MC68HC05B6-
 Mikrokontrollers, so dass eine Nutzung wohl nur Assemblerprogrammierern
 vorbehalten ist.


 Ŀ
                    Taktfrequenz bis auf 12 MHz erhoehen                   
 

 Wie das Conrad Electronic Technologie Centrum am 15. September 1998 ueber
 ihr Forum zum C-Control/BASIC-Chip verlauten liess kann die Taktrate des
 Minicomputersystems problemlos bis auf 12 MHz erhoeht werden. Dazu muss ein
 anderer Quarz, bzw. Schwinger eingeloetet werden. Manche Exemplare sollen
 sogar mit 16 MHz noch funktionieren.

 Der Mikrokontroller koennte sogar noch weit ueber 20 MHz getrieben werden
 (obwohl er von Motorola nur bis 4 MHz spezifiziert wurde), doch das serielle
 EEPROM 24C65 ist zu langsam.

 Zu beachten ist aber, dass sich durch den Einbau eines anderen Quarzes die
 Baudrate der RS232-Schnittstelle aendert. Ausserdem laeuft die Uhr schneller
 und die Stromaufnahme der Unit wird erhoeht.


 Ŀ
                Internes EEPROM nicht unnoetig strapazieren                
 

 Wenn ein Programm geschrieben werden soll, das sowohl BASIC- als auch
 Assembler-Code enthaelt, sollte darauf geachtet werden, dass jedes
 Neuprogrammieren des internen EEPROMs (mit "Systembytes") schaedlich auf
 dieses wirkt.

 Falls die Assemblerroutinen des Programms fehlerfrei funktionieren und nur
 noch Aenderungen an dem BASIC-Code durchgefuehrt werden muessen, sollte vor
 dem Uebertragen des Programms zur C-Control Unit der SYSCODE-Befehl
 auskommentiert werden. In diesem Fall wird das Assemblerprogramm (das sich
 ja im internen EEPROM gefindet) nicht veraendert und so wertvolle
 Schreibzyklen gespart. Laut Motorola vertraegt das interne EEPROM nur 10000
 (in Worten: zehntausend) Programmierzyklen!


 Ŀ
                EEPROM-Datendatei nicht unnoetig schliessen                
 

 Das Betriebssystem unterscheidet bei einem CLOSE#-Befehl nicht ob die im
 seriellen EEPROM befindliche Datendatei zum Lesen oder zum Schreiben
 geoeffnet wurde. Das hat die Konsequenz, dass der CLOSE#-Befehl
 grundsaetzlich von einem schreibenden Zugriff ausgeht und so auch nach dem
 Lesen den Zaehler fuer die Groesse der Datei ins EEPROM programmiert.
 Dadurch werden unnoetig Programmierzyklen des EEPROMs verschenkt. Da sich
 die Anzahl der Bytes in der Datei durch einen lesendem Zugriff natuerlich
 nicht aendert, wird der gleiche Wert in die entsprechende EEPROM-Adresse
 geschrieben, der schon auf der Adresse steht. Ob das 24C65-EEPROM dies
 erkennt und das Umprogrammieren als unnoetig ansieht und deshalb nicht
 durchfuehrt, ist aus dem Manual zum EEPROM von Microchip (meines Wissens)
 nicht ersichtlich.

 Auf diesem Grund sollte auf den CLOSE#-Befehl bei einem lesenden Zugriff auf
 die Daten im EEPROM (OPEN# FOR READ) verzichtet werden.


 Ŀ
           High Endurance Block des seriellen EEPROMs verschieben          
 

 Eigentlich wollte ich meiner Informationssammlung zur C-Control-Unit auch
 ein getestetes Programm zum Verschieben des High Endurance Blocks des
 seriellen 24C65'er EEPROMs beilegen. Doch selbst naechtelange Versuche
 meinem EEPROM mittels Ozilloskopkarte, Manual und unzaehligen
 Assemblerprogrammen das Verschieben des Blocks beizubringen blieben ohne
 Erfolg. Warum alle meine Versuche zum scheitern verurteilt waren viel mir
 erst sehr viel spaeter beim Blick auf die Platine meiner M-Unit auf: Diese
 ist naemlich nicht mit dem 24C65'er EEPROM von Microchip, sondern mit dem
 24C64 von der Firma SGS Thomson bestueckt. Und dieser Speicherchip hat gar
 keinen High Endurance Block!

 Der arme Chip war selbst durch den recht harmlosen Versuch, die Lage des
 High Endurance Block auszulesen so verwirrt, dass er das naechste Byte das
 nach dem Leseversuch uebertragen wurde nicht einmal mehr per Acknowledge-
 Signal bestaetigte.

 Aus diesem Grund ist es mir leider unmoeglich, das Assemblerprogramm, das
 ich zum Auslesen und Setzen der Lage des High Endurance Block geschrieben
 und dieser Informatinssammlung beigelegt habe richtig zu testen. Nach dem
 was laut meiner Scopekarte am I2C-Bus anliegt, sollte das Programm aber
 fehlerfrei arbeiten. Vielleicht kann es ja jemand anderes (der ein 24C65
 EEPROM besitzt) austesten?!

 Wie ein 24C65-Chip auf das Verschieben des High Endurance Blocks reagiert
 kann ich nicht genau (vorher-)sagen. Vermutlich muss der Mikrokontroller
 mitsamt EEPROM nach dem Verschieben resettet und das BASIC-Programm erneut
 ins serielle EEPROM programmiert werden.

 Das Assemblerprogramm zum Lesen und Schreiben der Lage des High Endurance
 Blocks heisst auf jeden Fall HIGHENDU.ASM und benoetigt nach dem
 Assemblieren das BASIC-Programm HIGHENDU.BAS zum Compilieren und Ausfuehren.
 Die Signalverlaeufe auf dem I2C-Bus beim Setzen des Blocks auf Block Nummer
 14 sind in der Grafik HIGHENDU.GIF dargestellt.


 -----------------------------------------------------------------------------
 Diese Textdatei gehoert zur Informationssammlung von Dietmar Harlos zum
 C-Control/BASIC-Chip. Die Fehlerfreiheit der Angaben kann nicht garantiert
 werden. Die kommerzielle Nutzung irgendeiner Information oder eines
 Verfahrens dieser Sammlung ist ausdruecklich untersagt! Weitere Informationen
 zum Copyright entnehmen Sie bitte der Datei INFO.TXT.
 -----------------------------------------------------------------------------

