Sida 1 av 1
Dimma en 7 segments display
Postat: 12 februari 2009, 07:48:32
av ansu2723
Har ett litet knepigt problem. Jag har 6 LED 7 segments-displayer som är kopplad till en PIC16F870 som jag multiplexar ut info på. Har ett program skrivet i Mikrobasic för att styra dessa displayer.
I interruptkoden har jag förståss visningen av displayerna. Nu vill jag dimma displayerna.
Har testat med att lägga in fördröjning i interupten och får då effekten att segmenten dimmar men på bekostnad av att övriga funktioner som knapptryckningar inte alltid går igenom.
Jag förstår även att man inte kan göra så här men hur gör man i Mikrobasic.
Det jag vill uppnå med de 6 displayerna är att från nuläget då de får vara tända 1/6 av tiden så vill jag att de endast ska vara tända 1/12 av tiden men att allt går lika fort i interuptet.
Hoppas någon förstår vad jag vill uppnå.
Anledningen är att jag vill att segmenten ska gå för fullt på nätdrift samt halvfart på batteridrift.
Re: Dimma en 7 segments display
Postat: 12 februari 2009, 09:14:19
av AndLi
Eftersom man typ alltid vill ur interruptrutiner så fort som möjligt är det dumt att lägga fördröjningsrutiner i den.
Varför inte helt enkelt hoppa över uppdateringen på varannan interruptrutin?
Re: Dimma en 7 segments display
Postat: 12 februari 2009, 09:57:54
av vfr
Nja, att hoppa över uppdateringen varannan gång gör bara att risken för flimmer ökar eftersom uppdateringsfrekvensen blir hälften. Det blir ingen dimmning av det.
Du skall istället låta bli att tända några segment på vartannat avbrott och köra varannan avbrottsperiod svart istället. Gärna då med dubblad avbrottsfrekvens också för att inte få mer flimmer. Där har du en grund iallafall, sedan får du "leka" och testa dig fram lite vad som ser bra ut.
Edit: Håller fullständigt med AndLi att du inte skall ha några fördröjningar i avbrottsrutinerna.
Re: Dimma en 7 segments display
Postat: 12 februari 2009, 10:02:25
av Icecap
Jag gjorde detta i sin tid och det var "ganska enkelt".
1: Räkna ut 2 tider som beror på dutycycle & skanningstid, det blir alltså en "släck-tid" och en "på-tid".
2: Vid interrupt för "nästa siffer" ställer man först in "släcktiden" i timern och släcker ner displayen.
3: Vid nästa interrupt (alltså efter den inställda "släcktiden") slår man på displayen och ställer timern till att ge interrupt efter "påtiden".
Är andra delar beroende av samma interrupt är det bara att köra dom när "på-tiden" laddas, då får du samma hastighet.
På det vis kan man enkelt ändra intensiteten, jag hade 127 nivåer + "helt av" och tekniken finns i de "DU KÖR FOR FORT"-skyltar som fanns i Stockholm (flest) med LED-siffror.
Tiden uträknas ganska enkelt vid att den nuvarande uppdateringshastighet delas upp i t.ex. 16 bitar och sedan fördelas:
Av:På
0:16 Helt nersläckt.
1:15 Svagt
2:14 Lite mindre svagt
...
15:1 Bra med kräm
16:0 Full patte
6 siffror med 70Hz uppdateringsfrekvens blir alltså en interrupt på 420Hz vilket ger 2,38ms.
Den tid kan sedan fördelas bäst man vill, självklart bör rutinen som återladdar tiderna ha koll på om endera tid är 0 och då låta bli att återladda den.
För att det ska förlöpa smidigt bör man räkna ut tiderna i main-loop'en, likaså bör utskriften ske ifrån en buffer som håller bitmönstret till displayen, på detta vis kan man skriva ut och reglera intensiteten från main-loop utan att ISR'n ska svettas extra för det.