Hallo,
ich versuche gerade ein Moodlight mit einem Attiny25 zu Basteln.
Als Quellcode wollt ich erstmal diesen hier versuchen:
Beitrag "RGB-Lampe mit TINY13 in Assembler"
Wenn ich die Datei aber mit avra compeliere erhalte ich folgende
Fehlermeldung:
Pass 1...
Pass 2...
test2.asm(20) : error : Found no label/variable/constant named SPH
test2.asm(30) : error : Found no label/variable/constant named TCCR0
done
Assembly aborted with 2 errors and 0 warnings.
Was stimmt da nicht?
Die tn25def.inc hab ich von hier http://avr.8b.cz/inc/
ok ich hab jetzt mal TCCR0 laut Datenblatt durch TCCR0B ersetzt und in
der tn25def.inc eine zeile:
.equ SPH = 0x3e
ergänzt.
Aber leider ohne erfolg, die LED leuchtet zwar wird aber nicht gedimmt
hat jemand noch einen Tip ?
mitsh wrote:
> ok ich hab jetzt mal TCCR0 laut Datenblatt durch TCCR0B ersetzt
Beim tiny25 gibt es TCCR0A und TCCR0B. Du musst also schauen welche Bits
aus dem TCCR0 Register im A und welche im B Register gesetzt werden
müssen.
Davon mal abgesehen: Was für eine Software verwendest du?
Die aus dem Link von dir bestimmt nicht, denn der tiny13 hat kein TCCR0,
und in der obigen Software kommt daher auch nur TCCR0B vor.
> und in der tn25def.inc ...
Keine gute Idee... ;-)
Wenn Du das Programm portieren willst, dann ändere das Programm und
nicht die Definition. Die Definitionen stellen eine Art Standard dar, an
den sich die Programmierer zu halten haben.
Um (tatsächliche) Ungereimtheiten (falls es denn welche gibt) in der
Definitionsdatei erkennen und korrigieren zu können, muss man die
Architektur des Controllers schon verdammt gut kennen.
...
Die Definition abzuändern halte ich auch für keine gute Idee.
PWM mit tiny 2/4/85 auf Timer 0 sollte eigentlich nicht sonderlich
kompliziert sein. Es sollte genügen einen Output für fast PWM
freizuschalten und den Takt mit geeignetem Vorteiler zu aktivieren, bsp.
TCCR0A = 0x83 um fast PWM auf OC0A zu setzen, dann z.B. TCCR0B = 0x03
für Timer Takt auf 1/64 des I/O Taktes. Jetzt lässt sich der PWM mit
OCR0A kontrollieren.
ldi temp, 0b00000010 ; TOIE0: Interrupt bei Timer Overflow
39
out TIMSK, temp
40
41
ldi led_1, HELL ; Alle Lampen an
42
ldi led_2, HELL ;
43
ldi led_3, HELL
44
45
sei ; Interrupt freigeben
46
47
loop: rjmp loop
48
49
timer0_overflow: ; Timer 0 Overflow Handler
50
inc PWMCount ; den PWM Zähler von 0 bis
51
cpi PWMCount, 128 ; 127 zählen lassen
52
brne WorkPWM
53
clr PWMCount
54
55
WorkPWM:
56
ldi temp, 0b11000000 ; 0 .. Led an, 1 .. Led aus
57
58
cp PWMCount, led_1 ; Ist der Grenzwert für Led 1 erreicht
59
brlo OneOn
60
ori temp, $01
61
62
OneOn: cp PWMCount, led_2 ; Ist der Grenzwert für Led 2 erreicht
63
brlo TwoOn
64
ori temp, $02
65
66
TwoOn: cp PWMCount, led_3 ; Ist der Grenzwert für Led 3 erreicht
67
brlo SetBits
68
ori temp, $04
69
70
SetBits: ; Die neue Bitbelegung am Port ausgeben
71
out PORTB, temp
72
73
reti
Die LED's leuchten zwar, ich kann aber nicht feststellen ob sie
tatsächlich getaktet wird. Wie kann ich den Takt (vorteiler?) einstellen
um erstmal ein "blinken" zu erreichen ?
mitsh wrote:
> tatsächlich getaktet wird. Wie kann ich den Takt (vorteiler?) einstellen> um erstmal ein "blinken" zu erreichen ?
Wenn du dein eigens Programm mal durchgelesen hättest, wären dir
vielleicht diese Zeilen ins Auge gestochen
ldi temp, 0b00000001 ; CS00 setzen: Teiler 1
out TCCR0A, temp
Was denkst du: Von welchem Teiler ist hier wohl die Rede?
-> Ab ins Datenblatt und mal die Beschreibung zum Tiny25 und dort
speziell zum Timer0 und dort wieder speziell zum TCCR0A Register lesen.
Es hilft nichts: WEnn man ein Programm von einem Prozessor auf einen
anderen portieren will, muss man Datenblätter lesen bzw. vergleichen. Ob
dir das nun gefällt oder nicht.
Hallo mitsh,
da hatte ich PWM falsch verstanden, ich dachte es wird die PWM Funktion
des AVR verwendet und nicht "nur" der Timer.
Zum Handling des Interrupts kann ich keine belastbare Aussage machen,
ich habe derzeit keinen 25er da. Aber auf jeden Fall muss dem Timer der
Takt eingeschaltet werden, per TCCR0B, sonst läuft da nix. doc2586.pdf
Seite 83.
Verwende vielleicht mal / 1024, dann solltest Du sehen können, was
passiert.
Also nach out TCCR0A, temp noch ldi temp, 0b00000101; out TCCR0B, temp.
Schöne Grüße
> Was denkst du: Von welchem Teiler ist hier wohl die Rede?
Das hab ich mir fast gedacht! aber leider ohne Erfolg :-(, so langsam
komm ich zur Überzeugung das vieleicht das ein oder andere Bauteil in
meiner Schaltung defekt ist. Das werd ich nächste Woche mal überprüfen.
Danke für eure Hilfe.