mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik attiny25 PWM


Autor: mitsh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: Leo B. (luigi)
Datum:

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

Autor: mitsh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: sgersten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mitsh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
; TINY13RGB
; Software PWM zum Ansteuern von RGB Led als Farbenspiel
; Version 1.2  30-11-2007   Wolfram Herzog  www.wherzog.de
; Für TINY13 im Franzis-Board
; Taktfrequenz Default  
;
; (abgeändert auf attiny25)

.include "tn25def.inc"
 
.def temp  = r16           ; Temporäres Arbeitsregister
.def PWMCount = r17           ; PWM Pulsbreitenzähler
 
.def led_1 = r18                     ; Helligkeitswert Led1: 0 .. 127
.def led_2 = r19                     ; Helligkeitswert Led4: 0 .. 127
.def led_3 = r20                     ; Helligkeitswert Led5: 0 .. 127

.equ HELL = 0            ; Null = maximale Helligkeit

.org 0x0000
        rjmp    main                ; Reset Handler

.org OVF0addr 
        rjmp    timer0_overflow     ; Timer Overflow Handler

main:  
        ldi     temp, LOW(RAMEND)     ; Stackpointer initialisieren
        out     SPL, temp
        ldi     temp, HIGH(RAMEND)
        out     SPH, temp
            ; Initialisierung
        ldi     temp, 0xFF          ; Port B auf Ausgang
        out     DDRB, temp
  
        ldi     temp, 0b00000001    ; CS00 setzen: Teiler 1
        out     TCCR0A, temp
 
        ldi     temp, 0b00000010    ; TOIE0: Interrupt bei Timer Overflow
        out     TIMSK, temp

        ldi     led_1, HELL        ; Alle Lampen an
        ldi     led_2, HELL      ; 
        ldi     led_3, HELL
 
        sei              ; Interrupt freigeben

loop:   rjmp    loop

timer0_overflow:                      ; Timer 0 Overflow Handler
        inc     PWMCount              ; den PWM Zähler von 0 bis
        cpi     PWMCount, 128         ; 127 zählen lassen
        brne    WorkPWM
        clr     PWMCount

WorkPWM:
        ldi     temp, 0b11000000      ; 0 .. Led an, 1 .. Led aus
 
        cp      PWMCount, led_1       ; Ist der Grenzwert für Led 1 erreicht
        brlo    OneOn
        ori     temp, $01
 
OneOn:  cp      PWMCount, led_2       ; Ist der Grenzwert für Led 2 erreicht
        brlo    TwoOn
        ori     temp, $02
 
TwoOn:  cp      PWMCount, led_3       ; Ist der Grenzwert für Led 3 erreicht
        brlo    SetBits
        ori     temp, $04
 
SetBits:                              ; Die neue Bitbelegung am Port ausgeben
        out     PORTB, temp
 
        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 ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: sgersten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mitsh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.