Forum: Mikrocontroller und Digitale Elektronik 16 Bit PWM ATtiny2313 Mode9


von Roland (Gast)


Lesenswert?

Hi @ all !!

Habe leider das Problem, den 16 T/C vom ATtiny2313 nicht zu verstehen.

Phase and Frequency Correct PWM Mode9

Will eine Led mittels 16 Bit Timer Mode9 am Ausgang OC1A an PB.3 Dimmen.
(Varibles Puls Pausen Verhälnis einstellbar)

Lt. Datenblatt vom ATtiny2313 läuft TCNT1 bis zum Compare Match was im 
OCR1A einstellbar ist hinauf, kehrt die Richtung um, und läuft wieder 
Richtung Bottom (Null). (Seite 102 vom PDF des ATtiny 2313)

Leider ist in meinem Beispielcode das Puls/Pausenverhältnis immer 
gleich,
da ich es bis Dato nicht geschafft habe ein variables PulsPausen 
Verhälnis hinzbekommen.

Frage:
Wie kann ich das PulsPausenVerhälnis Variabel gestalten ??

Ihr sollt keinesfalls meine Hausaufgaben erledigen, dennoch Bitte ich 
Euch um eine Hilfestellung, da ich schon mehrere Tage vor diesem Problem 
sitze. Vielleicht mit Beispielcode.

Hier der Quellcode.
1
.nolist
2
.include "tn2313def.inc"
3
.list
4
5
.def  mpr = r16
6
7
   rjmp  RESET             ; Reset Handler
8
   reti  ;INT0             ; External Interrupt0 Handler
9
   reti  ;INT1             ; External Interrupt1 Handler
10
   reti  ;TIM1_CAPT        ; Timer1 Capture Handler
11
   rjmp  TIM1_COMPA        ; Timer1 CompareA Handler
12
   rjmp  TIM1_OVF          ; Timer1 Overflow Handler
13
   reti  ;M0_OVF           ; Timer0 Overflow Handler
14
   reti  ;USART0_RXC       ; USART0 RX Complete Handler
15
   reti  ;USART0_DRE       ; USART0,UDR Empty Handler
16
   reti  ;USART0_TXC       ; USART0 TX Complete Handler
17
   reti  ;ANA_COMP         ; Analog Comparator Handler
18
   reti  ;PCINT            ; Pin Change Interrupt
19
   reti  ;TIMER1_COMPB     ; Timer1 Compare B Handler
20
   reti  ;MER0_COMPA       ; Timer0 Compare A Handler
21
   reti  ;TIMER0_COMPB     ; Timer0 Compare B Handler
22
   reti  ;USI_START        ; USI Start Handler
23
   reti  ;USI_OVERFLOW     ; USI Overflow Handler
24
   reti  ;EE_READY         ; EEPROM Ready Handler
25
   reti  ;WDT_OVERFLOW     ; Watchdog Overflow Handler
26
27
28
reset:
29
   ldi   mpr, low(ramend)
30
   out   spl, mpr
31
32
   sbi   DDRB, 1              ; Led für Interrupt Anzeige (Toggle)
33
   sbi   PortB,1
34
35
   sbi   DDRB, 3              ; OC1A Led (Dimmbar)
36
   sbi   PortB,3
37
38
; Toggle on Compare Match / Mode9 / Prescaler1 / TOIE1 und OCIE1
39
40
   ldi   mpr, 0<<COM1A1|1<<COM1A0|0<<COM1B1|0<<COM1B0|0<WGM11|1<<WGM10
41
   out   tccr1a, mpr
42
43
   ldi   mpr, 0<<ICNC1|0<<ICES1|1<<WGM13|0<<WGM12|0<<CS12|0<<CS11|1<<CS10
44
   out   tccr1b, mpr
45
46
   ldi   mpr, 1<<TOIE1|1<<OCIE1A|0<<OCIE1B|0<<ICIE1
47
   out   timsk, mpr
48
49
   sei                     ; Interrupts freigeben
50
51
   rjmp main
52
53
;##### Tim1_CompA #####
54
55
TIM1_COMPA:
56
   cli
57
   ldi   mpr, high(9216)   ; 1. High Byte schreiben
58
   out   ocr1ah, mpr
59
   ldi   mpr, low(9216)    ; 2. Low Byte schreiben
60
   out   ocr1al, mpr
61
62
   reti                    ; ***** Tim1_CompA Ende *****
63
64
;##### TIM1_OVF #####
65
66
TIM1_OVF:                  ; Toggle Led + Timer1 Vorladen
67
   cli
68
   ldi   mpr, high(2000)   ; 1. High Byte schreiben  
69
   out   tcnt1h, mpr
70
   ldi   mpr, low(2000)    ; 2. Low Byte schreiben
71
   out   tcnt1l, mpr
72
73
   sbic  PortB, 1          ; Toggle Led  an PB.1
74
   rjmp  ClrBit_Now
75
   sbi   PortB, 1
76
   rjmp  BitReady
77
ClrBit_Now:
78
   cbi  PortB, 1
79
BitReady:
80
81
   reti                   ; ***** TIM1_OVF Ende *****
82
83
main:
84
85
   rjmp main

In diesem Fall beträgt die High und Low Phase ohne den Timer Vorzuladen 
je 5 ms. Macht also 100 Hz.
Mit Vorgeladenem Timer bleibt jedoch das PulsPausenVerhälnis gleich !

Ich wollte nicht mit allen meinen gescheiterten Versuchen diesen Beitrag 
ZUMÜLLEN! Ich bitte um Verständnis

Danke schon mal an dieser Stelle für Euer Bemühen !

mfg Roland

von Volker (Gast)


Lesenswert?

Hast Du Dir mal den entsprechenden Teil des AVR Tutorials angeschaut?

http://www.mikrocontroller.net/articles/AVR-Tutorial:_PWM

Volker

von Marc D. (cosinus)


Lesenswert?

Wieso leadst du das OCR1A bei jedem CompareMatch immer neu? Und fuer ein 
einfaches Dimmern einer LED sollte auch die Fast-PWM gehen. Set Output 
on Bottom, clear Output on compare Match.
Schreib doch mal ein ganz simples Program um das zu testen. So nach dem 
Motto:

init_timer
load value in OCR1A
while 1

Interrupts muessen fuer die Hardware PWM nicht aktiviert sein, ausser du 
brauchst unbedingt den Preload.

Gruss
Marc

von spess53 (Gast)


Lesenswert?

Hi

Im Timer Mode 9 ist OCR1A dein Top-Wert. Damit wird die Frequenz der PWM 
bestimmt. Dein Taktverhältnis wird mit OCR1B eingestellt. Der Wert von 
OCR1B darf sich zwischen 0 und OCR1A bewegen. Einen Overflow Interrupt 
wird nicht ausgelöst! Deine Vorladerei ist Unsinn. Um die Led zu dimmen 
muss die an OC1B angeschlossen werden.

MfG Spess

von Roland (Gast)


Lesenswert?

Danke schon mal für die Zahlreichen Antworten.

> Hast Du Dir mal den entsprechenden Teil des AVR Tutorials angeschaut?

Ja natürlich. Aber die meisten sind leider alle in C erklärt.

> Und fuer ein einfaches Dimmern einer LED sollte auch die Fast-PWM gehen.
> Set Output on Bottom, clear Output on compare Match.

Ja genau sehe ich genau so.
Jedoch bin ich gerade dabei für jeden Timer (Timer0 und Timer1) ein 
Beispiel zu Entwickeln, um daraus zu lernen.
In der Praxis würde ich natürlich nie einen 16-Bit Timer für eine Led 
hernehmen. Absoluter unsinn natürlich.

Hoffe jetzt ist alles klar warum ich das mache. Einfach das ich mal 
endlich den 16Bit Timer raffe !!
Den 8Bit Timer habe ich z.B. schon durchgenommen, hatte nie gedacht, das 
ich hier Probleme kommen könnte.

> Im Timer Mode 9 ist OCR1A dein Top-Wert. Damit wird die Frequenz der PWM
> bestimmt. Dein Taktverhältnis wird mit OCR1B eingestellt.

Danke für diesen Lösungsansatz. Werde ich ausprobieren.

>Um die Led zu dimmen muss die an OC1B angeschlossen werden.

Denke ich nicht, denn lt. Datenblatt steht für mein Beispiel:

WGM13=1: Toggle OC1A on Compare Match, OC1B reserved. (Seite 107)
=====================================================

mfg Roland

von Roland (Gast)


Lesenswert?

Sorry, nochwas

Im AVR-Studio will ich das nicht Simulieren. Hier sind mir einfach zu 
viele BUGS enthalten. Mann weiß hier nie ob es auch stimmt !!!

mfg Roland

von spess53 (Gast)


Lesenswert?

Hi

>WGM13=1: Toggle OC1A on Compare Match, OC1B reserved. (Seite 107)

Das ergibt aber keine PWM, Da OCR1A der Topwert ist und normalerweise 
nicht verändert wird. Sieh dir mal das Diagramm auf S.104 an. Dort wirst 
du auch sehen, das sich das PWM-Verhalten nur auf COMnx1:0 = 2 oder 3 
bezieht.

MfG Spess

von Roland (Gast)


Lesenswert?

spess53 schrieb:
> Das ergibt aber keine PWM, Da OCR1A der Topwert ist und normalerweise
>
> nicht verändert wird. Sieh dir mal das Diagramm auf S.104 an. Dort wirst
>
> du auch sehen, das sich das PWM-Verhalten nur auf COMnx1:0 = 2 oder 3
>
> bezieht.

Ich denke mal jetzt hast es auf den Punkt getroffen. Komme mit diesen 
Diagrammen nicht klar.
Dies ist die einzige Erklärung für mich warum ich nicht zurecht komme.

Tja, ich weiß das ich nichts weiß :-)

Ich versuche mal die Diagramme richtig zu Interpretieren.

Dank an spess53 !!

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.