Atmega48 Timer1 Fast PWM 40kHz-Rechtecksignal

OP #2279830
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.
Gast #2280061
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ß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren