Forum: Mikrocontroller und Digitale Elektronik attiny25 PWM


von mitsh (Gast)


Lesenswert?

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/

von Leo B. (luigi)


Lesenswert?

Die register heißen halt im Tiny25 schon wieder anders als im Tiny 13.
ich vermute das wird dein Problem sein...

von mitsh (Gast)


Lesenswert?

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 ?

von Benedikt K. (benedikt)


Lesenswert?

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.

von Hannes Lux (Gast)


Lesenswert?

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

...

von sgersten (Gast)


Lesenswert?

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.

von mitsh (Gast)


Lesenswert?

hi
danke erstmal für eure Tips
Ich verwende im Moment eine kombination aus Wolfram Herzog's Datei und 
dem was ich im Tutorial gelesen habe:
1
; TINY13RGB
2
; Software PWM zum Ansteuern von RGB Led als Farbenspiel
3
; Version 1.2  30-11-2007   Wolfram Herzog  www.wherzog.de
4
; Für TINY13 im Franzis-Board
5
; Taktfrequenz Default  
6
;
7
; (abgeändert auf attiny25)
8
9
.include "tn25def.inc"
10
 
11
.def temp  = r16           ; Temporäres Arbeitsregister
12
.def PWMCount = r17           ; PWM Pulsbreitenzähler
13
 
14
.def led_1 = r18                     ; Helligkeitswert Led1: 0 .. 127
15
.def led_2 = r19                     ; Helligkeitswert Led4: 0 .. 127
16
.def led_3 = r20                     ; Helligkeitswert Led5: 0 .. 127
17
18
.equ HELL = 0            ; Null = maximale Helligkeit
19
20
.org 0x0000
21
        rjmp    main                ; Reset Handler
22
23
.org OVF0addr 
24
        rjmp    timer0_overflow     ; Timer Overflow Handler
25
26
main:  
27
        ldi     temp, LOW(RAMEND)     ; Stackpointer initialisieren
28
        out     SPL, temp
29
        ldi     temp, HIGH(RAMEND)
30
        out     SPH, temp
31
            ; Initialisierung
32
        ldi     temp, 0xFF          ; Port B auf Ausgang
33
        out     DDRB, temp
34
  
35
        ldi     temp, 0b00000001    ; CS00 setzen: Teiler 1
36
        out     TCCR0A, temp
37
 
38
        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 ?

von Karl H. (kbuchegg)


Lesenswert?

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.

von sgersten (Gast)


Lesenswert?

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

von mitsh (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.