Ik heb een stukje code in jal om pwm te maken via de TMR0, alleen draait het nu op zo'n 40 hertz, iets wat me veel te langzaam lijkt voor een 20 mhz 16F84A.
Nou kom ik er even niet meer uit, ik krijg hem wel langzamer door de prescaler hoger te zetten maar ik krijg hem met geen mogelijkheid sneller.
Als ik tmr0 hoger maak is er geen verschil.
include 16f84_20
include jlib
port_b_direction = all_output
pin_a4_direction = input
port_b = 0
var byte pwm = 0
status_rp0 = true
status_rp1 = false
intcon = 0b_1010_0000
tmr0 = 0b_0000_0000
status_rp0 = false
tmr0 = 1
forever loop
end loop
procedure interrupt is
pragma interrupt
if pwm == 255 then
pwm = 0
port_b = 0
elsif pwm == 128 then
port_b = 255
pwm = pwm + 1
else
pwm = pwm + 1
end if
intcon_t0if = low
end procedureElectroprutser
Recente projecten: ASURO-Robot, K8048
Volgens mij kun je alleen snelheid winnen door je code binnen de loop efficienter te maken.
( ben programmeur van hobby maar heb geen werkelijke ervaring met pic )
procedure interrupt is
pragma interrupt
if pwm == 255 then
pwm = 0
port_b = 0
elsif pwm == 128 then
port_b = 255
end if
pwm = pwm + 1
intcon_t0if = low
end procedure
Als je daadwerkelijk tegen de max. verwerkingssnelheid van je PIC oploopt dan zou dit misschien ietsje kunnen schelen?
Wacht natuurlijk, ik had er niet bij stilgestaan dat de timer 256 keer moet triggeren voor 1 pwm cycle en dat de timer zelf triggert bij 256 kloktikken.
Dan krijg je dus 5.000.000 / 65535 = 76,3.
Reken er dan nog bij dat de prescaler op 1:2 staat en dan kom je op 38,15 hertz uit.
Ik heb nu de prescaler op de watchdog timer gezet, die gebruik ik toch niet en nu krijg ik een pwm frequentie van 76,3 hertz, wat prima is.
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Op welke snelheid staat je interrupt nu ingesteld?
Je zegt dat je timer0 gebruikt, nu laat je die steeds tellen tot 256, terwijl dat helemaal niet nodig is. Je kan best aan het eind van de interrupt de waarde (256 - X) steken, waar x het aantal instructie's is die tussen de interrupts moet gebeuren. Als je bijvoorbeeld 5 neemt (dan zal je gewone programma relatief traag lopen, maar dat maakt ws niet uit), zal je PWM 50 keer sneller draaien, dus 2kHz.
Wil je hoger dan die 2kHz, neem dan ofwel een PIC met ingebouwde PWM module, of maak een analoge waarde met je PIC, en genereer met een NE555 een zaagtand (0-5V) op de frequentie die je je PWM wil laten doen.
Ik heb trouwens hier al een voorbeeldje (in basic) gepost, om 4 kanaals ledjes te PWM'en op 100Hz, met een pic op inwendige klok van 8MHz, bekijk dat eventueel ook eens voor het id van de interrupts.
Een interrupt op snelheid instellen is nieuw voor mij.
De timer loopt gewoon van 0 tot 255 en op het moment dat hij weer 0 wordt krijg je een interrupt.
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Op 16 juni 2006 22:53:17 schreef bobo1on1:
Een interrupt op snelheid instellen is nieuw voor mij.De timer loopt gewoon van 0 tot 255 en op het moment dat hij weer 0 wordt krijg je een interrupt.
Maar als je em op het einde van je interrupt op bijvoorbeeld 250 zet, zal ie 5 instructie's nadat ie uit de interrupt komt, er weer in gaan, waardoor je dat enorm versneld. Staat trouwens in de datasheet.
Bedankt.