So, es gab auch eine Antwort dort im Forum,
die mir half, meinen Fuß von der Leitung zu nehmen.
Ich weiß auch nicht, warum ich nicht gleich drauf gekommen bin,
aber der Einspruch war berechtigt
Es stimmt nämlöich, dass man nicht generell von einem Fehler bei der Kombi: ATtiny25 & Config TIMER0 = Pwm reden kann.
Es stimmt, dass die Bits in den beiden Registern TCCR0A und TCCR0B für phase correct PWM korrekt gesetzt werden.
Es stimmt auch, dass man Dinge wie einen Fast PWM mode via Register-Bits einschalten muss.
Und jetzt kommt der Haken: Es ist nämlich so, dass die beiden BASCOM-Befehle Stop TIMER0 und Start TIMER0 beide die unangenehme Eigenschaft haben, vorher gesetzte Bits im Register TCCR0B zu löschen.
Nach
Config Timer0 = Pwm , Compare A Pwm = Disconnect , Compare B Pwm = Clear Down , Prescale = 64
enthält TCCR0B ja das Bitmuster 00001011.
Kommt jetzt
Stop TIMER0
dann ist TCCR0B = 00000000, wird also komplett gelöscht.
Beim Befehl
Start TIMER0
ist es dann so, dass nur die drei niederwertigsten Bits mit der Prescaler-Info restauriert werden,
Das heißt, auch wenn man die Bits in TCCR0B.7 bis TCCR0B.3 vorher restauriert, steht nach dem
Befehl in TCCR0B nur das Muster 00000011 statt 00001011 drin.
Statt einem Fast PWM mode mit OCR0A = TOP wird daraus dann ein normaler Fast PWM mode
mit xhFF = Top.
Sodele, geklärt die Sache. Ich weiß nicht, ob das jetzt ein echter Bug oder nur ein Viertel-Bug ist.
Doch wenn das verhalten von Start und Stop TIMERX schon geändert wer den sollte, dann könnte
MCS auch gleich Nägel mit Köpfen machen und die anderen Timer-Modi implementieren,
also für Config TIMERX neben COUNTER | TIMER | PWM auch gleich noch die fehlenden Attribute
FAST PWM | PWM OCRA | FAST PWM OCRA und die Sache wäre perfekt.
Mein neuer Umgehungs-Code (Ersetzung für Start und Stop TIMERX) sieht daher so aus:
$regfile = "attiny25.dat" 'chip
$noramclear 'saves memory
'*** stack spaces ***
$hwstack = 32 'hardware stack
$swstack = 10 'software stack
$framesize = 40 'frame space
'*** port settings ***
Config Portb = Input
'*** effective clock settings ***
Config Clockdiv = 4
'*** constants ***
Const Period = 80
Const Pulse = 20
'*** variables ***
Dim Start_timer As Byte
Dim Stop_timer As Byte
'*** configure TIMER0 in Fast PWM mode with OCR0A as TOP ***
Config Timer0 = Pwm , Compare A Pwm = Disconnect , Compare B Pwm = Clear Down , Prescale = 64
Tccr0a.wgm01 = 1 'set fast mode
Tccr0b.wgm02 = 1 'set OCR0A = TOP
Start_timer = Tccr0b 'stores value to start timer
Stop_timer = Tccr0b And &B11111000 'stores value to stop timer
Tccr0b = Stop_timer 'stops TIMER0
'* preset of OCR0A and OCR0B
Ocr0a = Period
Ocr0b = Pulse
'*** interrupt start ***
Enable Timer0
Enable Interrupts
Tccr0b = Start_timer 'starts TIMER0
'*** main loop ***
Do
nop
Loop