Wenn die Datei, die mit der Anweisung
CodeBox C
#include <avr/io.h>
automatisch für jeden Controller eingebunden wird (in C im AtmelStudio, für Assembler heißt sie wohl [controler]def.inc und man muß den Typ selbst festlegen), so aufgebaut wäre, wie bei den Xmegas, enthielte sie u.a. folgendes:
Code:
#define TC1_OFF_bm 0x00
#define TC1_DIV1_bm 0x01
#define TC1_DIV8_bm 0x02
#define TC1_DIV64_bm 0x03
#define TC1_DIV256_bm 0x04
#define TC1_DIV1024_bm 0x05
#define TC1_EXT_FALLING_bm 0x06
#define TC1_EXT_RISING_bm 0x07
#define TC1_CS_gm 0x07
...
#define SM_IDLE_bm 0x00
#define SM_ADC_NOISE_REDUCTION_bm 0x02
#define SM_POWER_DOWN_bm 0x04
#define SM_POWER_SAVE_bm 0x06
#define SM_STANDBY_bm 0x0C
#define SM_EXTENDED_STANDBY_bm 0x0E
#define SM_gm 0x0E
Statt 0x0E kann man auch schreiben 0b00001110 (oder 14, aber dann sieht man die Bits nicht).
Das ist eine Bitmap. Da braucht man weder die einzelnen Bitpositionen der Bits SM0, SM1 und SM2 zu kennen, noch braucht man sie alle einzeln zu schreiben und zu schieben. (Das macht zwar der Präprozessor, aber ich finde die Schreibweise einfach total unübersichtlich)
In der Datei würde dann auch nicht nur stehen:
CodeBox C
#define TC1_ICIE_bm 0x20
sondern auch :
CodeBox C
#define TC1_ICIE_bp 5
In der jetzigen Form der Datei steht nur die zweite Definition und das angehängte _bp fehlt, weil ja für alles
nur die BitPosition angegeben ist.
Bei den Xmegas sind jeweils Bitmap, Bitposition und Groupmap und Groupposition angegeben (SM0..2 und CS10..12 sind im obigen Beispiel Gruppen).
Natürlich verwende ich Namen für die Bitmasken.
Wenn ich dem Prescaler sagen will, er soll durch 1024 teilen, schreibe ich
CodeBox C
TCCR1B |= TC1_DIV1024_bm
und um sicherzugehen, daß alle Bits für den Prescaler auf Null sind schreibe ich davor noch
CodeBox C
TCCR1B &= ~TC1_CS_gm
Daß die WG-bits auf zwei Register aufgeteilt sind, ist hier etwas umständlich. Beim Xmega sind alle in einem.
So wie Du schreibst
CodeBox Assembler
LDI Rd, (1<<CS10)|(1<<CS12)|(1<<WGM12)
OUT TCCR1B, Rd
löschst Du übrigens die Bits ICNC1 und ICES1.
Um das zu vermeiden, müßtest Du (wenn ich mich recht erinnere) schreiben
CodeBox Assembler
LDI Rd, (1<<CS10)|(1<<CS11)|(1<<CS12)|(1<<WGM12)|(1<<WGM13)
COM Rd
IN Re, TCCR1B
AND Re, Rd
LDI Rd, (1<<CS10)|(1<<CS12)|(1<<WGM12)
OR Re, Rd
OUT TCCR1B, Re
Da ist es doch wesentlich einfacher, gleich die Namen der Bitmaps TC1_CS_gm und TC1_DIV1024_bm zu benutzen. Die entsprechenden WG-Bits kann man mit den dazu passend definierten Masken auch gleich löschen und setzten.
Aber zurück zu Bascom. Ich weiß nicht ob die Atmel Toolchain benutzt wird oder was eigenes, aber da hier vieles vereinfacht und vor dem Benutzer verborgen wurde, nehme ich mal an, daß das Zweite zutrifft.
Wer den Bascom Compiler installiert hat, kann ja mal in der Datei [controler]def.dat nachsehen, wie das dort definiert wurde.