Ik probeer met Bascom avr een PWM signaal te generen met een schuifregister. Dit omdat ik meer kanalen nodig heb dan de 4 hardware matige.

ik loop alleen tegen een raar probleem op.

dit is het programma (alleen relevante code)


$regfile = "m16def.dat"
$crystal = 12000000
$crystal = 12000000
$baud = 9600
' Declaratiets
Config Portc = Output
Config Portb = Output

Dta Alias Portb.0 ' data
Clk Alias Portb.1 ' clock
Rst Alias Portb.3 ' master reset
Ltc Alias Portb.2 ' latch

Dim Red As Byte , Green As Byte , Blue As Byte , Red_out As Byte 
dim Green_out As Byte , Blue_out As Byte
Dim Trm2 As Byte, x as byte
Config Timer0 = Timer , Prescale = 1

Portc.0 = 1
Waitms 500
Portc.0 = 0

On Ovf0 Tim2_isr
Enable Timer0
Enable Interrupts
Rst = 1


Do
For X = 0 To 255
Blue = X
Toggle Portc.0
Waitms 1
Next X
For X = 255 To 0 Step -1
Blue = X
Toggle Portc.0
Waitms 1
Next X
Loop
End

Tim2_isr:
Incr Trm2
If Blue > Trm2 Or Blue = Trm2 Then
   Blue_out = 255
   Else
   Blue_out = 0
End If
If Red > Trm2 Or Red = Trm2 Then
   Red_out = 255
   Else
   Red_out = 0
End If
If Green > Trm2 Or Green = Trm2 Then
   Green_out = 255
   Else
   Green_out = 0
End If

Shiftout Dta , Clk , Red_out , 1
Shiftout Dta , Clk , Green_out , 1
Shiftout Dta , Clk , Blue_out , 1
Ltc = 1
nop
Ltc = 0
nop
Return

Verder staan de volgende fuses aan:

CKOPT
SUT0
SUT0
CKSEL0

en er zit een Kristal aangesloten van 12MHz met condensatortjes welke ook werkt. (Scoop)

en ik heb de volgende problemen

Het ledje op portc.0 knippert bij lange na niet op 1mS interval. hier zit veel meer tussen. denk hierbij aan ~500mS

Als ik de clock meet van het schuifregister signaal komt deze uit op een 312.5 keer per seconde. Omdat ik in basic programeer zal er inderdaad een afwijking in zitten maar je zit hem haast knipperen dus dat klopt niet volgens mij.

Ik vermoed dat het een timing iets is maar ik kom er niet uit hoe en waar het zit.

Je gebruikt timer0 zijn overflow interrupt met een prescale van 1.
Timer0 = een 8 bit timer dus die genereerd om de 255 clock cycles een interrupt.
Jouw Tim2_isr routine heeft 642 clock cycles nodig om uit te voeren. Daarbij komt nog dat je stack nog gepushed en gepoped wordt.
Je gehele Tim2_isr duurt dus ongeveer 705 clock cycles, maar naar 256 cycles is daar alweer de volgende interrupt.
Dit gaat dus niet werken, back to the drawing board.

dus als ik timer1 zou gebruiken dan zou ik binnen die tijd kunnen blijven door die timer te preloaden en dan blijf ik wel binnen mijn cycles :) of denk ik nou verkeerd

Ja, je kan natuurlijk ook timer0 een prescale=8 geven en kijken of het dan beter werkt.

Hm timer0 op prescale met 8 nog steeds een hoop geknipper.

maar toen ik de bit resolutie omlaag haalde: 8 bit naar 7 bit (max waarde 100) dan werkt het al beter (alleen bij zeer lage waarden licht geknipper)

nu alleen nog uitvogelen waarom mijn ene schuif register niet meewerkt, ik vermoed verkeerd aangesloten of zoiets.

In elk geval hartelijk dank :)