Projekt
BASIC
Beispiele
Erweiterungen

AVR-ChipBASIC-32: Ein BASIC-programmierbarer Einchip-Computer mit ATMega32

V0.97 (c) 2006-2016 Jörg Wolfram




1 Lizenz

Das Programm unterliegt der GPL (GNU General Public Licence) Version 3 oder höher, jede Nutzung der Software/Informationen nonkonform zur GPL oder ausserhalb des Geltungsbereiches der GPL ist untersagt! Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, auch ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK.

2 Geschichte und Features

Nachdem ich mich nach langer 8051'er Zeit mit den mit der AVR-Assemblerprogrammierung beschäftigt hatte, war es einfach Zeit, die Grenzen ein bisschen auszuloten.
Herausgekommen ist dabei ein kleiner in einer Tiny-Basic sehr ähnlichen Sprache programmierbarer Computer mit umfangreichen Schnittstellen und Funktionen. Als Eingabegerät dient eine normale PS2-Computertastatur, als Ausgabegerät ein Fernsehgerät mit Scart-Eingang (Farbe) oder BAS-Eingang (Graustufen) oder auch verschiedene PAL-/NTSC-taugliche TFT-Displays.

  • 51 Programmzeilen mit maximal 32 nutzbaren Zeichen, Fullscreen-Editor
  • 4 Programme im internen Flash
  • Basic-Programmiersprache mit abkürzbaren Schlüsselwörtern
  • 30x23 Zeichen mit maximal 8 Farben, Pseudografik
  • PAL/NTSC und Synchronsignale über Jumper einstellbar
  • PS2-Tastatur zur Eingabe
  • 1-Kanalige Audioausgabe (Noten, Rauschen) mit Hüllkurve
  • serielle RS232-Schnittstelle mit 1200 Baud und Ladungspumpe
  • parallele Druckerschnittstelle, auch als I/O und Analogeingänge nutzbar
  • optionales Daten-EEPROM (24C64) für Datenlogger etc
  • I2C-Anschluß für bis zu 8 LM75 Temperatursensoren
  • Up/Download von Programmen über die serielle Schnittstelle
  • Listingdruck über die Druckerschnittstelle
  • automatischer Start des Programmes nach Einschalten über Jumper einstellbar
  • Tastenkombinationen für Abbruch, Neustart, Screenshot
  • Einfacher Monitor mit Variablen- und Stackanzeige, Einzelschrittbetrieb
  • universelle I2C-Ansteuerung
  • Funktionen für ATMEL Dataflash
  • NEU: Variante mit US-Keyboard Belegung


3 Hard- und Softwarekonzept

Kernstück des Ganzen ist ein ATmega32, die restliche Hardware besteht im Wesentlichen aus passiven Bauelementen und Steckverbindern. Timer 1 ist für das Videotiming zuständig. Kanal A arbeitet als PWM und erzeugt den Zeilen-Synchronimpuls. Im CSYNC-Mode wird während des vertikalen Synchronimpulses die PWM so umkonfiguriert, dass der Ausgang invertiert wird.
Kanal B von Timer 1 erzeugt den (Horizontal-) Videointerrupt. Dieser enthält eine Synchronisation auf den Timer, dadurch erzeugen auch EEPROM-Lesezugriffe mit 5 Takten CPU-Stop keine Bildstörungen. Timer 2 erzeugt PWM mit dem Audiosignal. Dieses wird entweder mit dem (Pseudo-)Zufallsgenerator oder per DDS mit Wavetable und Hüllkurve erzeugt.
Entgegen den meisten anderen Lösungen ist die PS2-Tastatur and den USART des ATMega angeschlossen. Eine Nutzung externer Interrupts verbietet sich schon wegen des Videotimings, man kann zwar das Clock-Signal während der Bilddarstellung auf LOW ziehen und damit die Tastatur zum Warten verdonnern, aber nicht jede Tastatur schafft es, ein Datenpaket während der Austastlücke zu senden und bei NTSC klappt das Ganze dann aber gar nicht mehr, weil dort die Austastlücke noch kürzer ist. Die zweite Möglichkeit wäre die SPI-Schnittstelle, aber die ist dann auch belegt. Und gerade während der Entwicklungsphase ist es lästig, wenn man ständig die Tastatur abziehen und anstecken muss. Die Nutzung des USART hat hingegen den grossen Vorteil, dass alles automatisch geht und man nur noch das fertige Zeichen abholen muss.
Wobei sich natürlich dann die Frage stellt "und was ist mit seriell?" Mit reduzierter Bitrate (1200Baud) lässt sich die serielle Schnittstelle im Horizontal-Interrupt mit zwei Portpins realisieren. Timerausgang von Timer 0 treibt eine Ladungspumpe, die ca. -4,7V für die serielle Schnittstelle bereitstellt, dadurch sind keine Spezialbausteine (MAX232 etc.) notwendig. Um Strom zu sparen, lässt sich diese Funktion auch per Software abschalten.
Die parallele Schnittstelle wird über Port A realisiert (+2 Steuerleitungen aus Port B). Wenn keine Druckerschnittstelle benötigt wird, können die 8 Pins als Ein-/ oder Ausgang konfiguriert oder auch als Analogeingang genutzt werden. Die meisten Funktionen werden über die libmio Bibliothek realisiert, die sich auch für eigene Projekte verwenden lässt. Allerdings steht dort noch die Dokumentation aus.

4 Systemvoraussetzung Host

Da fast alle I/O-Funktionen von der libmio bereitgestellt werden, sind zum Assemblieren avr_libmake (läuft nur unter Linux) und der AVRA-Assembler notwendig. Das Hex-File sollte sich auch unter anderen Betriebssystemen brennen lassen. Für die Funktionen der seriellen Schnittstelle sollte folgende eingestellt werden
8 Bit --- 1200 Baud --- no Parity --- 1 Stopp-Bit

5 Tastatur

Die vorliegende Version benötigt entweder eine Tastatur mit deutschem oder US Layout, dies ist nicht umschaltbar sindern es muss die entsprechende Version geflasht werden (main_de.hex oder main_us.hex) Bei Bedarf kann ich auch das Programm an andere Tastaturbelegungen anpassen. "Das Beste aus allen Systemen" ist in den Tastenkombinationen wiederzufinden:

  • CTRL+ALT+DEL startet komplett neu, dabei werden alle Variablen gelöscht
  • CTRL+C unterbricht das Programm zum nächst möglichen Zeitpunkt
  • CTRL+P sendet einen Screenshot an die serielle Schnittstelle
  • F12 unterbricht das Programm und ruft den Monitor auf
Für den Screenshot wird das Programm screenshot.pl im libmio/tools-Verzeichnis benötigt. Es benötigt ImageMagick und wird mit "./screenshot.pl dateiname.endung" aufgerufen. Danach kann dann der Screenshot vom Controllerboard ausgelöst werden. Wer die Funktion auf andere Betriebssysteme übertragen will, es ist recht einfach:
  • alle Zeichen des Bildwiederholspeichers werden nacheinander als 2 Hexadezimalzeichen gesendet
  • Am Schluss jeder Zeile wird ein LF (0x0a) gesendet


6 Der Editor

Die Programme werden mit einem einfachen Fullscreen-Editor geschrieben. Ganz oben steht der Programmname. Sobald der Text verändert wird, erscheint in der oberen linken Ecke ein Stern. Die Position des Cursors wird durch ein invers blinkendes Zeichen dargestellt. Unten befindet sich eine farbige Statuszeile, in der z.B. Fehler angezeigt werden.
  • Standardmäßig wird eingefügt, Zeichen unter/rechts vom Cursor wandern nach rechts
  • Die Cursor-Tasten bewegen den Cursor im Textfeld, bei Bedarf wird der Text gescrollt
  • Die Page-tasten bewegen den Cursor um 8 Zeilen.
  • Mit der Taste POS1 wird der Cursor auf das erste Zeichen der aktuellen Zeile gesetzt.
  • Mit der Taste ENDE wird der Cursor auf das letzte Zeichen der aktuellen Zeile gesetzt.
  • Mit der Taste DEL wird das Zeichen unter dem Cursor gelöscht, von rechts rücken Zeichen nach.
  • Mit der Backspace-Taste wird das Zeichen links neben dem Cursor gelöscht, von rechts rücken Zeichen nach.
  • Mit der ENTER Taste wird an den Anfang der nächsten Zeile gesprungen
  • Mit der Tastenkombination ALT+INS wird an der aktuellen Cursorposition eine Zeile eingefügt. Alle Zeilen ab der Cursorposition wandern nach unten, die bisherige letzte Zeile geht dabei verloren.
  • Mit der Tastenkombination ALT+DEL wird die Zeile der aktuellen Cursorposition gelöscht. Alle Zeilen unterhalb der Cursorposition wandern nach oben, unten wird eine Leerzeile angefügt.
  • Mit der Tastenkombination CTRL+C wird die aktuelle Zeile in den Puffer kopiert. Angezeigt wird das durch ein # und die Zeilennummer in der rechten oberen Bildschirmecke.
  • Mit der Tastenkombination CTRL+X wird die aktuelle Zeile in den Puffer verschoben. Angezeigt wird das durch ein # und die Zeilennummer in der rechten oberen Bildschirmecke.
  • Mit der Tastenkombination CTRL+V wird der Puffer in die aktuelle Zeile kopiert. Die Puffer-Anzeige rechts oben verschwindet wieder.
  • Mit der Taste F2 kann das aktuelle Programmm im internen EEPROM gespeichert werden.
  • Mit der Taste F3 kann der letzte Programmstand aus dem internen EEPROM geladen werden.
  • Mit der Taste F8 wird das Programm im Editor gelöscht.
  • Mit der Taste F9 wird der Programmname geändert. Dabei funktionieren nur die Buchstaben- und Zifferntasten, sowie die Pfeiltasten nach links und rechts. Mit "ENTER" gelangt man wieder zurück.
  • Mit der Taste F10 wird das aktuelle Programm gestartet.


7 Das Hauptmenü

Das Hauptmenü wird nach jedem Reset angezeigt, ausser der RUN-Jumper ist gesetzt und das Programm startet automatisch,


Die aktuell ausgewählte Funktion ist mit einem grünen Dreieck markiert und kann mittels der Cursortasten geändert werden. Gestartet wird die ausgewählte Funktion mit der Enter-Taste. Bei den meisten Funktionen erscheint noch die Dateiauswahl, in der eines der 4 Programme ausgewählt werden kann.


7.1 Die Dateiauswahl

Da zu den Programmen immer der Name mit abgespeichert wird, gibt es eine einfache Dateiauswahl. Mit den Cursortasten wird das Programm ausgewählt, ENTER startet die Aktion. Mit ESC gelangt man wieder zurück zum Hauptmenü.




7.2 Das Default Programm

Eines von den 4 Programmen lässt sich im Menü als "Default" festlegen. Dieses dient als Vorauswahl in der Dateiauswahl (wird durch grünen Ball markiert) und ist auch das Programm, welches im AutoRun Modus automatisch gestartet wird. Die Auswahl wird im EEPROM gespeichert und geht beim Ausschalten nicht verloren.

7.3 Dateitransfer

Ab Version 0.69 wird anstelle von X-Modem normale Textübertragung verwendet. Unter Windows kann man weiterhin das Hyperterminal verwenden (Text senden/aufzeichnen) verwenden, unter Linux minicom oder das Program chiptrans.pl im Examples-Ordner.


7.3.1 Senden zum AVR


  1. RECEIVE FILE am AVR auswählen
  2. Transfer am PC mit ./chiptrans.pl -w Dateiname starten
  3. am AVR wird das Programm, am PC der Status angezeigt


7.3.2 Empfangen vom AVR


  1. Transfer am PC mit ./chiptrans.pl -r Dateiname starten
  2. SEND FILE am AVR auswählen
  3. am PC wird der Status angezeigt


8 Der Monitor

Ab Version 0.84 gibt es einen kleinen Monitor zum debuggen. Augerufen wird er mit der Taste F12 während des Programmlaufes oder mit einer BREAK-Anweisung im Programm.


Oben rechts steht durch Doppelpunkte getrennt das Programm, die Programmzeile und das gerade abgearbeitete Statement. Darunter die gerade aktive Programmzeile im Quelltext, da nur 30 Zeichen je Zeile dargestellt werden können eventuell die letzten 2 Zeichen der Quelltextzeile fehlen.
Danach folgt im linken Teil des Bildschirms die Anzeige aller Variablenwerte und rechts daneben der Stack. Jede FOR-Schleife und jedes CALL/XCALL erzeugt einen Eintrag auf dem Stack. Unter der Variablenliste wird der Status der parallelen Schnittstelle angezeigt. Zuerst die Pin-Nummern (1 entspricht D0), darunter die Datenrichtung (I oder O) und ganz unten der aktuelle Pegel.
In der untersten Zeile stehen die möglichen Kommandos, der entsprechende Hotkey ist rot hinterlegt:
  • Go beendet den Monitor und setzt die Programmausführung fort
  • Step führt das nächste Statement aus und kehrt zum Monitor zurück
  • View Zeigt den aktuellen Ausgabebbildschirm an, jeder weitere Tastendruck wechselt zur Monitoranzeige zurück
  • eXit beendet den Monitor und löst ein Break aus (beendet das Programm)


9 Changelog

16.3.2007 Erste öffentliche Mega32-Version (0.84)
  • 4 Programme a 51 Zeilen a 32 nutzbare Zeichen im RAM
  • erweiterter Zeichensatz mit Kleinschreibung und mehr Pseudografik
  • Zeichenvorschübe jetzt Unix-konform angepasst (sorry, aber das hat mich einfach genervt)
  • Breakpoints und Monitor zur Fehlersuche
5.4.2007 Version 0.87
  • einige neue Zeichen im Zeichensatz
  • Char-Ausgabe bei PRINT
  • Array jetzt grösser und separat, kann durch Dataflash erweitert werden
  • neue Funktionen DATA um schnell Arrayelemente zu setzen
  • neue universelle I2C Funktion ICOMM
5.4.2007 Bugfix-Version 0.88
  • Ballgate und Pong waren in einer falschen Version dabei
  • Vergrösserung des Stackbereiches, der manchmal in Zeile 51 sichtbar war
  • Editierbereich wurde nicht immer richtig gelöscht
  • Dokumentation für Dataflash-Modul
17.5.2007 Erweiterte Version 0.91
  • Das Array wird jetzt über AR() angeprochen
  • Bugfix: Es liess sich nur das default-Programm senden und empfangen
  • @ zur Cursorpositionierung in PRINT-Ausgaben
  • Erweiterte I2C-Routine
  • Copy und Paste im Editor
28.5.2007 Bugfix-Version 0.93
  • Bugfix: Die ersten beiden Zeichen des Programmnamens wurden beim Speichern abgeschnitten
  • Ein paar Optimierungen im Editor, Zeilenende-Erkennung
  • Bugfix und Erweiterung in der Zeichentabelle
  • Bugfix-Webseite: Darstellungsfehler (Überlauf) bei manchen Firefox-Versionen behoben
04.11.2011 Bugfix-Version 0.96
  • Diverse Bugfixes, die sich im Laufe der Zeit "angesammelt" haben
  • Umstellung aug GPL V3
23.01.2016 Version 0.97
  • Variante für US-Keyboard


created with latex2web.pl v0.63 © 2006-2013 Joerg Wolfram