Avr

Avr ist die Basis-Klasse (der Controller). Die Eigenschaft „Device“ muss als erste Eigenschaft vor allen Anderen gesetzt werden.

Eigenschaften (nur schreiben)
Name Beschreibung Wert
Avr.Device=Controllername Controller-Klasse wählen1) Name
Avr.Clock=Konstante Taktrate in Hz 2) > 0
Avr.Stack=Konstante Stackgröße in Bytes. > 1
Avr.Isr.<InterruptAdr>=Isr-Label Direktes Setzen einer Interrupt-Serviceroutine.3) Adresse
Avr.CodeStartAddr=Adresse Startadresse des Codes setzen, z.Bsp. für Bootloader „avr.CodeStartAddr = LARGEBOOTSTART“. Führt dazu, dass der erzeugte Maschinencode ab der angegebenen Adresse im Programmspeicher geschrieben wird. Adresse (Wordorientiert)
Eigenschaften (nur lesen)
Name Beschreibung Typ
Ergebnis = Avr.StackPointer Aktuelle Position des Stackpointers word
Eigenschaften (lesen/schreiben)
Name Beschreibung Typ
Avr.<Portname>[.<datatype>] Direkter Zugriff auf sämtliche Ports des Controllers. Die optionale Angabe eines Datentyps (byte, word, integer, long, ..) spezifiziert die Zugriffsart beim lesen/schreiben. Vorgabe: byte
Avr.<Portname>.<Bit> Direkter Zugriff auf die Bits des angegeben Ports. byte
Methoden
Name Beschreibung
Avr.Interrupts.enable Globale Interrupts einschalten
Avr.Interrupts.disable Globale Interrupts ausschalten
Avr.Idle Ruft das Idle-Event auf, sofern vorhanden.

Beispiel

avr.device = atmega32 // Atmega32
avr.clock = 8000000   // 8 Mhz Taktrate
avr.stack = 32        // 32 Bytes Programmstack
// Programmcode

Stack-Größe

Die Größe des benötigten Stacks richtet sich nach der Anzahl der Parameter und lokalen Variablen, sowie der Verschachtelungstiefe von Methodenaufrufen. Bei Verschachtelten Aufrufen addieren sich die benötigten Anzahl bytes. Eine Methode benötigt mindestens 2 bytes (Rücksprungadresse). Hinzu kommen die Parameter und deklarierte Variablen (sofern vorhanden).

Controller-Ports und -Konstanten

Neben den abgebildeten Objekten und Funktionen kann man wie in C/Assembler auf die Ports des Controllers direkt zugreifen. Weiterhin sind alle im Datasheet benannten controllerspezifischen Bitnamen bzw. Eigenschaften der jeweiligen Ports standardmäßig definiert. Im Editor der Luna-IDE werden sie bei korrekter Schreibweise/Existenz auf dem aktuell im Source definierten Controller farblich hervorgehoben. Die Ports und Namen werden beim Einladen und Speichern der Source-Datei anhand der avr.device-Eigenschaft aktualisiert.

Allgemein gilt:

  • Ohne Angabe des Klassennamens „Avr“ werden sämtliche vom Hersteller vordefinierten Ports und Konstanten als Konstante interpretiert
  • Mit Angabe des Klassennamens „Avr“, werden Ports wie Variablen behandelt (die Portinhalte werden gelesen oder geschrieben). Controller-Konstanten werden als normale Konstanten behandelt. Was davon Ports und was Konstanten sind, entnimmt man entweder dem Datenblatt oder in der IDE der entsprechenden Übersicht.

Syntax

value = avr.SREG        'default datentyp ist byte
avr.TCNT1.Word = value  'wortbreiten Zugriff spezifizieren (schreibend)
value = avr.TCNT1.Word  '(lesend)

Siehe Hierzu: Ermitteln von Controllerspezifischen Werten und Konstanten.

Beispiel

avr.device = atmega32 // Atmega32
avr.clock = 8000000   // 8 Mhz Taktrate
avr.stack = 32        // 32 Bytes Programmstack
 
dim a as word
dim b as byte
 
avr.TIMSK = 1<<TOIE1 or 1<<OCIE1A      ' Timer 1 und Compare1A aktivieren
a.LowByte = avr.TCNT1L                 ' Low-Byte des Timer-Counters lesen
a.HighByte = avr.TCNT1H                ' High-Byte des Timer-Counters lesen
 
avr.TCNT1H = a.HighByte                ' High-Byte des Timer-Counters schreiben (beim Schreiben immer High-byte zuerst!)
avr.TCNT1L = a.LowByte                 ' Low-Byte des Timer-Counters schreiben
avr.DDRA.PINA0 = 1
b = avr.PORTA.PINA0
avr.Isr.ICP1Addr = myIsr
 
do
loop
 
isr myIsr
 [..]
endisr
1) Avr.Device ist auch lesbar, gibt jedoch einen String als Konstante zurück
2) Das setzen dieser Eigenschaft beeinflusst nicht die physikalische Taktrate, sondern definiert sie für verschiedene darauf zugreifende Funktionen, damit diese wie erwartet funktionieren können.
3) ab Version 2012.r4. InterrupAdr ist die Hardware-Interruptadresse im Interruptvektor des Controllers, z.Bsp. ICP1Addr.