Resultat display
Har börjat lite med koden, men fastnade på CARRY biten.
Hur kollar men att den är 1 eller 0?
Nedan är ett ex. där siffra 7 skall skickas till displayen.
Den skall sen köras 8 gånger för att hela byten skall bli skickad.
Men som sagt det tog stopp, har kollat i databladet för 16f886.
Hur kollar men att den är 1 eller 0?
Nedan är ett ex. där siffra 7 skall skickas till displayen.
Den skall sen köras 8 gånger för att hela byten skall bli skickad.
Men som sagt det tog stopp, har kollat i databladet för 16f886.
Kod: Markera allt
#define DATAIN PORTA, 0
#define CLKIN PORTA, 1
#define DIMMIN PORTA, 2
display
MOVLW b'11100000' ;siffra 7
MOVWF send
RRF send,f ;läs från vänster till höger
BTFxx ;kolla C-bit
BSF CLKIN
BCF CLKIN
Något i stil med :
Ovanstående kan kopieras för resten av bitarna eller så lägger man
till en "varvräknare" och kör om samma kod totalt 8 gånger.
Kod: Markera allt
MOVLW b'11100000' ;siffra 7
CALL send_to_display
MOVLW b'01010101' ;siffra <någonting annat>
CALL send_to_display
;
;
; **************************************************
; Rutin för att sända ett tecken till 7-seg LED display
; Bit-mönstret ska finnas i registret "W" före anrop
;
send_to_display
;
MOVWF send ; Spara värdet från W till send.
;
; första biten
;
RRF send,f ; läs från vänster till höger, en bit -> C flaggan
BSF DATAIN ; sätt DATAIN = "1"
BTFSS STATUS, C ; kolla C-bit, skip om C = "1"
BCF DATAIN ; C var alltså "0", cleara DATAIN
NOP ; Låt DATAIN stabilisera sig...
BSF CLKIN ; Pulsa LCKIN
NOP ; - " -
BCF CLKIN ; - " -
;
; andra biten
;
RRF send,f ; läs från vänster till höger, en bit -> C flaggan
BSF DATAIN ; sätt DATAIN = "1"
BTFSS STATUS, C ; kolla C-bit, skip om C = "1"
BCF DATAIN ; C var alltså "0", cleara DATAIN
NOP ; Låt DATAIN stabilisera sig...
BSF CLKIN ; Pulsa LCKIN
NOP ; - " -
BCF CLKIN ; - " -
;
; o.s.v
; o.s.v.
RETURN
till en "varvräknare" och kör om samma kod totalt 8 gånger.
Senast redigerad av sodjan 9 oktober 2008, 12:07:58, redigerad totalt 1 gång.
Nu kommer en till fråga angående RRF eller RLF.
Skall "MOVLW b'11100000'" vara med i den upprepade koden (7 gånger), eller räcker det med binärtalet ligger kvar i "SEND"?
Anledningen till at jag undrar är följande text i databladet.
The contents of register f are rotated one bit to the left through the Carry flag.
If d is 0, the result is placed in the W register.
If d is 1, the result is stored back in register f.
Example: RLF REG1,0
Before Instruction
REG1 = 1110 0110
C = 0
After Instruction
REG1 = 1110 0110
W = 1100 1100
C = 1
Skall "MOVLW b'11100000'" vara med i den upprepade koden (7 gånger), eller räcker det med binärtalet ligger kvar i "SEND"?
Anledningen till at jag undrar är följande text i databladet.
The contents of register f are rotated one bit to the left through the Carry flag.
If d is 0, the result is placed in the W register.
If d is 1, the result is stored back in register f.
Example: RLF REG1,0
Before Instruction
REG1 = 1110 0110
C = 0
After Instruction
REG1 = 1110 0110
W = 1100 1100
C = 1
Jag har justerat koden lite i förra inlägget.
Jag skulle nog skriva om den med en "varvräknare"
istället för att skriva samma kod 8 gånger. Det får
bi hemläxa...
> Example: RLF REG1,0
Använd aldrig 0 eller 1 som "destination", det finns symboler
"W" och "F" definierade med rätt värden så att men inte
behöver fundera på vilket som är vad. Dessutom blir koden
mer lättläst. (Jo, jag vet att det var från databladet...
)
En annan sak är att du sannolikt inte kommer att ha någon MOVLW alls
i den färdiga rutinen, jag antar att värdet som ska skickas till
displayen kommer någon annanstans ifrån. D.v.s att REG1 laddas
i en annan rutin som sedan gör en CALL till subrutinen som skickar
ut det på DATA/CLK pinnarna. Se min justerade kod.
Bygg det modulärt, börja "nerifrån" och bygg uppåt.
Jag skulle nog skriva om den med en "varvräknare"
istället för att skriva samma kod 8 gånger. Det får
bi hemläxa...
> Example: RLF REG1,0
Använd aldrig 0 eller 1 som "destination", det finns symboler
"W" och "F" definierade med rätt värden så att men inte
behöver fundera på vilket som är vad. Dessutom blir koden
mer lättläst. (Jo, jag vet att det var från databladet...

En annan sak är att du sannolikt inte kommer att ha någon MOVLW alls
i den färdiga rutinen, jag antar att värdet som ska skickas till
displayen kommer någon annanstans ifrån. D.v.s att REG1 laddas
i en annan rutin som sedan gör en CALL till subrutinen som skickar
ut det på DATA/CLK pinnarna. Se min justerade kod.
Bygg det modulärt, börja "nerifrån" och bygg uppåt.
Såg din ändrade kod och det var som jag misstänkte.
Ja en räknare blir det, istället för kopierad kod efter varan.
Som du skrev att börja nerifrån och upp låter bra, så man ser att det fungerar att skicka data till displayen. Innan man börjar med att dela upp inkommet data för sedan skicka det till rätt siffra.
Har nu kopplat upp allt och skall börja testa kod och displayerna.
Ja en räknare blir det, istället för kopierad kod efter varan.
Som du skrev att börja nerifrån och upp låter bra, så man ser att det fungerar att skicka data till displayen. Innan man börjar med att dela upp inkommet data för sedan skicka det till rätt siffra.
Har nu kopplat upp allt och skall börja testa kod och displayerna.
Har nu testat koden, men displayerna beter sig lite konstigt.
För det första om man sänder en siffra (totalt 8 bit), så visas siffran i display nr 2.
Display nr.1 visar ett konstigt tecken ex. ett lite c
Om man sänder två siffror till displayen, så vissas sista skickade siffran i display nr. 2 o.s.v. om man skickar en tredje.
Det andra konstiga är att displayerna flimrar till 1 gång per sek. totalt 6 gånger, sen tänds allt i displayerna.
Det jag gjorde för att få displayerna att vissa något var att skicka 1 och 0 till DIMMIN efter att alla bitarna var skickade.
För det första om man sänder en siffra (totalt 8 bit), så visas siffran i display nr 2.
Display nr.1 visar ett konstigt tecken ex. ett lite c
Om man sänder två siffror till displayen, så vissas sista skickade siffran i display nr. 2 o.s.v. om man skickar en tredje.
Det andra konstiga är att displayerna flimrar till 1 gång per sek. totalt 6 gånger, sen tänds allt i displayerna.
Det jag gjorde för att få displayerna att vissa något var att skicka 1 och 0 till DIMMIN efter att alla bitarna var skickade.
Kod: Markera allt
BSF DIMMIN ; - " -
NOP ; - " -
BCF DIMMIN ; - " -
Stämmer det är den som bara har en siffra per model, men jag tittade på den som har två sifror per modul och den är kopplad på samma sätt som två stycken seriekopplade enkla.
Jag kan köra med en modul, men det vissas bara det det konstiga tecknet.
Stämmer att det är 0 som tänder modulen, skall pröva ta bort 1:an.
EDIT: Det är samma resultat utan 1:an
Jag kan köra med en modul, men det vissas bara det det konstiga tecknet.
Stämmer att det är 0 som tänder modulen, skall pröva ta bort 1:an.
EDIT: Det är samma resultat utan 1:an
Så nu har jag testat vidare lite och fick bort flimret, då den loopade.
Men det skall den ju göra sen, för att kunna byta ut siffror.
Det fram går inte i databladet för displayen hur den känner av antalet displayer, t.ex. när den skall börja om.
Har tittat i databladet för 74hc595 under "Timing diagram" men hittar inget speciellt där.
Men det skall den ju göra sen, för att kunna byta ut siffror.
Det fram går inte i databladet för displayen hur den känner av antalet displayer, t.ex. när den skall börja om.
Har tittat i databladet för 74hc595 under "Timing diagram" men hittar inget speciellt där.
Det finns ingen avkänning av hur många moduler som finns, det ska man veta som användare/programmör.
För att undvika flimmer ska man göra såhär: stäng av visningen, skicka ut alla data "fort som fan" (med 100kHz klocka) och slå på displayen igen. Är det med 100kBPS kommer en klocka om 6 siffror att ta runt 960µs för att klocka datan över och det "blink" finns det ingen chans att man ser, en släckning på 1ms finns det inte en chans i världen att se med ögat.
För att undvika flimmer ska man göra såhär: stäng av visningen, skicka ut alla data "fort som fan" (med 100kHz klocka) och slå på displayen igen. Är det med 100kBPS kommer en klocka om 6 siffror att ta runt 960µs för att klocka datan över och det "blink" finns det ingen chans att man ser, en släckning på 1ms finns det inte en chans i världen att se med ögat.
Det finns ingen avkänning av hur många moduler som finns, det ska man veta som användare/programmör.
Hur gör man då för att börja om när som i detta fall den 6:e är uppdaterad.
Vad jag förstår det så är 595:orna kaskad kopplade och den sista skickar ju vidare ut i luften. Eller kan man på något sätt reset:a och börja om?
Hur gör man då för att börja om när som i detta fall den 6:e är uppdaterad.
Vad jag förstår det så är 595:orna kaskad kopplade och den sista skickar ju vidare ut i luften. Eller kan man på något sätt reset:a och börja om?
> Det fram går inte i databladet för displayen hur den känner av antalet displayer,
Som Icecap sa, det får *du* hålla redan på.
Modulerna i sig skiter fullständigt i var indatat kommer från och
om det sitter något på utgången !
> Men det skall den ju göra sen, för att kunna byta ut siffror.
Alltså, varje "siffra" som du skriver ut till displayen ligger ju kvar där
tills du behöver skriva en annan siffra. Varför flimrar det ?? Skriver
du hela tiden till den ? Det står i databladet att den är "fully static".
Och E ingången behöver bara vara "1" medans datat överförs, sedan
kan den vara "0" hela tiden. Möjligtsvis med reservation för ifall man
inte vill ha full ljusstyrka, då kan man PWM'a E pinnen istället. Men
det är inget du behöver eller måste börja med...
> Hur gör man då för att börja om när som i detta fall den 6:e är uppdaterad.
Varje "bit" du skickar ut kommer att flytta alla andra 6x8 = 24 bitar
i alla moduler ett steg för att till sist "trilla av" från den siata
modulen. Du börjar aldrig om.
D.v.s att du *alltid* måste skicka ut 24 bitar innan du lägger "E"
låg igen, det är först då som alla moduler innehåller rätt data.
Som Icecap sa, det får *du* hålla redan på.

Modulerna i sig skiter fullständigt i var indatat kommer från och
om det sitter något på utgången !
> Men det skall den ju göra sen, för att kunna byta ut siffror.
Alltså, varje "siffra" som du skriver ut till displayen ligger ju kvar där
tills du behöver skriva en annan siffra. Varför flimrar det ?? Skriver
du hela tiden till den ? Det står i databladet att den är "fully static".
Och E ingången behöver bara vara "1" medans datat överförs, sedan
kan den vara "0" hela tiden. Möjligtsvis med reservation för ifall man
inte vill ha full ljusstyrka, då kan man PWM'a E pinnen istället. Men
det är inget du behöver eller måste börja med...
> Hur gör man då för att börja om när som i detta fall den 6:e är uppdaterad.
Varje "bit" du skickar ut kommer att flytta alla andra 6x8 = 24 bitar
i alla moduler ett steg för att till sist "trilla av" från den siata
modulen. Du börjar aldrig om.
D.v.s att du *alltid* måste skicka ut 24 bitar innan du lägger "E"
låg igen, det är först då som alla moduler innehåller rätt data.