Danke erstmal für die Erklärung ... ;)
Und was wird hiermit angesprochen:
Code:(1 << WGM10) | (1 << COM1A1) | (1 << COM1B1)
Druckbare Version
Danke erstmal für die Erklärung ... ;)
Und was wird hiermit angesprochen:
Code:(1 << WGM10) | (1 << COM1A1) | (1 << COM1B1)
WGM10, COM1A1 und COM1B1 sind eigentlich zahlenwerte. diese sind schon vorher defineirt wurden (in einer der INCLUDE-dateien). dabei geht es um bestimmte bits, zB ist das bit WGM10 glaube ihc das bit 0, com1a1 das bit 6. man könnte also auch schreiben 1<<0 | 1<<6 usw.
diese namen sienen nur der übersichtlichkeit, so weiss man ohne nachzusehen WELCHE bits nun gesetzt wurden. ist ja auch einfach im sicherungskasten namen daneben zu shreiben als sich zu merken, dass sicherung nummer 23 für die steckdosen in der küche sind =)
das | (oder) dient der verknüpfung, es werden also alle 3 angesprochenen bits mit einem mal gesetzt.
Also könnte ich auch folgendes dafür schreiben:
Code:ldi temp, (1 << WGM10)
out TCCR1A, temp
ldi temp, (1 << COM1A1)
out TCCR1A, temp
ldi temp, (1 << COM1B1)
out TCCR1A, temp
Hallo H3IIGhost
Lass es mich einmal so sagen, im Prinzip ja, aber am Ende deines Programms ist nur das Bit für COM1B1 gesetzt. Du überschreibst das Register TCCR1A immer wieder.
damaltor hat es richtig Beschrieben. WGM10 , COM1A1 und COM1B1 stehen für Bitpositionen. Sie sind in der Definitationsdatei m8def.inc zum ATmega8 beschrieben.
z.B
.equ WGM10 = 0
Der Ausdruck steht also für den Wert 0, unabhängig davon auf was er angewendet werden soll. Wenn der Assembler auf einen solchen Ausdruck trifft, durchsucht er die include dateien nach diesem Ausdruck. Und wenn er ihn findet, dann ersetzt er ihn durch den zugeordneten Wert. Du könntest auch WGM10 = 0 durch Otto10 = 0 ersetzen, das Ergebnis wäre das Gleiche. Genau so Verhält es sich auch mit COM1A1 = Bitposition 7 und COM1B1 = Bitposition 5. So ist also WGM10 ein synonym für 0. Der Ausdruck in dieser Zeile besagt also, setzte im Register temp
( synonym für r16 ) an der Bitposition 0 eine 1. Danch führe eine ODER Verknüpfung an den Bitpositionen 5 und 7 mit dem Register temp durch.
Diese Anweisung kann ersetzt werden durch
ldi temp, 0xA1
oder
ldi temp, 0b10100001
Das Ergebnis ist immer gleich. Die Bits 0 - 5 - 7 werden auf 1 gesetzt und die andern Bits bleiben auf 0.
Es ist nur nicht mehr so einfach zu Verstehen, was da gemacht wird.
Diese ODER Verknüpfung fehlt noch in deinem Programm.
MfG
A.Hoffmann