Hallo,
ich versuche schon länger einen Mega8 dazu zu bringen mir an seinen beiden Compare Registern vom Timer1 mir eine gegentakt PWM aus zu geben.Dazu habe ich mir gedacht man kreiert zunächst erstmal den Timer1 so,daß er an Compare1a und Compare1b eine Phasengleiche PWM erzeugt.Um eine gegentakt PWM zu erhalten ( Gegentak PWM=also wenn das eine Compareregister ein HI ausgibt muß das andere Lo sein und umgekehrt) schalte ich immer das jeweils andere Compareregister für die Zeit einfach aus.Beispiel der Ausgabe: Compare1a=LO/HI/LO/HI und Zeitgleich Compare1b=HI/LO/HI/LO.Das habe ich versucht in einen Code zu fassen.Allerdings sagt mir mein Oszi,daß die Nullsetzung der Compareregister nicht richtig funktioniert.Die Rechteckausgabe ist irgendwie "verwischt" bzw unsauber.Nun meine Frage,wo ist in Code der Fehler zu suchen bzw wie macht man das besser?
viele Grüße
Code:
$regfile = "m8def.dat"
$crystal = 8000000
Config Portb.1 = Output
Config Portb.2 = Output
Config Portc.5 = Input
Config Timer1 = Pwm , Prescale = 1 , Pwm = 8 , _
Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Enable Timer1
Start Timer1
Config Timer0 = Timer , Prescale = 8
Enable Timer0
On Timer0 Isr_von_timer0
Enable Interrupts
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim B As Word
Dim Wert As Word
Dim Up As Bit
Dim Pwm As Byte
Do
'*** ADC einlesen und auf 8 Bit umrechnen ***
Wert = Getadc(5)
B = Wert / 4
Loop
End
Isr_von_timer0:
Timer0 = 192 'Zeitbasis
'*** Compare Register Togglen ***
Toggle Up
If Up = 0 Then
Pwm1b = 0
Pwm1a = Pwm
Else
Pwm1a = 0
Pwm1b = Pwm
End If
'*** PWM Regelung ***
If B > Pwm Then
Pwm = Pwm + 1
End If
If B < Pwm Then
Pwm = Pwm - 1
End If
Return
Lesezeichen