Forum: Mikrocontroller und Digitale Elektronik Hardware PWM Attiny 85 asm


von Donkey Kong (Gast)


Lesenswert?

Hallo liebes Forum,ich bin Anfänger und versuche gerade Hardware PWM auf 
dem Attiny85 ans laufen zubringen.Ich habe schon versucht mit Hilfe des 
Tutorials weiter zukommen und hier gesucht hab ich auch schon.
Ich habe Led an pin5 und 6 und egal welche Werte ich in OCR0A und OCR0B 
schreibe die Led´s leuchten voll durch.






.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler


.def temp1 = r16
.def temp2 = r17
.def temp3 = r18

  ldi     temp1, HIGH(RAMEND)
        out     SPH, temp1
        ldi     temp1, LOW(RAMEND)
        out     SPL, temp1


 ldi  temp1, 1<<WGM00 | 1<<WGM01 | 1<<COM0A1 | 1<<COM0B1
 out    TCCR0A, temp1
 ldi  temp1, 1<<WGM02 | 1<<CS00 | 1<<CS01
 out    TCCR0B, temp1
 ;fast pwm modus7, non inverting mode

 ldi     temp1, 1<<TOIE0
 out     TIMSK, temp1
 sei
 ; TOIE0: Interrupt bei Timer Overflow

  ldi      temp1, 0x3f
    out      OCR0A, temp1
   ldi      temp1, 0x3f
    out      OCR0B, temp1

 ldi temp1, 0b11001111  ;Alles Ausgang Pin pb4+5 eingang
 out DDRB,  temp1


 loop:
 rjmp loop


timer0_overflow:                      ; Timer 0 Overflow Handler

reti

: Verschoben durch User
von Donkey Kong (Gast)


Lesenswert?

Ich habe die Leds über Transistoren BC 547C angeschlossen 
Basiswiderstand 10Kohm (um ISP zunutzen).Einfaches ein/ausschalten geht.

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Da musst Du noch mal die Grundlagen lesen. HW PWM benötigt keine ISR. 
Der Rest macht auch irgendwie keinen Sinn in meinen Augen.

von Donkey Kong (Gast)


Lesenswert?

Kannst du da genauer werden was keinen sinn macht.Ich hab mich durchs 
datenblatt gelesen und alle register beschrieben die in meinen augen die 
pwm ausgeben

von lostintimer (Gast)


Lesenswert?

Donkey Kong schrieb:
> Ich habe Led an pin5 und 6 und egal welche Werte ich in OCR0A und OCR0B
> schreibe die Led´s leuchten voll durch.

Vielleicht willst du das ja auch? Wenn du nicht schreibst, was du 
erwartest wenn du welche Werte nach OCR0A/OR0B schreibst, wie sollen wir 
sinnvolle Vorschläge machen.

>  ;fast pwm modus7, non inverting mode

Dir ist bewußt, das hier der Top Wert nicht 0xFF ist sondern durch OCR0A 
bestimmt wird?

>  ; TOIE0: Interrupt bei Timer Overflow

Wenn OCR0A der Top Wert ist, nimmt man den Compare 0A Interrupt, da sich 
der Overflow immer mit OCR0A ändert und der TOI nur mit MAX ausgelöst 
wird. (Hab noch nicht ausprobiert, ob Compare und Overflow Flags gesetzt 
werden, wenn OCR0A auf 0xFF in dem Modus ist ???)

von Christoph (Gast)


Lesenswert?

imo ist das
modus 7, inverting mode (1<<COM0A1 | 1<<COM0B1). tut aber nix zur sache.

warum schreibst du in OCR0B ?
    ldi      temp1, 0x3f
    out      OCR0B, temp1

Sollte irrelevant sein.

Schonmal zu debug zwecken geschaut ob du in der ISR landest? zweite Led 
einschalten oder sowas.
Wie oben angemerkt brauchst du die ISR aber eigentlich da du deinen 
Timer wie einen "koprozessor" verstehen muss. Einmal gestartet läuft er 
eigenständig.

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Konkret:

Di willst HW PWM realisieren. Etablierst aber eine ISR. Das macht keinen 
Sinn. Entsprechend falsch konfigurierst Du auch den Timer.

Software PWM: benutzt eine ISR. In der macht man dann aber auch etwas, 
bzw. muss etwas machen, damit sich was tut an den Ausgängen.

HW PWM benötigt keine ISR, will aber richtig konfiguriert werden.

von Donkey Kong (Gast)


Lesenswert?

Erstmal danke für die Hilfe ich habe jetzt den fast pwm modus 3 
genommen,die frequenz geändert und den interrupt geändert.
Und jetzt gehts




.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler


.def temp1 = r16
.def temp2 = r17
.def temp3 = r18

main:
        ldi     temp1, HIGH(RAMEND)
        out     SPH, temp1
        ldi     temp1, LOW(RAMEND)
        out     SPL, temp1

    ldi    temp1, 0b00001111  ;Alles Ausgang Pin pb4 eingang
    out    DDRB,  temp1

    ldi    temp1, 1<<WGM00 | 1<<WGM01 | 1<<COM0A1 | 1<<COM0B1 | 
0<<COM0A0 | 0<<COM0B0
    out    TCCR0A, temp1
    ldi    temp1, 0<<WGM02 | 1<<CS01
    out    TCCR0B, temp1    ;fast pwm modus3, non inverting mode



    ldi     temp1, 1<<OCIE0A | 1<<OCIE0B
    out     TIMSK, temp1    ;timer compare match interrupt enabled
    sei


    ldi      temp1, 0x1
    out      OCR0A, temp1
     ldi      temp1, 0x19
      out      OCR0B, temp1



 loop:
    rjmp loop

von lostintimer (Gast)


Lesenswert?

Donkey Kong schrieb:
> Und jetzt gehts

Nur gut, daß Fehler da keine Auswirkung zu haben scheinen.
@Donkey Kong: Wozu sind die Interrupts gut?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

lostintimer schrieb:
> @Donkey Kong: Wozu sind die Interrupts gut?

Vor allem: Wo springen sie denn hin? Ich sehe zwar die Freigabe der 
beiden OC Flags, aber keine ISR, die sie behandelt.

Hardware PWM bedeutet übrigens, das du eben keine Software brauchst, 
während die PWM läuft. Du könntest z.B. den Timer OVF dazu nutzen, die 
OC Register synchron zu laden, aber nötig sind erstmal keine ISR.

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.