Sida 1 av 2
Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 11:42:26
av PopUnoNkoK
Ursäkta om rubriken var otydlig men jag vet verkligen inte hur jag skulle skriva denna fråga så kort.
Jag har precis lyckats dimmra min första diod med hjälp av PWM vilket känns riktigt bra. Jag har använt Timer kod från Elmer 160 och själva dimmringen har jag skrivit själv.
Så här ser dimmer funktionen ut.
Kod: Markera allt
monster_1
bcf PORTB, d'3'
decfsz dim0, d'1'
goto monster_1
movf dim0_orgi, 0
movwf dim0
movf dim0,W ; PLocka up high tiden
SUBWF helatiden, 0
movwf tidlow
low_time
bsf PORTB, d'3'
decfsz tidlow, d'1'
goto low_time
return
Nu till min fråga. Jag skulle vilja ha dimmer funktionen i en subrutin och som jag sedan kan anropa men även skicka med en variabel, typ Led1. Alltså det jag vill göra är att tända 9 olika dioder eftersom i olika ordningar med att de ska dimmras in istället för att bara tändas. Finns det någon smidig lösning på detta?
MVH Peter F
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 12:03:46
av Nerre
Det normala är väl att push:a funktionsargument på stacken. (Sen beror det väl lite på om även returadressen ligger på stacken, då kan man inte pop:a argumenten utan måste adressera dem relativt stackpekaren.)
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 12:13:59
av JockeE
Jag gissar att detta rör sig om PIC16, och då har man ingen stack att använda.
Det finns inget sätt att skicka argument via en call i PIC-asm. Gör istället helt enkelt så att du reserverar en byte RAM (gärna i shared-RAM), sedan sparar du ditt "argument" i den byten. I subrutinen läser du sedan denna byte.
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 12:15:58
av sodjan
Nerre, det vore bättre med något som är rellevant för PIC.
Det där hjälpte ju ingenting...
> men även skicka med en variabel
Du kan aldrig "skicka med" någonting till en subrutin.
Det hela är väldigt enkelt, lägg bara ditt värde i en variablel
som sedan subrutinen läser. Det enda du måste göra är att
bestämma dig för ett bra namn på variabeln...
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 12:25:08
av PopUnoNkoK
Ytterligare en fråga jag ställer som får ett riktigt enkelt svar...
Då var det bara att komma på ett bra variabelnamn, vilket jag förövrigt alltid varit kass på i alla språk jag programmerat.
Tack för hjälpen.
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 13:00:26
av psynoise
På HC08 brukar jag push:a ut det jag har i ackumulatorn till stacken och använda ackumulatorn som förmedlare mellan subrutiner. Hur brukar man göra på RISC-processorer som har flera ackumulatorer?
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 13:24:49
av sodjan
Det är ju helt arkitekturberoende. Jag tror inte att det går att ge en generellt svar.
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 13:42:35
av PopUnoNkoK
En följdfråga på min dimmer kod.
I koden ovan så blir det ju så att tiden när diodpinnen är låg resp hög ändras i förhållande till varandra.
Alltså.
Om Diod "tid" hög = 1
Är Diod "tid låg = 254
Om Diod "tid" hög = 100
Är Diod "tid låg = 155
Om Diod "tid" hög = 200
Är Diod "tid låg = 55
OSV...
Nu börjar dock tro att hela tiden dioden är tänd 50% av tiden eller mer så uppfattas den som att den lyser 100%.
Stämmer detta?
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 13:50:10
av sodjan
Nej. 50% är 50% och ger (ca) halva ljustyrkan.
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 13:57:30
av Icecap
Ögat är långt ifrån linjärt och vid pulsande styrning luras ögat.
Tänk en blixt som du tittar på: ett kort tag efter ser det fortfarande jävligt ljust ut eller hur?
När du pulser LED kommer de att lysa med "full styrka" i kort tid varefter de släcks och om du sitter för nära "mättas" ditt öga vid en viss intensitet.
Lösningen är att dämpa LED'nas ljus, detta kan göras med att ha dom på avstånd, lägga vitt papper över, rikta dom bort eller en kombination av dessa sätt.
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 14:43:14
av PopUnoNkoK
Jaha...
Anledningen till att jag började fundera var att det inte händer så mycket i början på min dimmerfunktion och desto mer i slutet.. .Men det kanske bara är så det upplevs.
När jag då började fundera så kom jag på att om man blinkar en LED i koden bara på och av, utan delay så upplevs den juh som lysande, då ska den alltså lysa ca 50% av sin styrka i ett sådan fall?
Oki... Får experimentera vidare.
Tack för svaret.
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 25 mars 2009, 14:56:00
av sodjan
Spelar ingen roll om du har "delay" eller inte, så länge du ligger
över ca 100 Hz då ögat inte längre uppfattar "blinkningaran".
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 26 mars 2009, 13:28:34
av dangraf
Jag vet inte riktigt vad du menar med "början" och "slutet" på en PWM signal (som jag misstänker att du styr din led med). När jag arbetade med bakgrundbelysning för skärmar till båtar så ställde man ljusstyrkar enligt en gamma-kurva istället för linjärt.
I detta exemplet skulle vi kunna säga att 0 %duty= ljuset helt släckt och 100%duty = ljuset helt tänkt.
När man ändrade mellan värdena 0, 5 10 %duty så upplevdes det mycket större skillnad i ljusstyrka än när man använder värdena 90,95 100 %duty.
För att få en noggrannare och mer "linjär" inställning av ljusstyrkan så gör man små steg i början och större steg i slutet när man trycker på knappen för att ställa in ljusstyrkan t.ex 1,2,3,4,5,7,9..... 85,90,100.
Anledningen till att detta "krångel" är att när det är mörkt ute så vill man inte mista sitt mörkerseende och dämpa belysningen så mycket som möjligt på datorskärmen. Då fungerar det inte att ha för stora steg i ljusstyrka då det lätt blir för mörkt eller för ljust.
Så om du vill "linjärisera" din lysdiod så skulle jag nog tipsa om att göra en mattematisk modell eller en "lookup table" för att kunna stega mellan givna värden för PWM modulen.
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 26 mars 2009, 14:04:31
av sodjan
Att ha en "linjär" justering kan ju betyda att man har samma %-uella
ändring på varje steg. Och då faller det ju sig naturligt att det absoluta
steget blir större och större. Säg att man vill ha 10 steg som har samma
rellativa ändring (förrutom det första stegat av naturliga orsaker).
Varje steg på en skala från 1-100 skulle då t.ex kunna bli :
0, 5, 7, 10, 14, 19, 26, 37, 51, 72, 100
där alltså den rellativa ökningen mnellan varje steg är lika stor hela tiden
(förrutom första steget så klart) i detta fall ca 40 %. Första värdet (5 i detta
fall) får sättas "för hand" till den lägsta önskade ljusstyrkan, resten av
värderna kan räknas fram.
Enklast plockar man fram lämpliga värden (t.ex 0 - 255 om det är enklast
att hantera) i Excel eller liknande och lägger det i en tabell. Sedan stegar
man genom ljusstyrka 1-20 (eller hur många steg man nu vill ha) och hämtar
aktuellt PWM värde från tabellen...
Re: Anropa en subrutin med en variabel, typ minsubrutin(led1)
Postat: 26 mars 2009, 15:01:24
av PopUnoNkoK
Ni har fruktansvärt smarta tips.
Jag kommer nog att testa Sodjans exempel när jag vill "perfektionera" min dimmer men det får bli senare, dimmern fungerar till belåtenhet nu.
Det finns ju så många andra saker man vill testa...
