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.