Resultat display

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Har nu gått igenom databladet för displayen och det jag hittade om shifta data är på sidan 12.
Jag får inte riktigt kläm på det du skriver och det som står i databladet.

Fråga 1
Vad står PVM signal för.

fråga 2
Hur shiftar man åt rätt håll?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

PWM, Puls Width modulation, Pulsbreddsmodulation. Google vet mer...

Shifta åt det håll (left/right) som gör att bitarna kommer in i rätt ordning.
"Rotate Left" och "Rotate Right" heter de aktuella PIC instruktionerna.
Kolla sedan på C-biten med BTFxx...
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

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.

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Något i stil med :

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
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.
Senast redigerad av sodjan 9 oktober 2008, 12:07:58, redigerad totalt 1 gång.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

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.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

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.

Kod: Markera allt

BSF      DIMMIN         ; - " -
NOP                    ; - " -
BCF      DIMMIN         ; - " -
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Nu ska vi se...

Du har alltså den modellen med en enda siffra per modul ?
Kan du köra med en modul ?
Hur är det kopplat igentligen ?

> vissa något var att skicka 1 och 0 till DIMMIN

Varför "1" ? En läg på DIMMIN ska tända modulen...
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

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
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

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.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Men... vad är problemet?
Du skickar ut data till t.ex. 6 moduler, de visas och sedan skickar du ut nya data som sedan visas. Varför måste enheten veta hur många moduler det finns?

Det räcker väl med att DU vet att det finns 6 st (eller vad det nu är) och att du skickar ut data till dom.
Skriv svar