Nein nein, das mit den Bits in den Registern hast Du falsch verstanden. CS02..CS00 mußt Du als eine binär codierte Zahl verstehen. (WGM, COM0A/Bx usw ebenso) Dabei ist hier die 2 das MSB, 0 das LSB. CS0n steht für: Clock Source (CS) von Timer0 (0), und davon das n-te Bit (von hinten). Als 3-Bit-Zahl können also 8 (2^3) mögliche Clock-Sources vorgegeben werden. Bei 0 (also 000) steht er, bei 1 (001bin) bis 5 (101bin) läuft er mit unterschiedlichen Vorteilern mit dem Prozessortakt, bei 6 (110) und 7 (111) dient der T0-Pin am Controller als Takteingang halt mit fallender bzw steigender Flanke. Siehe Tabelle im Datenblatt auf Seite 73). Du kannst an T0 dann entweder einen ordentlichen Takt anlegen, oder auch irgendwas zählen lassen - deswegen auch Counter.
Knoten jetzt geplatzt?
Bei den Modes, mit dem der Timer dann laufen soll (WGM) ist's halt ähnlich. Auch da der Verweis auf die Tabelle.
OK, was hatte ich noch nicht?
-
FOC0A/B - Force Output Compare A/B. Das sind jetzt einzelne Bits (1-Bit-Zahl). Macht nur mit einem PWM-Mode (siehe WGM) Sinn. Wird das Bit 1 gesetzt, erfolgt sofort ein Output Compare Match - der entsprechende Pin am µC wird dann entsprechend der ein Einstellungen vom COM0A/B manipuliert. Es erfolgt aber weder ein IRQ, noch ein Überlauf (CTC-Mode etc).
-
COM0A/B1..COM0A/B0 - Compare Output A/B Mode. Legt fest, wie sich die OC-Pins bei dem jeweiligen Output Compare Match verhalten sollen. Dabei gibt es unterschiedliches Verhalten in nicht PWM-Modi und PWM-Modi. Deswegen auch da verschiedene Tabellen im Datenblatt. mit 2 Bits (Pro Kanal) können also 2^2=4 Modi gewählt werden. Bei Mode0 sind die Pins nicht mit dem Timer verbunden, und somit als normale I/Os verwendbar. Bei PWM und nonPWM. Bei nonPWM kann der entsprechende Pin jetzt aber beim CompareMatch entweder getoggelt, gesetzt oder gelöscht werden (zusammen die 4 Modi) - bei den PWM-Modis ist das etwas mehr, entsprechend der unterschiedlichen PWM-Modi. Siehe dazu die Tabellen im DB ab Seite 69).
Jetzt zu Deinem Programm - mach sich mit Android nicht ganz so einfach (bzw hab keine entsprechende SW), hab noch nicht reingesehen - ich versuchs mal so:
Code:
; Projekt: Projekttiny 13 Datum: 20.06.2012
; Datei: PWM-Motor02.asm
.include "tn13def.inc"
.equ takt = 1200000
; Takt an PORTB,PB0 (Pin OC0A)
.equ vConfTCCR0A = 1<<COM0A0 |1<<WGM00
.equ vConfTCCR0B = 1<<WGM02 | 1<<CS00 ; Prescale = 1
.equ vMAX = 200
.equ vTi = 100
; Flash RAM auf Adresse 0 einstellen
.org 0
ldi r16,RAMEND ;Stack Pointer initialisieren
out SPL,r16
sbi DDRB,PB1 ;PB1 = OC0B als Output
sbi DDRB,PB0 ;PB0 = OC0A als Output
ldi r16, vMAX ;Wert f�r MAX laden =200
out OCR0A,r16 ;und in Output Compare Register A laden
ldi r16,vTi ;Wert f�r Ti laden =100
out OCR0B,r16 ;und in Output Compare Register B laden
ldi r16,vConfTCCR0A ; Einstellungen f�r den PWM-Modus laden
out TCCR0A,r16 ;und ins Timer/Counter Control Register 0A �bertragen
ldi r16,vConfTCCR0B ;Einstellungen f�r den PWM-Modus laden
out TCCR0B,r16 ;und ins Timer/Counter Control Register 0B �bertragen
Warte:
rjmp Warte ; Endlosschleife
.EXIT
Edit: T0 ist PB2 des Controllers. Eine alternative Funktion dieses Beinchens ist, daß es als externer Takteingang für Timer0 dienen kann. Wird über die CS-Bits (siehe oben) aktiviert. Dann ist PB2 nicht mehr als I/O verwendbar (wie halt auch B1/B2 entsprechend der vorgabn durch COM0A/B).
Edit2: Laut DB brauchst Du den Stackpointer nicht initialisieren. Der hat ein initial value (Vorgabe/default) von 159dec=9Fhex=10011111bin=RAMEND...