Resultat display
Postakoden som sänder ut data till displayerna.
Antingen är schemat Du postat tidigare fel, eller så går det att styra punkterna.
Felet jag misstänkeer Du gör är att först skicka data och sedan den extra klockpulsen för att få ut data till displayerna. Detta upprepar Du antagligen sedan en gång per siffra. Den metoden är *FEL* och leder till just att punkterna inte kan adresseras.
Du skall istället skicka ut data till siffrorna *utan* den extra klockpulsen. Först när Du har gjort detta fyra gånger skall Du skicka *EN* extra klockpuls.
Antingen är schemat Du postat tidigare fel, eller så går det att styra punkterna.
Felet jag misstänkeer Du gör är att först skicka data och sedan den extra klockpulsen för att få ut data till displayerna. Detta upprepar Du antagligen sedan en gång per siffra. Den metoden är *FEL* och leder till just att punkterna inte kan adresseras.
Du skall istället skicka ut data till siffrorna *utan* den extra klockpulsen. Först när Du har gjort detta fyra gånger skall Du skicka *EN* extra klockpuls.
Kod: Markera allt
;
; Siffrorna räknas från höger
MOVLW b'11110010' ;Siffra 3
CALL send_to_display
MOVLW b'11100000' ;Siffra 7
CALL send_to_display
MOVLW b'11100000' ;Siffra 7
CALL send_to_display
MOVLW b'11111100' ;Siffra 0
CALL send_to_display
MOVLW b'01100000' ;Siffra 1
CALL send_to_display
MOVLW b'00000000' ;Siffra "släckt"
CALL send_to_display
BSF CLKIN ; Pulsa LCKIN
BCF CLKIN ; Pulsa LCKIN
;
**************************************************
; 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
NOP
MOVWF send ; Spara värdet från W till send.
;
; bit 0
RRF send,f ; läs från vänster till höger, en bit -> C flaggan
BTFSS STATUS, C ; kolla C-bit, skip om C = "1"
NOP
NOP
; bit 1
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 CLKIN
NOP
BCF CLKIN ; - " -
NOP
; bit 2
o.s.v.
; bit 3
o.s.v.
; bit 4
o.s.v.
; bit 5
o.s.v.
; bit 6
o.s.v.
; bit 7
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 CLKIN
NOP
BCF CLKIN ; - " -
NOP
RETURN
Som kan ses i koden är det nu 6 st. displayer.
Det som vissas är: _10773
Senast redigerad av Stewal 11 oktober 2008, 21:09:07, redigerad totalt 1 gång.
OK, rent spontant ser det ju OK ut.
En liten sak bara...
De där extra BTFSS + 2 st NOPs i bbörjan av subrutinen är onödiga,
du kan lika gärna köra två RRF direkt efter varandra.
Om jag ser rätt så blir det alltså *7* st CLK pulser per display !?
I så fall så är det ju så att den åttonde biten ("punkterna") inte
kan användas vid seriekoppling av displayerna...
Och du får alltså ut just det som du vill, eller hur ?
En liten sak bara...
De där extra BTFSS + 2 st NOPs i bbörjan av subrutinen är onödiga,
du kan lika gärna köra två RRF direkt efter varandra.
Om jag ser rätt så blir det alltså *7* st CLK pulser per display !?
I så fall så är det ju så att den åttonde biten ("punkterna") inte
kan användas vid seriekoppling av displayerna...
Och du får alltså ut just det som du vill, eller hur ?
Koden är trasig.
Du måste skriva om send_to_display.
1 spara byte som skall sändas i send
2 spara talet 8 räknare
3 skifta send
4 sätt databiten
5 skippa rad 6 om carry är satt
6 cleara databiten
7 cleara klockbiten
8 nop
9 sätt klockbiten
10 dekrementera räknare och skippa 11 om den blir noll
11 hoppa till 3
12 return
Ändra också så att Du clearar klockbiten, gör en nop och sedan sätter den efter att alla siffrorna är sända. Klockbiten skall alltså vara 1 i viloläget.
Du måste skriva om send_to_display.
1 spara byte som skall sändas i send
2 spara talet 8 räknare
3 skifta send
4 sätt databiten
5 skippa rad 6 om carry är satt
6 cleara databiten
7 cleara klockbiten
8 nop
9 sätt klockbiten
10 dekrementera räknare och skippa 11 om den blir noll
11 hoppa till 3
12 return
Ändra också så att Du clearar klockbiten, gör en nop och sedan sätter den efter att alla siffrorna är sända. Klockbiten skall alltså vara 1 i viloläget.
Visst är det egalt om den loopar eller har det in-line. Däremot måste det vara 8 bitar som skifta ut per siffra. Det förefaller som att det görs ett skift som inte syns någonstans. Databladet på displayerna visar klart och tydligt att det är 8 bitar som sikall ut till varje.
Sedan förefaller det även som att den hopkopplade klockingångarna är obuffrade. Beroende på hur lika ingångsbuffrarna är det osäkert vad som visas. Antar att klockan är åtminstone aningen trög och det skapar osäkerhet. Kommer latchklockan något tiotal nanosekunder efter shiftklockan så visas senast inskiftade data, annars föregående. Däremellan avgör slumpen hur det blir...
Sedan förefaller det även som att den hopkopplade klockingångarna är obuffrade. Beroende på hur lika ingångsbuffrarna är det osäkert vad som visas. Antar att klockan är åtminstone aningen trög och det skapar osäkerhet. Kommer latchklockan något tiotal nanosekunder efter shiftklockan så visas senast inskiftade data, annars föregående. Däremellan avgör slumpen hur det blir...
Där är mera tveksamheter i konstruktionen än vad som redan har nämnts. Klockan som går vidare buffras med två "seriekopplade" 7400 och där uppstår fördröjning.
Därför ligger klockan till nästa siffra två grindtider efter data och så gör man bara inte när skiftregister skall kopplas samman. Det kan förklara vad som händer, om jag nu tänker rätt...
Det enda vettiga är nog att ansluta data från varje display till sin egen pinne på PIC för att kunna säkerställa marginalerna.
En fulfix skulle kunna vara att lägga en RC-länk i datalinan mellan varje display i kedjan. Bara en konding kan också räcka och är snabbt testat. Det lastar utgången och skapar därigenom även mera skit på matningsspänningen, men varför inte... Prova 100p, om det inte ger resultat så gå upp en dekad till 1n.
Skall det skiftas på det sättet så behövs det ett extra steg så data på vidarekopplingen skiftarpå motsatt flank som skiftregistret. Det finns/fanns en sådan krets i 4000-serien (minns inte numret nu) med två utgångar. Den fördröjda skulle användas när det var trög klocksignal och risk för problem.
edit: Jag är ganska säker på att det är här problemet finns. Han säger att punkterna och nästa displays första segment blir desamma. Just detta blir följden av att klockan kommer efter data. Det blir som om sista steget i skiftregitret hoppas över. Det förklarar även att 7 pulser fungerar trots att det är ett 8-bit skiftregister.
Därför ligger klockan till nästa siffra två grindtider efter data och så gör man bara inte när skiftregister skall kopplas samman. Det kan förklara vad som händer, om jag nu tänker rätt...
Det enda vettiga är nog att ansluta data från varje display till sin egen pinne på PIC för att kunna säkerställa marginalerna.
En fulfix skulle kunna vara att lägga en RC-länk i datalinan mellan varje display i kedjan. Bara en konding kan också räcka och är snabbt testat. Det lastar utgången och skapar därigenom även mera skit på matningsspänningen, men varför inte... Prova 100p, om det inte ger resultat så gå upp en dekad till 1n.
Skall det skiftas på det sättet så behövs det ett extra steg så data på vidarekopplingen skiftarpå motsatt flank som skiftregistret. Det finns/fanns en sådan krets i 4000-serien (minns inte numret nu) med två utgångar. Den fördröjda skulle användas när det var trög klocksignal och risk för problem.
edit: Jag är ganska säker på att det är här problemet finns. Han säger att punkterna och nästa displays första segment blir desamma. Just detta blir följden av att klockan kommer efter data. Det blir som om sista steget i skiftregitret hoppas över. Det förklarar även att 7 pulser fungerar trots att det är ett 8-bit skiftregister.
Det med följer ett demokort med varje display, som om man trycker på en knapp stegar en siffra i taget. Den måste vara inställd på 8-bit, för det blir samma fel där att det försjuts en bit för varje display. Efter att alla siffror visats så går den igenom ett segment i taget och där sker något konstigt, på display 1 (binärt räknat 5,4,3,2,1,0) för där tänds segment E1 och F1 (se vilka det är i pdf). Den vissar två segment istället för bara ett.Marta skrev:Visst är det egalt om den loopar eller har det in-line. Däremot måste det vara 8 bitar som skifta ut per siffra. Det förefaller som att det görs ett skift som inte syns någonstans. Databladet på displayerna visar klart och tydligt att det är 8 bitar som sikall ut till varje.
Sedan förefaller det även som att den hopkopplade klockingångarna är obuffrade. Beroende på hur lika ingångsbuffrarna är det osäkert vad som visas. Antar att klockan är åtminstone aningen trög och det skapar osäkerhet. Kommer latchklockan något tiotal nanosekunder efter shiftklockan så visas senast inskiftade data, annars föregående. Däremellan avgör slumpen hur det blir...
http://www.sureelectronics.net/pdfs/DE- ... 1.0_EN.pdf
Mer om demoboard se sid. 15 i pdf'n.
Schemat på demoboard säger ingenting, det är en PIC 10F200 där sitter och det är programmet till denna som skulle kunna ha sagt något. Kanske den inte är code protected och går att läsa av, men det är inte det första Du bör göra nu.
Har Du provat att ansluta en liten konding mellan data in och jord på siffrorna?
Om inte, pröva att göra detta innan Du gör något mera. Det räcker att först göra det på den andra displayen i kedjan och se ifall något händer. Bara håll den där medan Du stegar siffrorna och se om där blir någon förändring.
Har Du provat att ansluta en liten konding mellan data in och jord på siffrorna?
Om inte, pröva att göra detta innan Du gör något mera. Det räcker att först göra det på den andra displayen i kedjan och se ifall något händer. Bara håll den där medan Du stegar siffrorna och se om där blir någon förändring.