Hoe kan ik best een 3 digit getal (dus min. 0 en max 999), goed zichtbaar vanop een paar meter(ook bij daglicht) door een PIC16f628 aangestuurd, laten weergeven?
Een lcd schermpje is makkelijk aan te sturen via het 'print' commando, en daar hoeft ook geen driver IC tussen of stuurtransistoren. Maar die zijn nogal klein om op een afstand waar te nemen, vrees ik.
Een 7 seg. display(3 stuks, in dit geval) zijn best in grote afmetingen te krijgen(Ik vond een thread van 'Turbokeu'.WOOW, dat zijn pas joekels!), maar zo groot hoeft ook weer niet.
Alleen weet ik niet goed hoe ik zo'n 7 seg. displ. moet aansturen om er 3 cijfers op te krijgen(van 000 tot max. 999)
Het programma schrijven zal me wel lukken, aan de hand van welke input er hoog wordt, laat ik de PIC een totaal maken door gewoon een 'variabele' een waarde te geven.
Alleen moet die waarde ook zichtbaar op lcd/7segdispl komen.
Hoe doe ik dat zonder te veel poespas?
Vriendelijk dank weer, voor het meedenken,
Xtel
mcs51mc
Never forget the KISS principle: Keep It Stupid Simple!!
LCD mag je inderdaad vergeten wegens vereiste "leesbaar vanop afstand". Je kan natuurlijk PLed of OLed LCD's zoeken maar ik dacht dat ook dit kleine cijferkes gaan zijn.
Blijft dus de 7seg displays over.
Way 1 "The easy way"
4 PIC uitgangen naar een 7447 om BCD getal naar alle 7segment display's te sturen.
3 PIC uitgangen om de 7segment displays om beurt te selecteren.
Sequentie:
Data eenheden op PIC uitgangen
Strobe eenheden: eenheden dislay gaat branden
Data tientallen op PIC uitgangen
Strobe tientallen: tientallen dislay gaat branden
Data honderdtallen op PIC uitgangen
Strobe honderdtallen : honderdtallen dislay gaat branden
Again tot in het oneindige
Way 2 "The hard way"
Idem hierboven maar dan zonder 7447 zodanig dat je zelf de 7segmenten gaat aansturen.
Je hebt dan natuurlijk 7PIC uitgangen nodig voor de displays.
De 3 strobe uitgangen blijven.
Way 3 "The ... way"
Koop een Velleman kit of een Conrad kit
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
ik zou toch voor het LCD gaan, en de karakters dubbel zo groot maken door twee lijnen te gebruiken, gemakkelijk leesbaar op 10 meter
goed, vond ik eigenlijk geen antwoord op z,n vraag
hieronder mijn oplossing in basic:
: data lijnen b0-b6 is segmenten a tot g *
: selector lijnen 1,2, en 3 op a0 tot a2 *
deze data is voor 3 gemultiplexte dislays
'**********************************************************
Device 16F628A
Declare XTAL 10
DelayMS 200
Dim a As Word 'de teller
Dim getal1 As Byte 'de drie apparte digits
Dim getal2 As Byte ',,
Dim getal3 As Byte ' ,,
Dim eens As Byte 'de te tonen getallen
Dim tiens As Byte ' ,,
Dim honderds As Byte' ,,
Dim display1 As Byte' de aan te sturen displays
Dim display2 As Byte ' ,,
Dim display3 As Byte ' ,,
Dim x As Word
a = 648 ' het te tonen getal
loop:
a = a + 1 ' getal één ophogen
If a = 900 Then a = 0 'als het de waarde 900 heeft , begin dan weer bij nul
GoSub bin2seg ' zet alles om naar 7segment
TRISB=0 ' set poort b op uitvoer
TRISA=0 ' set poort a op uitvoer
display1 = %11111110 'zet display 1 aan
display2 = %11111101 'zet display 2 aan
display3 = %11111011 'zet display 3 aan
For x = 1 To 10 'de te tonen tijd
PORTB = eens ' zet data naar display's
PORTA = display1 ' zet eerste display aan
DelayMS 5
PORTB = tiens ' zet data naar display
PORTA = display2 'zet tweede display aan
DelayMS 5
PORTB = honderds ' zet data naar display
PORTA = display3 ' zet derde display aan
DelayMS 5
Next x 'laat deze informatie gedurende x tijd zien
GoTo loop
'Convert binary nummer naar 7 segment code
bin2seg:
getal3 = Dig a,0 'honderd tallen
getal2 = Dig a,1 'tientallen
getal1 = Dig a,2 'eenheden
eens = LookUp getal1,[$3f,$6,$5b,$4f,$66,$6d,$7d,$7,$7f,$6f] 'vertaal naar 7segm
tiens =LookUp getal2,[$3f,$6,$5b,$4f,$66,$6d,$7d,$7,$7f,$6f]
honderds =LookUp getal3,[$3f,$6,$5b,$4f,$66,$6d,$7d,$7,$7f,$6f]
Return
Iedere bijdrager tot zover al fel bedankt!
Met de gegeven tips kan ik al wat uitzoeken, ik meld me weer als er schot in de zaak komt....
Xtel
Ok, de test met een 2 lijns LCD valt me vies tegen, de cijfers 2 maal zo groot maken is 1 zaak, een andere is dat de PIC die ik gebruik maar 8 (zelfgemaakte)karakters tegelijk kan displayen, en aangezien ik 4 karakters gebruik voor 1 digit, gaat dit niet mooi lukken, tenzij je de digits 'om en om' gaat aansturen, maar dan heb je dat geflikker weer....dus nee
Het zullen 3x 7 seg displays worden.
Deze kit van Velleman lijkt me geschikt:
http://www.velleman.be/fr/nl/product/view/?id=353344
Zo 3 digits achter elkaar EN in een leuke snap-in behuizing.
Kan ik dat ding rechtstreeks via mijn pic16f628a aansturen of kan ik beter 3 losse 7 seg displays van die afmeting en multiplexen?
Bedankt!
Xtel
EdwinNadorp
Koop hier uw kristallen bol - in 2008 ga ik m'n projecten afmaken, echt waar ....... nouja in 2009 dan ..... ehh 2010 ....
Deze kan je makkelijk aansluiten op je USART wel te verstaan (met max232 denk ik).
Ik weet niet wat dat kit-je kost, maar zelfbouwen lijkt mij goedkoper.
Aansturen via een shift register lijkt mij het makkelijkste.
voorbeeld:
http://www.aftervillage.nl/wiki/index.php/shift7seg
(afhankelijk van je 7seg moet je even kijken of de 74164 wel voldoende kan sinken, anders een transistor er tussen plaatsen.)
dat om en om (multiplexen) gaat overigens prima hoor.
geen last van flikkeren volgens mij,
ik gebruik een pic 877 die negen 7 segment display's
aanstuurt met multiplexen, geen transistoren nodig,
zo uit de pic, en werkt prima.
dus 3 X 7 segment displays uit een pic 628
moet prima gaan.
[Bericht gewijzigd door burner op ]
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
Op 29 juni 2007 23:49:23 schreef Xtel:
Ok, de test met een 2 lijns LCD valt me vies tegen, de cijfers 2 maal zo groot maken is 1 zaak, een andere is dat de PIC die ik gebruik maar 8 (zelfgemaakte)karakters tegelijk kan displayen, en aangezien ik 4 karakters gebruik voor 1 digit ....
Je kan met 7 verschillende karakters alle nummers maken, ik gebruik dit ook, en dit is redelijk simpel te maken.
stuur maar een mail als je hierover meer informatie zou willen hebben, dan zoek ik het nog even op.
Op 23 juni 2007 18:34:05 schreef burner:
goed, vond ik eigenlijk geen antwoord op z,n vraag
hieronder mijn oplossing in basic:: data lijnen b0-b6 is segmenten a tot g *
: selector lijnen 1,2, en 3 op a0 tot a2 *
deze data is voor 3 gemultiplexte dislays
'**********************************************************Device 16F628A
Declare XTAL 10
DelayMS 200Dim a As Word 'de teller
Dim getal1 As Byte 'de drie apparte digits
Dim getal2 As Byte ',,
Dim getal3 As Byte ' ,,Dim eens As Byte 'de te tonen getallen
Dim tiens As Byte ' ,,
Dim honderds As Byte' ,,Dim display1 As Byte' de aan te sturen displays
Dim display2 As Byte ' ,,
Dim display3 As Byte ' ,,
Dim x As Word
a = 648 ' het te tonen getalloop:
a = a + 1 ' getal één ophogen
If a = 900 Then a = 0 'als het de waarde 900 heeft , begin dan weer bij nul
GoSub bin2seg ' zet alles om naar 7segmentTRISB=0 ' set poort b op uitvoer
TRISA=0 ' set poort a op uitvoerdisplay1 = %11111110 'zet display 1 aan
display2 = %11111101 'zet display 2 aan
display3 = %11111011 'zet display 3 aanFor x = 1 To 10 'de te tonen tijd
PORTB = eens ' zet data naar display's
PORTA = display1 ' zet eerste display aan
DelayMS 5
PORTB = tiens ' zet data naar display
PORTA = display2 'zet tweede display aan
DelayMS 5
PORTB = honderds ' zet data naar display
PORTA = display3 ' zet derde display aan
DelayMS 5
Next x 'laat deze informatie gedurende x tijd zien
GoTo loop'Convert binary nummer naar 7 segment code
bin2seg:
getal3 = Dig a,0 'honderd tallen
getal2 = Dig a,1 'tientallen
getal1 = Dig a,2 'eenheden
eens = LookUp getal1,[$3f,$6,$5b,$4f,$66,$6d,$7d,$7,$7f,$6f] 'vertaal naar 7segm
tiens =LookUp getal2,[$3f,$6,$5b,$4f,$66,$6d,$7d,$7,$7f,$6f]
honderds =LookUp getal3,[$3f,$6,$5b,$4f,$66,$6d,$7d,$7,$7f,$6f]
Return
Deze code werkt niet zoals het hoort, de getallen flitsen onwillekeurig alle kanten op.
Heb voorlopig van die kleine 7 seg displaytjes(Common Anode) op breadboard om een programma werkend te krijgen.
Ik gebruik geen extern kristal, alleen de ingebouwde 4MHz, ligt het daaraan misschien?
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
Declare XTAL 10
met intern kristal ?
TRISB=0 ' set poort b op uitvoer
TRISA=0 ' set poort a op uitvoer
display1 = %11111110 'zet display 1 aan
display2 = %11111101 'zet display 2 aan
display3 = %11111011 'zet display 3 aan
deze regels moeten niet (maar mogen wel) in je loop staan, ze vertragen je programma, zet ze boven je loop
...
PORTA = display3 ' zet derde display aan
DelayMS 5
PORTA = %11111111
PORTB = %11111111
Next x 'laat deze informatie gedurende x tijd zien
GoTo loop
...
zou ik er van maken, dan lichten ze allemaal evenveel op, anders is je laatste display meer verlicht. (langer duty-cycle)
en waarom een for-next loop, toch nergens voor nodig ?
en waarom flitsen de getallen over het scherm ?
logisch, je getal wordt elke cyclus opgehoogd, veel te snel.
probeer eens een vast getal te laten zien, of 1 dat om de seconde ophoogt (bijvoorbeeld in een interrupt)
ik denk dat dit moet lukken (ben niet 100 % zeker)
en code tags gebruiken in de plaats van quote tags
marcob
Honourable Member
People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Ik zou een interrupt gebruiken om je display te updaten, kijk eens bij de voorbeeld bestanden in proton, daar staat wel een voorbeeld geloof ik.
Anders kijk ik vanavond thuis even hoe of wat.
Op 9 juli 2007 10:32:11 schreef marcob:
Ik zou een interrupt gebruiken om je display te updaten, kijk eens bij de voorbeeld bestanden in proton, daar staat wel een voorbeeld geloof ik.
Anders kijk ik vanavond thuis even hoe of wat.
Hier staat een mooi voorbeeldje:
http://www.melabs.com/resources/samples/pbp/7segment.pbp
' PICBASIC PRO program to demonstrate 7-segment LED display. Schematic
' can be found at http://melabs.com/resources/articles/ledart.htm (fig 6).
Segments Var PORTB
Digits Var PORTA
i Var Byte
n Var Byte
Value Var Word
TRISB = $80 ' Set segment pins to output
TRISA = $f0 ' Set digit pins to output
mainloop:
For Value = 0 To 9999
GoSub display ' Display the value
Next Value
GoTo mainloop ' Do it forever
' Subroutine to send the number (0 - 9999) in Value to LEDs
display:
For i = 0 To 3 ' Loop through 4 digits
n = Value Dig i ' Get digit to display
GoSub display1 ' Display the digit
Pause 1 ' Leave it on 1 millisecond
Next i ' Do next digit
Return
' Surboutine to display one digit on LED
' i = digit number
' n = number to display
display1:
Digits = $ff ' All digits off to prevent ghosting
' Convert binary number in n to segments for LED
Lookup n, [$40, $79, $24, $30, $19, $12, $02, $78, $00, $18], Segments
' Set digit pin i to 0 (on) and the rest of the pins to 1 (off)
Digits = ~Dcd i
Return
Maar dat is geschreven in een oubollig basic taaltje,voor een PIC16F84. Of mijn compiler dit gaat pikken?
Ik gebruik een PIC16F628A en picbasic. Ik moet maar 3 digits aansturen, dit voorbeeld stuurt er 4 aan.
Ik heb bovenstaande voorbeeld nu zo aangepast dat er op mijn 3 digits geteld zou moeten worden geteld van 0-999 (dus 3 digits ipv 4), en heb een halve seconde delay tussen elk nieuw getal gezet.
Ik zie de digits wel flikkeren elke halve seconde, maar de aanduiding klopt niet, soms staat er 11, dan na een tiental keer flikkeren staat er 22, dan weer na wat flikkeren staat er 33, dan weer 666....
Hier het programma met aanpassing voor 3 digits:
Device 16F628A ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_ON
ALL_DIGITAL TRUE ;Alle ingangen digitaal
Segments Var PORTB
Digits Var PORTA
i Var Byte
n Var Byte
Value Var Word
TRISB = $80 ' Set segment pins to output
TRISA = $f0 ' Set digit pins to output
mainloop:
For Value = 0 To 999
GoSub display ' Display the value
DelayMS 500
Next Value
GoTo mainloop ' Do it forever
' Subroutine to send the number (0 - 999) in Value to LEDs
display:
For i = 0 To 2 ' Loop through 4 digits
n = Value Dig i ' Get digit to display
GoSub display1 ' Display the digit
Pause 1 ' Leave it on 1 millisecond
Next i ' Do next digit
Return
' Surboutine to display one digit on LED
' i = digit number
' n = number to display
display1:
Digits = $ff ' All digits off to prevent ghosting
' Convert binary number in n to segments for LED
LookUp n, [$40, $79, $24, $30, $19, $12, $02, $78, $00, $18], Segments
' Set digit pin i to 0 (on) and the rest of the pins to 1 (off)
Digits = ~DCD i
Return
hhmm, bij nader inzien blijkt het best lastig ook nog eens 5 of 6 inputs te voorzien . PortA en PortB zijn al zowat bezet door de 3 X 7 seg disps.
Ik ga maar voor de Velleman kit, denk ik, is wat duurder, maar dan is het gelijk af.
http://www.velleman.be/fr/nl/product/view/?id=353344
Alleen voor het aansturen(RS232) via USART zou ik graag wat hulp hebben.
Op 8 juli 2007 23:19:28 schreef elektro_freak:
met intern kristal ?
Die bestaan niet...
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
Op 10 juli 2007 18:46:59 schreef Henry S.:
[...]
Die bestaan niet...
intern RC-kring dan (of wat het ook moge zijn)
met intern kristal weet iedereen waar je het over hebt...
(RC-kring was is da ?)