RGB-lysdioder och "fade in/out" program för PIC.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
netrunner
Inlägg: 5510
Blev medlem: 4 februari 2005, 12:26:05
Ort: 127.0.0.1

RGB-lysdioder och "fade in/out" program för PIC.

Inlägg av netrunner »

Kan någon "kod gud" hjälpa mig optimera?

Har skaffat en hel bunt med röd/gröna/blå lysdioder, ca 40st av varje. Med dessa vill jag bygga en liten tuffare lampa som ska kunna variera ljusstyrkan efter ljusnivån i rumet. Den ska vara på 24/7.

Det är kanske lite snålt att be om hjälp på detta sätt men någon annan kan kanske få hjälp av att läsa tråden oxå.

Jag sitter med Velleman kit 8048 och en PIC16F627. Skriver programmet i mikroBASIC.

Nu kan jag inga fina finesser så koden kommer att blir för stor. Försöker med mjukvaru PWM såhär (skratta inte tack jag är nybörjare):

Kod: Markera allt

program LED_fade

dim styrka as byte
dim snabbhet as byte
dim tid as byte
main:
  TRISB = 0             ' configure pins of portb as output
  for styrka = 0 to 30
    for snabbhet = 0 to 10
      for tid = 0 to 30
        if tid >= styrka then
          PORTB = %00000000     ' turn OFF diodes on portb
        else
          PORTB = %00000001     ' turn ON diodes on portb
        end if
        delay_ms(1)        ' wait for 1 ms second
        tid = tid + 1
      next tid
      snabbhet = snabbhet +1
    next snabbhet
    styrka = styrka + 1
  next styrka
Så har jag en andra halva som kör exakt samma sak baklänges för att lysdioden ska "fade:a ut". Också loopar allt tillbaka till "main".

Det är så långt jag har kommit...

Redan nu så tar programet ca 15% av minnet och jag behöver gör 3^3 upprepningar så att alla färger får vara med och inte bara en!

Hur har alla ni med husnummer skyltar fixa det?

LDR motståndet får nog vara med i ver2. Jag är glad om jag får fart på detta först.

/Tack på förhand...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Ska R/G/B dioderna styras tillsammans eller var för sig ?

> Försöker med mjukvaru PWM så här (skratta inte tack...)

Varför det ? F627 har ingen hårdvaru PWM så du har inget alternativ.

> Skriver programmet i mikroBASIC.

Där har du första problemet, och sannolikt ett av de större... :-)

Du behöver hantera det lite i nivåer.
Först en (sannolikt timer-interrupt triggad) rutin som sköter själva PWM hanteringen.
Den sköter ljustyrkan utifrån tre värden. Det finns flera exempel på
http://www.piclist.com/techref/microchip/routines.htm
t.ex en 8-kanalers från Scott Dattalo som kan skalas ner till tre.
(Just *nu* svarar dock inte piclist.com...)

Sedan en main-kod där logiken för att ändra de tre ljusstyrke värdena ligger.
Den logiken kan se lite olika ut beroende vilket "mönster" du vill ha.

Genom att lägga det i två olika delar så blir det mycket enklare att
justera i en av dom utan att den andra delen "störs".

> Hur har alla ni med husnummer skyltar fixa det?

Tja, det är absolut inget speciellt problem, men de flesta skulle kanske
köra assembler på t.ex en av 8-pinnarna i 12F-serien för att få det kompakt...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

>> netrunner

Det ser inte alls ut att vara en dum start (förutom det konstanta tjatandet om att det är i fel språk :wink: ).

Precis som sodjan säger, så måste du lägga själva skötandet av PWM i en interrupt-rutin som triggas av en timer, sen kan du lugnt sköta styrandet av färg-intensiteterna i huvudprogrammet.

För att det inte ska bli tråkigt att titta på den efter några varv har jag löst det med att låta en slumpgenerator välja vilka nyanser som visas, sedan ställt in ett väldigt enkelt lågpassfilter så de tonar fram hela tiden i lämpliga tidsintervall. Mycket vackert resultat!
matseng
Inlägg: 2360
Blev medlem: 16 september 2003, 17:18:13
Ort: Dubai, United Arab Emirates
Kontakt:

Inlägg av matseng »

Nu har jag aldrig använt microbasic, men en fethög med andra basicdialeker under de senaste 30 åren. Och inte i någon av dom har man varit tvungen att manuellt öka på räknarvariablerna innuti for-looparna som:

for tid=0 to 30
.....
.....
tid = tid + 1
next tid


Gör man så blir det det bara 15 varv i loopen. Eftersom Next själv ökar på variabeln med 1 så räcker det fint med att bara skriva:

for tid=0 to 30
.....
.....
next tid


Nu påverkar ju inte det just den här programmet särskilt mycket, allt som händer är ju att allt går dubbelt så fort/kort som man har planerat. Men det kan ju vara bra att veta till framtida programmering.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK. :-)

Det går antagligen att fixa med MikroBasic också.
Bara man ser till att inte skriva "VB-style" kod.

Många tror att det är enklare att köra Basic på PIC
bara för att man har programmerat i Visual Basic tidigare.
Men det är snarare en anledning till att *inte* köra Basic på PIC. :-)

I sådana här fall slutar det ofta med en kod där Basic'en utgör ett "skal",
och själva koden mest består av direkt registerhantering...

Men visst, "fungerar" kanske det gör.
Användarvisningsbild
netrunner
Inlägg: 5510
Blev medlem: 4 februari 2005, 12:26:05
Ort: 127.0.0.1

Inlägg av netrunner »

Stort tack till alla.

Jo, nu fattar jag att detta kanske inte är ett stort "fan" forum för basic men jag fick det inte att fungera alls i asambler. :wink:

sodjan: Visste inte att det inte fans någon hårdvaru PWM men det var ju kul att jag var rätt ute med mjukvara. Måste bara lära mig att gå innan jag kan springa... :twisted:

matseng: Givetvis har du rätt. Otroligt att man kan sitta och läsa sin egen kod utan att "se" det man läser. Nu har jag städat lite i koden. :D
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> men jag fick det inte att fungera alls i asambler.

OK, troligtsvis inte assemblerns fel... 8)

> Visste inte att det inte fanns någon hårdvaru PWM...

Inte i 16F627, du får "gå upp" till (t.ex) 16F88 (samma storlek, 18-pin,
men med mycket mer inbyggt "godis")...

Hur som helst, HW-PWM modulen i den mindre PIC'arna har bara en
ut-kanal, och kan alltså inte användas för att styra tre LEDs i alla fall.

Slutligen, databladen är helt solklara på vad som ingår eller inte
i varje modell. Man kan även kolla parametersökningen på
www.microchip.com, så ser man tydligt vilka som har vad.
Användarvisningsbild
netrunner
Inlägg: 5510
Blev medlem: 4 februari 2005, 12:26:05
Ort: 127.0.0.1

Inlägg av netrunner »

sojan: Nej, jag tror inte det var asamblern som var dum igår. :D
Jag lät mig luras att tro "mindre nummer = mindre krets och mindre godis"
Kan ju vara så att det ska läsas som 16F88(0).

Har fått ordning i koden i alla fall. Så nu ska det gå att få alla grunder att fungera med trivial anpassning...

Kod: Markera allt

program LED_fade_ver06

dim counter_1 as byte      ' ljusstyrkan, max styrka är 20
dim counter_2 as byte      ' hur fort den växlar, 1 varv 20ms
dim counter_PWM as byte    ' faktisk PWM, knuten till "counter_1"
dim RGB_dioder_on as byte  ' färger som ska vara på
dim RGB_dioder_off as byte ' färger som ska vara av

sub procedure fade

  for counter_1 = 0 to 20         ' Nu tonar vi upp
    for counter_2 = 0 to 5
      for counter_PWM = 0 to 20
        if counter_PWM >= counter_1 then
          PORTB = RGB_dioder_off  ' turn OFF diodes on portb
        else
          PORTB = RGB_dioder_on   ' turn ON diodes on portb
        end if
        delay_ms(1)               ' wait for 1ms
      next counter_PWM
    next counter_2
  next counter_1

  for counter_1 = 0 to 20        ' Nu tonar vi ner
    for counter_2 = 0 to 5
      for counter_PWM = 0 to 20
        if counter_PWM >= counter_1 then
          PORTB = RGB_dioder_on   ' turn ON diodes on portb
        else
          PORTB = RGB_dioder_off  ' turn OFF diodes on portb
        end if
        delay_ms(1)               ' wait for 1ms
      next counter_PWM
    next counter_2
  next counter_1

end sub

main:
  TRISB = 0                       ' configure pins of portb as output
  RGB_dioder_on =  %00000001      ' väljer färger som ska vara på
  RGB_dioder_off = %00000000      ' väljer färger som ska vara av
  fade
goto main                         ' endless loop
end.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag lät mig luras att tro "mindre nummer = mindre krets och mindre godis"

Jo, he he...

Man skulle t.ex kunna tro att 16F84 och 16F88 är väldigt lika kretsar
(ungefär som 16F627/628/648), men inget kunde vara mer fel.

16F84 är än gammal stendöd PIC som ingen har anledning att använda idag.

16F88 däremot, är den idag kraftfullaste PIC'en i 18-pinnars kapsel...

Så lita inte på numren, kolla "Line Card".
modro
Inlägg: 37
Blev medlem: 3 december 2004, 09:12:36
Ort: Småland

Inlägg av modro »

Så här gör jag för att fade en led upp och ner med PIC16F877A och Mbasic

CPU = 16F877A
MHZ = 10
CONFIG 16186

counter1 var byte
counter2 var byte

main:

for counter1 = 1 to 255 step 1
pwm a5,counter1,10
next

for counter2 = 255 to 1 step - 1
pwm a5,counter2,10
next

goto main

den fadar en led som sitter på port a5 upp och ner i evighet
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

modro: Måste bara fråga en grejj, trots att det är aningen off-topic. :)
Jag kör också MicroBasic (som jag gissar Mbasic betyder).

En for-loop med step - 1 fungerar inte i mitt MicroBasic. Trots att jag skriver exakt likadant som du. (Har provat detta många gånger.)

Vad har du för version?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

modro,
hur gör du för två LEDs (eller fler) som "fade'as" oberoende av varandra ?
modro
Inlägg: 37
Blev medlem: 3 december 2004, 09:12:36
Ort: Småland

Inlägg av modro »

Sorry för väntetiden!

>>Vad har du för version?

japp mbasic och microbasic är samma sak, min version 05.2.1.1 står det i "About" under help. har du samma ?

>>Sodjan
kod för 2leds som fadas, sitter och pillar kod så dom ska bli helt oberonde av varandra men den ser ut så här just nu alla fall.

CPU = 16F877A
MHZ = 10
CONFIG 16186

trisa = $00

counter1 var byte
counter2 var byte
counter3 var byte
counter4 var byte

main:

gosub fade
gosub fade2

goto main

fade:
for counter1 = 1 to 255 step 5
pwm a0,counter1,10
next

for counter2 = 255 to 1 step - 5
pwm a0,counter2,10
next

return

fade2:
for counter3 = 1 to 255 step 5
pwm a3,counter3,10
next

for counter4 = 255 to 1 step - 5
pwm a3,counter4,10
next

return
goto main

Vill ni ha kommentarer kan jag sätta ut de.
Användarvisningsbild
tecno
Inlägg: 27252
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Inlägg av tecno »

.............. japp mbasic och microbasic är samma sak

Skulle inte tro det, MBasic - Microbasic - mikroBasic är alla OLIKA !
modro
Inlägg: 37
Blev medlem: 3 december 2004, 09:12:36
Ort: Småland

Inlägg av modro »

>>Tecno, Skulle inte tro det, MBasic - Microbasic - mikroBasic är alla OLIKA !

hmm i mjukvaran står det Microbasic och när man kollar i den medföljande manualen står det Mbasic ?
Skriv svar