PatrickB
--Patrick
Hallo,
Voor school moet ik een PIC16F887 programmeren. De opdracht is vrij, dus ik heb in overleg met de leraar gekozen om een bingo programmaatje erop te zetten. In eerste instantie zou ik dit via een LCD display doen, maar daar ben ik nu een week mee bezig en nog geen steek verder. Dat idee is dus in de prullenbak beland.
Ik heb het nu aardig werkend met een viertal 7 segment displays. Het probleem is nu echter dat het hierop slecht te zien is welk teken erop staat, omdat de display last heeft van "ghosting" (sorry, weet meer van computeronderdelen dan van dit soort ding
), een aantal segmenten gaan aan op de helft van de intensiteit van de juiste segmenten.
We hebben bij de leraar een DB038 bordje gekregen (link naar datasheet). Hierop zitten de 7 segment displays en alles al op.
Dit probleem bestaat eigenlijk sinds ik de volgende code gebruik om de tekens voor de display te bepalen:
MOVF RandLo, W
ANDLW h'0F'
MOVWF rand1
SWAPF RandLo, W
ANDLW h'0F'
MOVWF rand2
MOVF RandHi, W
ANDLW h'0F'
MOVWF rand3
SWAPF RandHi, W
ANDLW h'0F'
MOVWF rand4Zolang ik de ANDLW instructie niet gebruik heb ik geen last van dit effect, maar dan zijn de 7 segment displays veelal leeg.
Omdat jullie hoogstwaarschijnlijk niets kunnen zonder de rest van de code, heb ik dit online gezet in ZIP formaat. Het gaat hier om 5 bestanden, allemaal PIC ASM. Te downloaden vanaf http://www.patrickbregman.eu/ASM-EIND.zip
Om heel eerlijk te zijn zit er bij nogal spoed achter dit probleem, ik moet het morgen om 3 uur inleveren
Maargoed, het ding zelf werkt goed, dus het is eigenlijk meer een schoonheidsfoutje in mijn ogen.
Daarnaast heb ik nog een vraag, deze is minder belangrijk.
Ik heb een Random Number generator gevonden op het internet (Bron, 3e post van beneden). Ik heb deze gebruikt omdat ik een RNG wilde zonder al te veel gedoe. Nu geeft deze altijd een ander getal. Erg mooi, precies wat ik zoek.
Het enige wat ik niet begrijp is, hij start toch steeds met 1 en hetzelfde getal? Hoe kan er dan steeds een ander getal uitkomen?
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Op 4 november 2008 21:04:08 schreef PatrickB:
Ik heb het nu aardig werkend met een viertal 7 segment displays. Het probleem is nu echter dat het hierop slecht te zien is welk teken erop staat, omdat de display last heeft van "ghosting"
Als je 7-segment displays (of een matrix van LED's) wil multiplexen, doe je er goed aan om tijdens het wisselen van het ene display naar het andere een "dode tijd" in te voegen, waarbij alles gedoofd is.
benleentje
Golden Member
Ik denk dat de PIC door de ANDLW instructie daar te lang mee bezig is. Waardoor het te weinig tijd heeft om optijd de segmenten te updaten.
PatrickB
--Patrick
Hoelang raad je ongeveer aan? Ik heb er nu 2ms tussen zitten. Ik zie het effect ook nog met een 7ms, hoewel ik dan ook enigzins begint te trillen. Ik heb ook alle tussenstappen (3ms, 4ms, 5ms, 6ms) geprobeerd.
Het lijkt er haast op dat het een keuze is tussen óf ghosting, óf "trillende" displays. Helaas zijn ze ook bij het trillen nog niet 100% vrij van ghosting.
EDIT: @BenLeentje: Dat idee had ik ook, daarom update ik eens in de 512 weergavecycli de data die moet worden weergeven. Die optie had ik dus al uitgesloten. Toch bedankt voor de suggestie.
benleentje
Golden Member
Ik begrijp niet goed wat je bedoelt met weergave cycly. Je hebt 4 displays. Die zouden dan elke 1/4 deel van je weergave moeten branden. Daarbij mag je de lichtsterkte iets opvoeren omdat 75% van de tijd het display uit is. Als 20mA continu normaal is mag het nu wel 40mA hebben.
Voorbeeld.
JE stuurt segment 1 aan en latch de data poort. (dedaat blijft op de poort staan. Je programma gaat verder. Na 25% van de display tijd gaat het volgende segment aan.
Dit moet dan via een interrupt routine. Een interne hardware timer bepaald dan of er weer een 1/4 deel van de display tijd voorbij is bv 25mS. Als de timer die tijd bereikt heeft geeft het een interupt aan je programma.
Je programma springt dan naar de interrupt routine en handelt de interrupt volgens de juiste procedure af. En zorgt ervoor dat het volgende segment oplicht.
De informatie moet dan wel klaar staan in een display geheugen 1 voor elke segment. Want als de interupt routine zelf dit moet dan duurt deze te lang. Een ISR mopet daarom zo kort als mogelijk zijn. Als de ISR klaar kan het programma verder.
EDIT.
Ik heb je programma overigens niet gelezen omdat ik zelf met picbasic werk en niet zo thuis ben in asm.
PatrickB
--Patrick
OKé, ik heb even op internet gezocht en met een vriend overlegd, en door steeds 4ms te wachten tussen de display's ziet het er perfect uit.
@benleentje: Ik gebruik geen interrupts, hebben we niet geleerd. Staat wel op mijn lijstje van dingen die ik wil gaan proberen zodra we de opdracht hebben ingeleverd.
Dan rest alleen nog de vraag (puur voor mijn interesse), hoe werkt deze code nu precies?
Dit is de code die ik gebruik voor mijn Random Number Generator. Let wel, de RandHi, RandLo en temp zijn niet geinitialiseerd (wat een woord
).
GET_RANDOM:
RLF RandHi, W ; Schuif RandHi naar links door de carry, resultaat in f
XORWF RandHi, W ; XOR RandHi met W, resultaat in W
MOVWF temp ; Verplaats de inhoud van W naar temp
SWAPF RandHi, W ; Wissel de bovenste en onderste nibbel van RandHi, resultaat in W
RLF RandLo, f ; Schuif RandLo naar links door de carry, resultaat in f
RLF RandHi, f ; Schuif RandHi naar links door de carry, resultaat in f
SWAPF RandLo, f ; Wissel de bovenste en onderste nibbel van RandLo, resultaat in W
XORWF RandLo, W ; XOR RandLo met W, resultaat in W
SWAPF RandLo, f ; Wissel de bovenste en onderste nibbel van RandLo, resultaat in f
RLF temp, f ; Schuif temp naar links door de carry, resultaat in f
RLF temp, f ; Schuif temp naar links door de carry, resultaat in f
XORWF temp, W ; XOR temp met W, resultaat in W
MOVWF temp ; Verplaats de inhoud van W naar temp
RLF RandLo, f ; Schuif RandLo naar links, resultaat in f
RRF temp, f ; Schuif temp naar rechts, resultaat in f
RLF RandLo, f ; Schuif RandLo naar links, resultaat in f
RETURN ; Klaar, terug naar aanroeper Fantomaz
Ik moet hier weer vaker komen... Wat kun je zo'n forum als deze gaan missen. :-)
Waarom hoor ik niemand over het "downpullen" van de uitgangen?
Ik heb mijn 7ser-displays ook altijd met vage "beetje aanwezige" spanningen gehad.
Pas wanneer ik de uitgangen via een weerstand aan massa leg, heb ik dat effect niet.
NB. ik heb niet alles nagelezen... Om me even in te dekken wanneer ik de plank nu volledig mis blijk te slaan 
Henry S.
Moderator
Confucius says chà bù duo. Deze post is niet door ChatGPT gegenereerd. De 2019 CO labvoeding.
Op 4 november 2008 23:14:48 schreef PatrickB:
Dan rest alleen nog de vraag (puur voor mijn interesse), hoe werkt deze code nu precies?
Sure...
Gooi er wat in en er komt wat uit, mooie bitjes oefening op papier.
PatrickB
--Patrick
Maar wat gaat er dan precies in? De registers zijn niet geinitialiseerd. Dus ik zou verwachten dat er continue hetzelfde uitkomt. Maar (even gekeken) er komt deze o.a. data uit: 4E4B, 38d5, 71AB, E359, CBCD, 1A7C. Dit is steeds na een reset de eerste data die op de 7segment displays komt te staan.
Volgens mij zie ik dus "iets" over het hoofd, of het register wordt al random geinitialiseerd op de een of andere manier. Als ik deze initieële staat weet, dan kan ik van daaruit gewoon met bitjes gaan werken.
Op zich begrijp ik ook best wat de code doet (het commentaar erachter is van mij) maar ik begrijp niet waarom er (in mijn ogen) willekeurige data uit komt. Sure, het is mooi dat het werkt, maar hoe?
Henry S.
Moderator
Confucius says chà bù duo. Deze post is niet door ChatGPT gegenereerd. De 2019 CO labvoeding.
Op 4 november 2008 23:33:47 schreef PatrickB:
Maar wat gaat er dan precies in? De registers zijn niet geinitialiseerd. Dus ik zou verwachten dat er continue hetzelfde uitkomt.
Is die gedachtengang goed? Wat als je die registers wel initialiseerd, en waarmee?
Leuk testbordje wat jullie daar hebben. Zie dat Voti 'm alleen (helaas) niet aan het grote publiek verkoopt.
PatrickB
--Patrick
Je kunt hem natuurlijk altijd mailen of hij er eentje wil verkopen. Reken alleen wel op een prijs van ongeveer €60,-.
benleentje
Golden Member
Door te schuiven wordt er elke keer een carry bit ingevoegd. Carry bit is toch het resultaat van een voorgaande berekening. Dus feitelijk voeg je steed een onbekende bit toe.
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 7 november 2008 09:57:57 schreef PatrickB:
Je kunt hem natuurlijk altijd mailen of hij er eentje wil verkopen. Reken alleen wel op een prijs van ongeveer €60,-.
Dat wordt eerder > E 100 voor zo'n bordje. Voor gebruik binnen het vak 'declareer' ik een deel van m'n tijd als onderwijstijd, dat maakt de bordjes goedkoper dan als ik ze commercieel zou maken.