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.
Verwendung
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