Forum: Mikrocontroller und Digitale Elektronik Timer-Register richtig beschrieben?


von pegelwendler (Gast)


Lesenswert?

Guten Abend zusammen,

ich brauche für einen Lüfter ein 25-kHz-Signal. Eigentlich sollte das 
kein großes Ding sein, ich wollte mir das schnell mit Bascom schreiben.

Leider kann Bascom offenbar kein Fast-PWM. Da ich aber einen Attiny45 
mit 6,4 MHz verwenden will und mit Fast-PWM recht genau 25 kHz 
rauskommen sollten, würde ich ausnahmsweise mit den Timer-Registern 
arbeiten. Haut das vom Code her hin?
Datenblatt, interessant wird es ab Seite 77: 
https://www.reichelt.de/index.html?ACTION=7&LA=3&OPEN=0&INDEX=0&FILENAME=A300%2FATTINY25-ATTINY45-ATTINY85_DATASHEET.pdf#page=77

Das Programm ist so simpel, das bedarf wahrscheinlich keiner langen 
Reden. Am B4 ist ein Poti angeschlossen, an B0 und B1 brauche ich das 
PWM-Signal.
1
$regfile = "ATtiny45.DAT"
2
$crystal = 6400000
3
$hwstack = 10
4
$swstack = 10
5
$framesize = 10
6
7
Poti Alias PINb.4
8
Config Poti = Input
9
10
Pwm_Ext Alias PORTB.0
11
Config Portb.0 = Output
12
13
Pwm_Int Alias PORTB.1
14
Config Portb.1 = Output
15
16
dim potiwert as Word
17
18
CONFIG ADC = SINGLE, PRESCALER = AUTO, REFERENCE = AVCC
19
START ADC
20
21
TCCR0A = 10100011
22
TCCR0B = 00001001
23
24
'OCR0A und OCR0B sind Variablen, gegen die der Timer verglichen wird (0-255)
25
26
27
Do
28
potiwert=getadc(2)       '0-1024
29
potiwert = potiwert / 4 'skalieren auf 0-256
30
OCR0A = potiwert
31
OCR0B = potiwert
32
Loop
33
34
End

von Muli (Gast)


Lesenswert?

Das WGM02 in TCCR00B darf nicht gesetzt werden. Es begrenzt die Timer 
Frequenz im FAST PWM Mode mit dem Wert in OCR0A. Nur WGM00 und WGM01 in 
TCCR0A lassen. (Table 11-5)

Wie kommt der Tiny4 auf 6,4MHz? Ohne Quarz kann er nur 1MHz, 8MHz oder 
16MHz.

von (prx) A. K. (prx)


Lesenswert?

Muli schrieb:
> Wie kommt der Tiny4 auf 6,4MHz?

Der Tiny45 hat einen Tiny15 compatibility Mode mit 6,4 MHz.

: Bearbeitet durch User
von Thomas F. (igel)


Lesenswert?

pegelwendler schrieb:
> TCCR0A = 10100011

Sollte das nicht TCCR0A = &B10100011 heißen?


> Do
> potiwert=getadc(2)       '0-1024
...
> OCR0A = potiwert
[Hier könnte man sich ausnahmsweise mal ein delay() gönnen]
> Loop

Beitrag #7282856 wurde von einem Moderator gelöscht.
Beitrag #7282862 wurde von einem Moderator gelöscht.
von S. Landolt (Gast)


Lesenswert?

Ich weiß nicht, wie das in Bascom aussieht. Ansonsten:
1
; Mode 3: fast PWM, auf OC0A & OC0B
2
TCCR0A=(1<<COM0A1)+(1<<COM0B1)+(1<<WGM01)+(1<<WGM00)
3
TCCR0B=(1<<CS00) ; /1
4
; alternativ:
5
TCCR0A= 0b10100011
6
TCCR0B= 0b00000001

> Attiny45 mit 6,4 MHz

Per Quarz? Denn zu
> Der Tiny45 hat einen Tiny15 compatibility Mode mit 6,4 MHz.
steht im Datenblatt 'Note that in this mode of operation the 6.4 MHz 
clock signal is always divided by four, providing a 1.6 MHz system 
clock', schließlich läuft der ATtiny15 auch ausschließlich mit 1.6 MHz. 
Soweit ich weiß, sind die internen 6.4 MHz im ATtiny45 nicht direkt 
verfügbar.

von S. Landolt (Gast)


Lesenswert?

PS:
Mit PLL für Timer1 kommt man dran, dann auch an 25.6 MHz (4* 6.4); PWM 
auf OC1A (PB1).

von pegelwendler (Gast)


Lesenswert?

Muli schrieb:
> Das WGM02 in TCCR00B darf nicht gesetzt werden. Es begrenzt die Timer
> Frequenz im FAST PWM Mode mit dem Wert in OCR0A. Nur WGM00 und WGM01 in
> TCCR0A lassen. (Table 11-5)

Danke für den Hinweis, ich habs korrigiert.

S. Landolt schrieb:
> 'Note that in this mode of operation the 6.4 MHz
> clock signal is always divided by four, providing a 1.6 MHz system
> clock', schließlich läuft der ATtiny15 auch ausschließlich mit 1.6 MHz.
> Soweit ich weiß, sind die internen 6.4 MHz im ATtiny45 nicht direkt
> verfügbar.

Ups. Stimmt, das habe ich übersehen - dann wird das wohl nichts mit den 
25 kHz. Wobei, eigentlich müsste ich doch das ausnutzen können, dass 
beim Overflow vom Timer ein Interrupt ausgelöst wird. Kann ich da nicht 
einfach für TCNT0 einen höheren Startwert reinschreiben? Quasi weniger 
Zähltakte und höhere Frequenz auf Kosten der Auflösung?
Da sollte doch dann bei 191 auch ungefähr 25 kHz rauskommen und für die 
PWM-Einstellung blieben dann 64 Werte bzw. 6 Bit. Oder kommt da der µC 
taktmäßig nicht mehr mit, wenn da ein Interrupt mit einem Befehl drin 
hängt?

Ansonsten muss sich der Lüfter halt mit 31,x kHz aus den 8 MHz 
zufriedengeben.

von Rumms (Gast)


Lesenswert?

SoftPWM?

von S. Landolt (Gast)


Lesenswert?

> ich brauche für einen Lüfter ein 25-kHz-Signal
Weshalb dann zwei,
> an B0 und B1 brauche ich das PWM-Signal
?
Würde ein einziger PWM-Ausgang reichen, wäre der Modus 7 verwendbar mit 
TOP=OCR0A, PWM auf OC0B.
  Oder Timer1 mit TOP=OCR1C, mit entsprechenden Ausgängen.

> Interrupt ... für TCNT0 einen höheren Startwert reinschreiben
Geht sicher auch, aber ...

von pegelwendler (Gast)


Lesenswert?

S. Landolt schrieb:
> Weshalb dann zwei

Auf der Platine schleife ich einmal das PWM-Signal an die Schraubklemme 
durch und einmal schalte ich mit einem MOSFET und einem Gate-Treiber GND 
ein und aus.
Man weiß ja nie, wozu man die Platine vielleicht mal noch brauchen kann. 
So gesehen wäre es aber egal, auf welchem Ausgang das Signal rauskommt, 
notfalls tut es ein Klecks Lötzinn.

S. Landolt schrieb:
> TOP=OCR0A, PWM auf OC0B

Ach, das geht? Ich habe das bisher so verstanden, dass sich das mit 
OCR0A als TOP nur auf den Ausgang A bezieht und ich für B das Gleiche 
machen muss. Aber wenn ich darüber nachdenke, dann macht das absolut 
Sinn und ist natürlich technisch viel sauberer und wahrscheinlich 
schneller. Gute Idee, danke dafür.

Ich würde also WGM02 wieder auf 1 setzen, um den Mode 7 zu benutzen, 
OCR0A auf 64 setzen und bei OCR0B je nach gewünschter PWM-Einstellung 
irgendwas zwischen 0 und 64 reinschreiben. Richtig?
1
$regfile = "ATtiny45.DAT"
2
$crystal = 1600000
3
$hwstack = 10
4
$swstack = 10
5
$framesize = 10
6
7
Poti Alias PINb.4
8
Config Poti = Input
9
10
Pwm_Ext Alias PORTB.0
11
Config Portb.0 = Input 'wird mit Lötklecks an PB1 verbunden
12
13
Pwm_Int Alias PORTB.1 '=OC0B
14
Config Portb.1 = Output
15
16
dim potiwert as Word
17
18
CONFIG ADC = SINGLE, PRESCALER = AUTO, REFERENCE = AVCC
19
START ADC
20
21
TCCR0A = &B10100011
22
TCCR0B = &B00001001
23
24
'OCR0A bestimmt Einschalten des PWM-Pins und Zurücksetzen des Timers (Anzahl Ticks pro Zyklus = 64)
25
OCR0A = 64
26
'OCR0B bestimmt das Ausschalten des PWM-Pins OCR0B zwischen 0 (Dauer-Aus) und 64 (Dauer-An)
27
'PWM-Frequenz ca. 25 kHz
28
29
30
Do
31
   potiwert=getadc(2)       '0-1024
32
   waitms 100
33
   potiwert = potiwert / 16 'skalieren auf 0-64
34
   OCR0B = potiwert
35
Loop
36
37
End

von Peter D. (peda)


Lesenswert?

pegelwendler schrieb:
> Da sollte doch dann bei 191 auch ungefähr 25 kHz rauskommen

Wie kommst Du auf 191?
Bei mir sind 8MHz / 25kHz = 320.
Du setzt also einfach einen der beiden Timer auf Clear nach 159 und 
einen OCRxy Ausgang auf PWM.
Bzw. bei Fast-PWM setzt Du noch den CPU-Prescaler auf 2 (=4MHz).

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> OCR0A = 64
Damit teilen Sie den Timer-Takt durch 64+1. Wenn diese Auflösung reicht, 
okay.

Feiner würde es mit 'OCR0A=160 -1' (Auflösung 1/160), was jedoch (für 
die verlangten 25 kHz) einen Systemtakt von 4 MHz voraussetzt. Die dafür 
notwendige Manipulation von CLKPR ist zeitkritisch, wie das unter Bascom 
zu bewerkstelligen ist, müssen Sie selbst nachschlagen.

von pegelwendler (Gast)


Lesenswert?

Peter D. schrieb:
> Wie kommst Du auf 191?

Ich habe 1,6 MHz durch 25 kHz geteilt, da komme ich auf 64. Hier hätte 
ich den Timer nach dem Überlauf direkt wieder auf 191 vorgeladen, damit 
er nur noch 64 Ticks zählt und dann wieder den Ausgang auf Clear setzt.
Bei 8 MHz und Fast-PWM hätte ich sonst das Problem gehabt, dass ich mit 
dem 8-bit Timer nicht bis 320 zählen kann.
Vielleicht verstehe ich auch nicht ganz, was du meinst. Sprichst du vom 
"normalen" PWM-Modus?

Aber das hat sich inzwischen erledigt, da die von S. Landolt 
vorgeschlagene Lösung für Fast-PWM aus meiner Sicht besser ist als das 
Ändern des TCNT0 in der ISR.

von Peter D. (peda)


Lesenswert?

pegelwendler schrieb:
> Sprichst du vom
> "normalen" PWM-Modus?

Mode 5.
OCR0A macht den TOP (159), OCR0B die PWM.

pegelwendler schrieb:
> Ändern des TCNT0 in der ISR.

Wozu denn?

von S. Landolt (Gast)


Lesenswert?

Aber - hey: wenn wir uns jetzt ohnehin auf einen einzigen Ausgang, 
nämlich den auf PB1, beschränken, warum dann nicht Timer1.OC1A, wie um 
11:50 skizziert? Dann hätten Sie die volle Auflösung von 1/256 (falls 
das überhaupt sinnvoll sein sollte für einen Lüfter).
  Also ATtiny15-Compatibility-Mode mit 1.6 MHz und PLL auf 25.6 MHz.

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.