Forum: Mikrocontroller und Digitale Elektronik Atmega48 Timer1 Fast PWM 40kHz-Rechtecksignal


von Marco B. (marco-b)


Lesenswert?

Hallo,

ich verzweifle grad daran, mit einem Atmega48 ein Rechtecksignal der 
Frequenz 40kHz (für nen Ultraschallsender) auszugeben.

Wollte dafür den Timer1 ohne Vorteiler bei dem internen 8MHz-Takt 
benutzen. Der Timer soll im Fast-PWM-Modus betrieben werden mit TOP=ICR1 
als Periodendauer und OCR1A=ICR1/2 für die On-Time. Ich programmiere mit 
AVR-Studio.

Nun, der Quelltext sieht wie folgt aus:
1
.include "m48def.inc"
2
3
.equ freq = 40000
4
.equ clk  = 8000000
5
6
.def temp0 = r16
7
.def temp1 = r17
8
9
.org 0x000
10
rjmp main
11
12
13
main:
14
15
;-----Initializing Stack-----
16
17
ldi     temp0, low(RAMEND)          ;Stackpointer
18
out     SPL, temp0                   
19
ldi     temp0, high(RAMEND)
20
out     SPH, temp0
21
22
23
;-----Initializing Ports-----
24
25
ldi  temp0, 0xFF
26
out   ddrb, temp0
27
28
;-----Initializing Timer-----
29
30
ldi  temp1, 0x00
31
ldi  temp0, (clk/(2*freq))  ;OCR1A = 100
32
sts  OCR1AH, temp1
33
sts   OCR1AL, temp0
34
35
ldi  temp1, 0x00
36
ldi  temp0, (clk/(freq))   ;ICR1 = 200, Duty-Cycle 50%, Frequenz 40kHz
37
38
sts  ICR1H, temp1
39
sts   ICR1L, temp0
40
41
ldi  temp0, (1<<COM1A1) | (1<<WGM11)   ;nicht-invertierend
42
sts  TCCR1A, temp0
43
44
ldi  temp0, (1<<WGM13) | (1<<WGM12) | (1<<CS10)  ;Fast PWM, Top=ICR1
45
sts  TCCR1B, temp0
46
47
48
loop:
49
rjmp loop

So wie es beim Simulieren aussieht lande ich nicht im richtigen Modus, 
obwohl doch die WGM-Bits richtig? gesetzt sind. Der Timer läuft 
stattdessen von 0 bis 0x01FF durch und ändert die Zählrichtung dann - 
also Modus 2 = PWM, Phase-correct, 9Bit.

Habe versucht ihn mal in andere Modi zu setzen, wobei jedes Mal das 
WGM13-Bit nicht verarbeitet wird und ich in einem der unteren 8 Modi 
lande. Bei obigem Quelltext scheint ja auch WGM12 dann nicht verarbeitet 
worden zu sein... Nun bin ich leider mit meinem Latein am Ende und finde 
auch nach mehrfachem Nachlesen im Datenblatt nix mehr.

Hoffe ihr könnt helfen.

von spess53 (Gast)


Lesenswert?

Hi

PWM-Modes mit variablen Top-Wert werden nicht korrekt simuliert. Geht 
also nicht.

Um deine 40kHz zu erzeugen brauchst du auch keine PWM. Da reicht CTC.

MfG Spess

von Joachim (Gast)


Lesenswert?

Nur, zur Sicherheit: wenn du das Projekt in den Controller brennst mußt 
das das DIV8-Fuse beachten :) . Sonst kommst du nicht auf 40 kHz sondern 
nur auf 5 kHz. Und das kann richtig nerven ...

Gruß

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.