Hallo Atmelfreaks,
beschäftige mich mit der Wahnsinnsmaterie PWM mit Timer1
Zu Beginn hatte ich mich mit CTC-Betrieb beschäftigt und es läuft auch.
Jetzt bin ich beim PWM-fast Betrieb und PWM Phasenkorrekt Betrieb angekommen,
und es ist ein Wahnsinn, was sich dahinter verbirgt.
Fakt ist, dieser Code zeigt nichts an den LEDs die an PB1 und PB2 gegen GND hängen.
Bei CTC lief alles.
Wo ist nur mein Gedankenfehler?
; Projekt: Mega8-PWM Datum: 03.11.2013
; Datei: mega8-FASTPWM01.asm
; ATmega8 Timer1 FastPWM-Betrieb Kanäle A und B
; Port B: Ausgang Kanal A:OC1A (PB1-Pin15) Kanal B:OC1B (PB2-Pin16)
; Konfiguration: interner Oszillator 1 MHz, externes RESET-Signal
.INCLUDE "m8def.inc" ; Deklarationen für Mega8
.EQU takt = 1000000 ; Systemtakt 1 MHz intern
.DEF akku = r16
.DEF temp17 = r17
.CSEG ; Programm-Flash
rjmp start ; Reset-Einsprung
.ORG $13 ; Interrupt-Einsprünge übergehen
start:
ldi akku,LOW(RAMEND); Stapel anlegen
out SPL,akku ;
ldi akku,HIGH(RAMEND)
out SPH,akku
ldi akku,(1<<PB1) | (1<<PB2)
out DDRB,akku
.equ WertH = 100 ; Konstante für OCR1AH u. OCR1BH (r16)
.equ WertL = 70 ; Konstante für OCR1AL u. OCR1BL (r17)
; Timer1 programmieren: WGM10=1<<<PWM8Bit phasenrichtig (TOPP=00FF)
; KanalA (COM1Ax) zu PB1 und KanalB (COM1Bx) zu PB2 nicht invertiert
ldi akku,(0<<COM1A1) |(1<<COM1A0)| (0<<COM1B1) | (0<<COM1B0)| (0<<WGM11) | (1<<WGM10)
out TCCR1A,akku ; Steuerregister A Timer1
clr akku
ldi akku,(0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10)
out TCCR1B,akku ; Steuerregister B Timer1 Prescale = 1 (1MHz)
loop: ldi akku,WertH ; r16 auf 100
ldi temp17,WertL ; r17 auf 70
out OCR1AH,akku ; Kanal A = 100 (WertH)
out OCR1AL,temp17 ; Kanal A = 70 (WertL)
out OCR1BH,akku ; Kanal B = 100 (WertH)
out OCR1BL,temp17 ; Kanal B = 70 (WertL
rjmp loop
.EXIT
Grüße
Rolf
Lesezeichen