T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
Hallo,
De titel is wat vreemd maar mijn probleem komt op het volgende neer: Ik heb een aansturing gemaakt voor een rookmachine die normaal op 0..10 volt werkt en nu via dmx met een lichttafel bestuurd kan worden. Een PIC wekt een PWM signaal op, dat wordt via een RC netwerk en een opamp vertaald naar 0..10 volt.Op zich werkt dit goed. Maar het probleem is het volgende:
De machine heeft de volgende spanningen nodig:
Function
0 - 1.0 V No function - machine stand by.
1.0 - 2.5 V Enabling the heater circuit - same as ’power on’.
2.5 - 9.5 V Smoke emission. Output increases with control voltage.
9.5 - 10.0 V Timer store.
Nu wil ik dat zodra de connectie er is de heating al begint. Dat betekent dat de output nooit lager mag zijn dan +/- 1.5 volt (ik leg de grens niet bij 2,5 om ongewenst roken te voorkomen). En de bovengrens moet liggen op 9.4 volt. Die geheugenfunctie is alleen maar irritant.
Als ik dat vertaal naar de waarde van het registers waarop de PWM is gebaseerd, dan betekend dat dat dat register nooit lager mag worden dan F en nooit hoger dan 82.
Nu is het geen probleem om te programmeren dat indien lager dan F het register op F wordt gezet en indien hoger dan 82 het op 82 wordt gezet.
Maar dat betekent dat de schuif op de lichttafel maar voor een klein deel invloed heeft op de rookmachine.
Wat ik dus wil is met het gehele bereik van de schuif ( een hele byte, 256 stapjes) een waarde van 15..130 varrieren. 0 moet overeenkomen met 15, 255 met 130. Zodat de schuif over zijn hele lengte effect heeft!
Ik snap dat er precisie verloren gaat. Een pic kent geen 15,5 bijvoorbeeld. Maar dat maakt niet uit! HEt is natuurlijk morgelijk om een offset toe te voegen bij de opamp en de versterking te verkleinen, maar aangezien de print al in elkaar zit, doe ik dit liever niet en los ik het liever software matig op!
Het gaat om een Pic16F628A..
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
Op 13 april 2006 22:23:41 schreef Wouter van Ooijen:
lookup table!
Ja dat is een mogelijkheid waar ik nog niet aan gedacht had... hoe werkte dat ook al weer precies? JE ehbt toch een lijst met een return functie ofzo.. mijn geheugen is wat vaag 
(Mijn Taal is trouwens ASM, Dus aan een JAL voorbeeld heb ik niet zo heel veel
) Ik ga wel even zoeken hiero
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Je kan gemakkelijk maal en gedeeld door 2 doen in asm, gewoon een bitje naar rechts of links verschuiven. Dus de waarde die van je schuiver komt (0-255) deel je door 2 (RRF "waarde" dacht ik), dan wordt dat 0-127, die kan je gemakkelijk inpassen in je gewenste waarde, zonder moeite te moeten doen voor een lookup table (als het gemakkelijk kan, waarom niet).
T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
Op 13 april 2006 22:37:18 schreef Videomodulator:
Je kan gemakkelijk maal en gedeeld door 2 doen in asm, gewoon een bitje naar rechts of links verschuiven. Dus de waarde die van je schuiver komt (0-255) deel je door 2 (RRF "waarde" dacht ik), dan wordt dat 0-127, die kan je gemakkelijk inpassen in je gewenste waarde, zonder moeite te moeten doen voor een lookup table (als het gemakkelijk kan, waarom niet).
Dat was ook mijn eerste idee maar om de een of andere reden werkt het niet.. Hoe ging dat ook al weer met die lookup?
een tellertje
actie 1,2,3,4
dan tel je de waarde van je teller op bij de PCL
directy daaronder zet je een RETLW
call lookup
na retlw komt de pcl weer hier met de waarde in w
lookup movf teller,w
addwf PCL,f ;pcl+X
retlw effect1 ;pcl+1
retlw effect2 ;pcl+2
retlw effect3 ;plc+3
retlw effect4 ;pcl+4
Zoiets moet het dan worden.
T.Assies
Ik zie dingen die je nooit voor mogelijk hield. Ik maak ze mogelijk. Ik kan je pijn en lijden laten zien. In tegenslag vind ik hoop, in de verhalen die ik hoor inspiratie. Ik kan je veel vertellen. Wat ik doe? Ik ontdek. Mijn wereld is jouw wereld.
Op 13 april 2006 23:29:15 schreef The Headhunter:
een tellertje
actie 1,2,3,4dan tel je de waarde van je teller op bij de PCL
directy daaronder zet je een RETLWcall lookup na retlw komt de pcl weer hier met de waarde in w lookup movf teller,w addwf PCL,f ;pcl+X retlw effect1 ;pcl+1 retlw effect2 ;pcl+2 retlw effect3 ;plc+3 retlw effect4 ;pcl+4Zoiets moet het dan worden.
In de datasheet staat dat er 5 bits van PCL beschrijfbaar zijn.. dat betekend dus dat ik niet 256 entries kan hebben in de table. Kan ik natuurlijk ondervangen door te kijken of bit 7 geset is: zo ja: lookup table 2, zo nee: lookup table 1.. Of is hier oko een pasklare oplossing voor?
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 13 april 2006 23:32:37 schreef T.Assies:
[...]In de datasheet staat dat er 5 bits van PCL beschrijfbaar zijn.
welke chip? volgens mij moet dat 8 zijn. maar dan moet je nog steeds goed opletten om een 256-entry table te maken (lees over PCH).