7szegmens kezelés helyett LCD

Fejlesztés, melynek során emberi kialakítással mevalósításra kerül a LPT portra az LCD kijelző(k) vezérlése.
Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

Voltmérő

HozzászólásSzerző: szepnorbee » 2010. január 7. csütörtök, 8:35

dv mindenki! Van nekem egy ilyen kapcsolásom:
http://kepfeltoltes.hu/100107/digital-voltmeter-circuit_www.kepfeltoltes.hu_.jpg


Ez egy digitális voltmérp mega8-al.
Azt szeretném elérni, hogy egy LCD-re írathassam ki a feszültséget, a LED kijelző helyett. A kapcsolás részét még át is tudom alakítani, de kezdő révén a programkódot nemigazán látom át. Hogy lehetne elkülöníteni ebből a 7szegmens vezérlését szerintetek?

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 4000000

'$ baud = 2400

Config Timer0 = Timer, Prescale = 8

Dim Timecount As Word: Timecount = 0
Config Adc = Single, Prescaler = Auto, Reference = Internal


Enable Interrupts
Enable Ovf0
On Ovf0 Overflow_isr
Tcnt0 = &H19

Dim I As Byte
Config Pinc.5 = Input

Config Portd = Output
Portd = 0
Config Pinb.0 = Output
Portb.0 = 0
Config Pinb.1 = Output
Portb.1 = 0
Config Pinb.2 = Output
Portb.2 = 0
Config Pinb.3 = Output
Portb.3 = 0

Dim L (10) As Byte
L(1) = &B11111100
L(2) = &B10001001
L(3) = &B10011000
L(4) = &B10110100
L(5) = &B10010010
L(6) = &B10000010
L(7) = &B11111000
L(8) = &B10000000
L(9) = &B10010000
L(10) = &B11000000
Dim Le(10) As Byte
Le(1) = &B01111100
Le(2) = &B00001001
Le(3) = &B00011000
Le(4) = &B00110100
Le(5) = &B00010010
Le(6) = &B00000010
Le(7) = &B01111000
Le(8) = &B00000000
Le(9) = &B00010000
Le(10) = &B01000000
Dim Channel As Byte
Dim W As Long
Dim Ss As Byte
Dim Ad As Long
Dim S (4) As String * 1
Dim Sa As String * 5

Dim Sl (4) As Byte 'Show variables

Do

'------------------------------------ Battery voltage detection
W = 0
Ss = 1
Ad = 0
For Ss = 1 To 20
Start Adc
Channel = 5
W = Getadc (channel)
Stop Adc
Ad = Ad + W
Next Ss
Ad = Ad / 20
Ad = Ad * 2560
Ad = Ad / 1023
Ad = Ad * 10



If Ad <1000 Then
Sa = Str (ad)
Sa = Format (sa, "000")

S (1) = Mid (sa, 3, 1)
S (2) = Mid (sa, 2, 1)
S (3) = Mid (sa, 1, 1)
'S (4) = Mid (sa, 1, 1)
I = Val (s (1))
If I = 0 Then
Sl (1) = L (10)
Else
Sl (1) = L (i)
End If

I = Val (s (2))
If I = 0 Then
Sl (2) = L (10)
Else
Sl (2) = L (i)
End If

I = Val (s (3))
If I = 0 Then
Sl (3) = L (10)
Else
Sl (3) = L (i)
End If


Sl (4) = Le (10)

End If



If Ad> = 1000 And Ad <10000 Then
Sa = Str (ad)
Sa = Format (sa, "0000")

S (1) = Mid (sa, 4, 1)
S (2) = Mid (sa, 3, 1)
S (3) = Mid (sa, 2, 1)
S (4) = Mid (sa, 1, 1)
I = Val (s (1))
If I = 0 Then
Sl (1) = L (10)
Else
Sl (1) = L (i)
End If

I = Val (s (2))
If I = 0 Then
Sl (2) = L (10)
Else
Sl (2) = L (i)
End If

I = Val (s (3))
If I = 0 Then
Sl (3) = L (10)
Else
Sl (3) = L (i)
End If

I = Val (s (4))
If I = 0 Then
Sl (4) = Le (10)
Else
Sl (4) = Le (i)
End If

End If

If Ad> = 10000 And Ad <100000 Then
Sa = Str (ad)
Sa = Format (sa, "0000")

S (1) = Mid (sa, 4, 1)
S (2) = Mid (sa, 3, 1)
S (3) = Mid (sa, 2, 1)
S (4) = Mid (sa, 1, 1)
I = Val (s (1))
If I = 0 Then
Sl (1) = L (10)
Else
Sl (1) = L (i)
End If

I = Val (s (2))
If I = 0 Then
Sl (2) = L (10)
Else
Sl (2) = L (i)
End If

I = Val (s (3))
If I = 0 Then
Sl (3) = Le (10)
Else
Sl (3) = Le (i)
End If

I = Val (s (4))
If I = 0 Then
Sl (4) = L (10)
Else
Sl (4) = L (i)
End If
End If

Waitms 200
'------------------------------------
Loop

End




Overflow_isr:

Tcnt0 = &H19
Incr Timecount
If Timecount = 15 Then '1 m 502 = 1s 4m 2008 = 1s
Timecount = 0
Portb.0 = 1
Portd = Sl (1)
Waitms 5
Portb.0 = 0
Portb.1 = 1
Portd = Sl (2)
Waitms 5
Portb.0 = 0
Portb.1 = 0
Portb.2 = 1
Portd = Sl (3)
Waitms 5
Portb.0 = 0
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Portd = Sl (4)
Waitms 5
Portb.3 = 0

End If
Return
'------------------------------------------------- --------------------------------[quote][/quote]

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9757
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. január 7. csütörtök, 11:21

7szegmens működési elve:
Aditt időnként kiírom a számjegyeket :)
Az adott időnként-et a timer (timer ISR) határozza meg.
A kiírandó szám az Sl(1..4) tombben van benne, azaz ahol ez keletkezik, ott van az eredményed.

Az Ad érték adja a végeredményedet, az az utáni sorokban ennek formázása és karakterekrebontására van a megoldás....

Az AD érték kiírása történjen meg az LCDre.
A kiírandó szöveg formázására a Format illetve a Fusing függvények egyszerűvé teszik a munkát (lsd súgó)

Talán segítettem, hogy merre lehet elindulni :)

Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

LCD

HozzászólásSzerző: szepnorbee » 2010. január 7. csütörtök, 11:37

Uh köszi! Ezt megpróbálom értelmezni :) Valamivel tisztább a dolog

Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

Re: LCD

HozzászólásSzerző: szepnorbee » 2010. január 7. csütörtök, 18:32

szepnorbee írta:Uh köszi! Ezt megpróbálom értelmezni :) Valamivel tisztább a dolog


Hát sajna nekem ez héber. Hiába programoztam régen C64-et, azért ez nem ugyan az. Nem tudnál Robert vagy valaki egy olyan bascomban írt projectet linkelni ahol van egy szimpla kapcsolás példa kóddal együtt? Egyszerű feszültségmérő vagy hasonló amiből tudnék kicsit tanulni. Egy egyszerű autóba való fedélzeti computeren dolgozgatom ami kiír nekem egy smást, (gondoltam így sorba megtanulom a programozás mikéntjeit) pl. óra, akufesz, fogyi, kül / bel hőmérséklet, meg sorolhatnám. Ha ezeket a funkciókat le tudnám kezelni akkor azt mondanám h. legalább már van értelme foglalkoznom vele:D Nem vagyok reménytelen. Szóval ha valaki tud valami magyar forrást (esetleg szájbarágós) akkor nagyon megköszönném!

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3212
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2010. január 7. csütörtök, 19:47

A forrás itt van az orrod előtt, Csak olvasni kel!
Bascom leírás illetve könyv: http://avr.tavir.hu/modules.php?name=Co ... ies&cid=15
Amit szeretnél elégé összetett probléma, de itt szépen sorban megtalálsz mindent.
Egyszerűbb lesz újra írni a programot, mint átalakítani!
:wink:

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 998
Csatlakozott: 2009. február 28. szombat, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: SanyiSay » 2010. január 7. csütörtök, 20:27

Egyetértek.
Ha nem érdekel az AVR téma, akkor célszerű készen megvenni a cuccot, ha pedig kicsi indíttatásod van ennél jobb Bascom könyvet nem találsz, sem egyszerűbb nyelvet. (szerintem)
Pár perc alatt villog az első leded (mert ugye nem atomreaktorral kezdünk) onnan meg, minden simán megy.

Az egészet nehéz elmagyarázni, de megtanulni könnyű.
Könyvben minden példa szájbarágós, és egyből működik, ha netán mégsem mert kihagynál egy vesszőt :) na akkor simán kérdezhetsz itt bármit. Ám a komplett munkát nem fogja senki elvégezni helyetted. :) (mármint ingyért)

Ui. Azért célszerű olyan dolgokat kérdezni ami sem a tankönyvben sem a fórumokban nem található vagy megvan valahol csak nem érted, de látszik hogy foglalkoztál vele. (Főoldalon találsz keresőt, egész jól működik :)

C64 nem rossz alap, ha volt melette kis gépi kód is. (ahogy régen hívtuk)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9757
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. január 7. csütörtök, 20:47

Lépésenként:
1. LED villogó:) -> http://avr.tavir.hu/modules.php?name=Co ... page&pid=7
2, LCD: http://avr.tavir.hu/modules.php?name=Co ... age&pid=15
3, Sorosport (hibakeserésre terminálként SOKAT segít) [azonnal megy, nem kell vele bíbelődni (szintillesztő MAX232 és kész). DE: csak kvarcról szabad használni, belső órajelről NEM! (oka röviden: a soros kommunikációban az adat és az órajel ugyanazon a vezetéken megy, így NINCS tényleges órajel. Ha nem pontos az AVR órajele, akkor elcsúszás van): http://avr.tavir.hu/modules.php?name=Co ... age&pid=16
3, AD konverter, feszültségméréshez pl: http://avr.tavir.hu/modules.php?name=Co ... age&pid=29


Ebből már feszültségmérőd - kb 2 hétvege alatt - készen van. Úgy ahogyan TE akarod!

Óra:
I2C protokollal : http://avr.tavir.hu/modules.php?name=Co ... age&pid=17
És a fórumban komplett fórumtéma az ÓraICket járja körbe, 4-5 típust is.

I2C használat - hogy jól megértsd és az alapokat is - EEPROM vagy I2C-s hőmérővel kezdj, ne az órával.... Az elsőre túl komplex. újabb szombati nap.


Ez 3 hétvége :)

Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

x

HozzászólásSzerző: szepnorbee » 2010. január 8. péntek, 9:34

Jójó igazatok van, de ti is voltatok kezdők. Engem nagyon is érdekel a téma, csak vannak ezek a kezdeti nehézséggek. Na az este olvasgattam a bascom könyvet és idáig jutottam a programommal:

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 4000000

'$ baud = 2400

Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Pinc.5 = Input

Dim Channel As Byte
Dim W As Long
Dim Ss As Byte
Dim Ad As Long

Dim Sl(4) As Byte
Dim Fesz As String * 5
Dim Ertek As String * 5                                     'Show variables

M1:
Cls

'------------------------------------ Fsz mérés
W = 0
Ss = 1
Ad = 0
For Ss = 1 To 20
Start Adc
Channel = 5
W = Getadc(channel)
Stop Adc
Ad = Ad + W
Next Ss
Ad = Ad / 20
Ad = Ad * 2560
Ad = Ad / 1023
Fesz = Str(ad)
Ertek = Format(fesz , "0.00")
Lcd "  Akkufesz:"
Locate 2 , 3
Lcd Ertek ; " V"

Goto M1


Namármost ez működni látszik, csak nem minden tiszta. Ha jól értem akkor ez a program a 0 és a belső Ref fesz (2,56V) közötti értéket adja vissza. Tehát az általam linkelt mérőkapcsolás úgy van valószínű megépítve, hogy ha én a max. 25 V feszt rákapcsolom a mérővezetékre, a a PortC.5 lábra akkor is max. a Ref feszültség maximuma esik. Jól értem? Namármost létezik arra valamilyen képlet, hogy ezeket a külső alkatrészeket hogyan válogassam meg ha pl. max csak 18V-ot szeretnék mérni? Bocs ha hülyeséget kérdezek

Közben ezt találtam: http://tuxgraphics.org/electronics/200706/mini-digital-voltmeter.shtml#0lfindex4
Ez az én szitumban is megállná a helyét?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9757
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. január 8. péntek, 10:32

A bemeneteden nálad (előző kapcsolás) egy sima ellenállásosztó van. (ha jól emlékszem 1/10-es)

GND......1Kohm....ADláb......9Kohm.....betáp

feszültség ugye az ellenállásokon arányosan oszlok meg (ja, mindent a GNDhez viszonyítuunk!):
így az 1 Kohmra a bemeneti fesz 1/10-e kerül. a kondi szerepe, hogy a tuskéket, hullámzásokat csillapítsa (szerepe hasonló kb. pufferkondi a gratez egyenirányító után).

Így a mebenetre 0....2.5V jut (25V bemenő fesz esetén.
Az ott levő zenerdióda szerepe, hogy a chip bemenetere ne engedjen 5.1Vnal nagyobb feszultseget, mert a chip meghal (ZPD5,1 van azt hiszem).


Ugyen Te amit az AVRben mérsz: 0 adat -> 0V, max érték (Vref belső): 1023. E közt lineéárisan van felosztva. Ha e felett vagy, 1023-t kapsz vissza.
Ugyea feszültség ami a bementei válon van, az ACC értékéből számolható:
fesz = Vref/1023*mértADCérték.

Viszont a bemenetet leosztottad 1/10-re, így ott a 10*e van.


Tipp a programozáshoz:
Goto-t csak fix ugrásoknál használunk, ciklikus részek esetén javasolt a Do-loop kezelése. A ciklusból kiugrást az Exit do sorral lehet megoldani (ha szükséges).

Itt még nem okoz gondot, majd csak nagyobb programok esetén okozhat a Goto használata....





A programod működésében van egy érdekes rész:
A getADC értéket Te 20 darab minta _átlagaként_ kapod meg. Igaz a mintavétel gyors (kb. 16 kHz-vel fut az ADC mérés). Így csúcsérték, és egyéb finomságok elvesz(het)nek.
A ADC->valós fesz érték kiszámítása az Ad=... soroknál kezdődik.... Szóval jó!

Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

HozzászólásSzerző: szepnorbee » 2010. január 8. péntek, 11:46

Tehát a For ...Next ciklus közötti programrész mialatt 20-szor lefut, az ADC ugyanenyiszer mér és minden egyes méréskor a W értékét a mért eredménnyel növeli. Ezt utánna osztja 20-al így a 20 mérés átlagát kapom eredményül. Jól értelmezem? (Bár nem értem mire a NEXT Ss után ez az 'Ss' hisz enélkül is működik) Tehát ezt a ciklust kivéve a képletből, hamarabb reagál a műszerem a fesz ingadozásra és pontosabban is méri a pillanatnyi feszt. A könyvben olvastam, hogy az első mérésig kell legalább 30 órajel. Ezt az időt nem kell egy waitms-el kivárnom? Vagy ezt a fordító már belekalkulálja a programba? Másik kérdés: itt én a PinC.5 lábbal mérek és az 5. csatornán. Ha pl. a PinC.1-el akarok mérni, akkor az 1. csatornát kell figyelnem a programomban? Ez így a törvényszerű?

Közben idáig egyszerűsödtem:

Kód: Egész kijelölése

$regfile = "m8def.dat"
$crystal = 4000000

Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Pinc.5 = Input

Dim W As Long
Dim Fesz As String * 5
Dim Ertek As String * 5
Cls
Do
Start Adc
W = Getadc(5)
Stop Adc
W = W * 2560
W = W / 1023
Fesz = Str(w)
Ertek = Format(fesz , "0.00")
Cls
Lcd "Fesz: " ; Ertek ; "V"

Loop
A hozzászólást 2 alkalommal szerkesztették, utoljára szepnorbee 2010. január 8. péntek, 21:50-kor.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3212
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

HozzászólásSzerző: kapu48 » 2010. január 8. péntek, 14:16

Próbáld igy:

Kód: Egész kijelölése

Cls
Do

'W = 0
'Ad = 0    'Beolvasáskor ugy ís új értéket vesz fel
   Start Adc
   Ad = Getadc(5)
   Stop Adc
'Ad = Ad + W      'Ez felesleges
   Ad = Ad * 2560
   Ad = Ad / 1023
   Fesz = Str(ad)
   Ertek = Format(fesz , "0.00")
   Cls                                                      'Igy nem villog anyira az LCD
   Lcd "Fesz: " ; Ertek ; "V"

Loop

8)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9757
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. január 8. péntek, 14:47

A for valami = 1 ... sok / next működik.
Azonban 2 egymásbaágyazott for-next ciklusnál az olvashatóság miatt érdemes kirakni hogy next micsoda :).

A klasszikus Basicben (nálam ez ZX81, Sinclair) ki _kellett_ rakni a next után, hogy mi.


Az ADC az fordításkor a mérési várakozást elintézi. A 30 órajel az azért elég kevés. Az ADC ~1 MHzról jár. 30 órajel, az 30*10^-6 sec, azaz néhány usec :)
Röviden: A fordító elintézi.


A Getadc utasítással meg tudod mondani, hogy melyik ADC csatornára vagy kíváncsi. Ez nálad A c porton van. De M16 esetén pl. az A porton:).
A bemenetet kem kell beállítanod, reset után az ICknél a belső HW kapcsolódik a lábra. Mind bemenet és erre van rákötve.
Felhúzóellenállás kikapcsolása mellett.

Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

xx

HozzászólásSzerző: szepnorbee » 2010. január 8. péntek, 21:53

Közben fent megint rövidültünk :) Még olyan kérdésem lenne, hogy mialatt a portc.5-ről értéket olvasunk be, és AD konverzió történik, azalatt a többi C-portot tudom digitálisan használni? pl. ha az LCD egyik adatbusza a portc.1-en van az nem kavar be?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9757
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2010. január 8. péntek, 21:58

Persze. Nem muszály mindet AD bemenetnek használni....
Lehet sima I/O is. Azaz pl. LCD is mehet rá....


Vissza: “LCD Printer(LPT) portra”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég