Tips

ATtiny und BascomAVR


Einige Controller der ATtiny-Serie von Atmel enthalten keinen internen SRAM. Dies ist der Grund, warum viele der Basic-Befehle bei solchen Controllern versagen oder der Compiler bereits beim Übersetzungsvorgang Fehler und Warnungen ausgibt. Grundsätzlich basieren viele Bascom Befehle auf der Existenz eines vorhandenen SRAM-Speichers.

Wie kommt das, und wie man dieses Dilemma umgehen kann möchte ich hier etwas verdeutlichen.
Um aber die Hintergründe besser verstehen zu können, möchte ich hier zunächste einige exemplarische Anhaltspunkte und Infos liefern.
 
 

So gehts nicht! - Und warum


Standart-Initialisierung des Controllers

In Bascom wird üblicherweise eine Initialisierung vorgenommen.
Es liegt also nahe, dies so auch mit einem ATtiny zu versuchen.


' Fehlerhafte Initialisierung für ATtiny
$regfile = "attiny12.dat"                                   ' Controller ATtiny12
$crystal = 1000000                                          ' Takt 1MHz
$hwstack = 32                                               ' Hardware-Stack
$swstack = 8                                                ' Software-Stack
$framesize = 24                                             ' Framesize


Doch diese Initialisierung schlägt fehl. - Natürlich wegen dem fehlenden SRAM-Speicher.

Erklärung:
Die Anweisung $regfile definiert den Controller. Soweit auch richtig. Jedoch macht diese Routine bei Bascom viel mehr. Sie initialisiert beispielsweise die Interrupt-Vektor Tabelle und setzt den SRAM auf definierte Werte. Da wir kein RAM haben gibts hier schon die erste Kollision mit dem Compiler. Die Anweisung $hwstack ist ebenso unsinnig, da der Tiny keine 32 Byte Hardware-Stack besitzt. Ähnlich verhält es sich bei den Anweisungen $swstack und $framesize. Diese beiden Befehle benötigen SRAM-Speicher.
 
 

Aufruf von Funktionen und Subs mit Parameter

Beim Aufruf werden die Parameter in den Speicherbereich ($Framesize) übergeben, der wie ein Stack arbeitet. Das Statement $Framesize definiert die Speichergröße für Parameterübergabe und Rückgabewerte. Dieser Speicher wird vom SRAM abgezwackt.

Folge:
Alle (oder zumindest die meisten) Basic-Routinen mit Parameter oder Rückgabewerte dürften nicht mehr funktionieren, da sie Framesize benötigen.
 

Variablen definieren

Die übliche Art Variablen mit dem DIM-Statement zu definieren geht nicht mehr. Beispiel:


' Fehlerhafte DIM-Anweisung für ATtiny
Dim a as byte
Dim b as Word


Diese Art der der Dimensionierung von Variablen erwartet SRAM. Doch es gibt einen recht schlecht dokumentierten Befehl, der die Variablendimenionierung dennoch zuläßt. Später dazu mehr.
 
 
 

So macht man es richtig!


Initialisierung

Bascom bietet diverse Unterstützung bei der Verwendung von Controllern, die kein SRAM besitzen. Dazu zählen die folgenden Compiler-Anweisungen:

Compiler-Anweisungen
Directive Beschreibung
$TINY Sorgt dafür, dass keine Hardware-Stack Initialisierung durchgeführt wird.
$NORAMCLEAR Sorgt dafür, dass keine SRAM-Initialisierung durchgeführt wird.
$HWSTACK Initialisiert den Hardware-Stack. Tiny's werden mit der Directive $TINY initialisiert. Die Anweisung kann entfallen
$SWSTACK Sorgt für die Initialisierung und Speicherzuweisung (vom SRAM) des Software-Stack.
Ein ATtiny hat jedoch kein SRAM, deshalb muss der Software-Stack mit 0 (null) initialisiert werden.
$FRAMESIZE Sorgt für die Initialisierung und Speicherzuweisung (vom SRAM) des Framesize.
Ein ATtiny hat jedoch kein SRAM, deshalb muss der Framesize mit 0 (null) initialisiert werden

 

Eine Initialisierung eines ATtiny12 mit Bascom sieht dann wie folgt aus:


' Initialisierung MCU = ATTiny12 ohne SRAM

$regfile = "attiny12.dat"                                   ' Controller = ATtiny12
$crystal = 1000000                                          ' Takt 1MHz
$noramclear                                                 ' RAM nicht initialisieren
$Tiny                                                       ' Stack nicht initialisieren
'$hwstack = 32                                              ' Stackinitialisierung wird durch $TINY unterdrückt
$swstack = 0                                                ' Software 0
$framesize = 0                                              ' Framesize = 0

Erklärung:
Eine Erklärung liefert bereits die Tabelle mit den Compiler-Anweisungen. So läßt sich das Programm compilieren, ohne dass der Compiler etwas beanstandet.
 
 

Variablen definieren

Wie bereits erwähnt, können Variablen nicht im SRAM definiert werden. Wir erinnern uns? (Kein SRAM!)
Aber hier unterstützt uns Bascom wieder: Es gibt einen ganz schlecht dokumentierten Befehl, der es erlaubt, Variablen in Registern zu definieren. Das Zauberwort heißt IRAM. Der Trick ist, dass Register als Speicher für Variablen verwendet werden. Der ATtiny12 hat beispielsweise Register R0 bis R31, die für solche Zwecke verwendet werden können.

Beispiele für Variablen-Definitionen:


Dim a as iram Byte                                          ' Variablen als IRAM definieren
Dim b as iram Byte                                          ' Variablen werden dann in Registern abgelegt

' oder

Dim c as iram Byte at &h0A overlay                          ' Register R10 als Variable C
Dim d as iram Word at &h0b overlay                          ' Register R11 + R12 als Variable D

' oder andere Schreibweise:

Dim c as iram Byte at 10 overlay                            ' Register R10 als Variable C
Dim d as iram Word at 11 overlay                            ' Register R11 + R12 als Variable D

Erklärung:
Ohne Angabe der Adresse weist Bascom ein Register als Variable zu. Bascom beginnt hierbei bei dezimal 8 bzw. Register R8.
 
 

Unterprogramme und Interrupts.

Der ATtiny12 besitzt keinen Hardware-Stack wie die ATmega-Serie. Hier werden intern spezielle Register zur Sicherung des PC (Programmcounter) verwendet. Hierbei sind max. 3 Ebenen zugelassen. Man muss also beachten, dass nicht mehr als 3 Rücksprung-Adressen auf den Stack liegen können, sonst wird der erste Wert überschrieben was einem Absturz gleich kommt.

Man kann also Grundsätzlich sagen, dass bei Verwendung von Interrupts mindestens eine Rücksprung-Adresse gesichert wird. Wenn man in der Unterroutine keinen CALL oder RCALL (Gosub) ausführt. Somit bleiben 2 Ebenen für das Hauptprogramm.
 

Fazit


Die Programmierung ohne SRAM ist zwar nicht unmöglich, rechterfigt jedoch den Programmieraufwand meiner Meinung nach nicht, einen solchen Typ zu verwenden. Ich empfehle den ATtiny13 anstelle des ATtiny11/12 zu verwenden. Er ist ebenfalls im DIL-8 Gehäuse erhältlich, weist jedoch immerhin schon einen SRAM-Speicher von 64 Byte auf und bietet eine wesentlich bessere Funktionalität der Pins. Die ganze Problematik, die oben beschrieben ist, wird somit ganz oder zumindest teilweise entschäft.
 
 
Copyright M.Ruhwald @ 2009
www.MitchSoft.de