Sari la conținut
ELFORUM - Forumul electronistilor

BASCOM


yo9hnf

Postări Recomandate

Pana iti vin piesele, ai aici un exemplu scris de mine care functioneaza si face exact ce vrei tu, dar pe un display LCD.

Am o intrebare fata de legarea la masa a pinilor liberi/nefolositi ai LCD-ului, astfel ii legi si in montajele realizate sau doar in acest exemplu? si ce efect are? Intreb pentru ca inca am de furca cu montajele cu LCD care incep sa "aiureze" dupa o perioada de timp fie la apasarea butoanelor sau "din senin" suspectez paraziti, initial am banuit a fi Mc-urile insa cu timpul le-am scos din ecuatie deoarece dupa efectuarea "ca la carte" (si la sugestia/recomandarea celor de aici) a decuplarilor catre masa a cablajului fara bucle de masa + toate celelalte precautii mi-am dat seama ca de fapt acesta (mc-ul) lucreaza bine si de fapt problema e din LCD!!, astfel am incercat si la acesta sa-l decuplez sa-i fac trasee scurte etc etc dar "perfectiunea" tot nu am reusit-o, invariabil mai devreme sau mai tirziu tot incepe sa aiureze si astfel trebuie RESET la tot montajul, de aici si intrebarea......

Link spre comentariu

Multumesc tuturor pentru ajutor, am reusit azi sa fac voltemtrul sa functioneze si in simulator, i-am adaptat si o cifra cu 7 segmente astfel incat sa stiu care adc este afisat.

Atasez codul mai jos daca este cineva interesat, (codul este in atasament)

 

Acum vreau sa revin la singura problema pe care o mai am..

 

Timeru funtioneaza conform dorintelor, cand se termina timpul, buzerul nu se opreste pana nu apas butonul de start/pauza.

Vreau ca timeru dupa ce a expirat timpul si am apasat pe buton,am ajuns in stem-by, sa stea 30 secunde, maxim1 minut si sa se stinga segmentele (doar cat sta in stem-by, nu si cand functioneaza), deoarece va fi actionat de un acumulator si sa nu se consume cand nu este actionat.

Atasez mai jos codul in chenar.

Multumesc.

'************* Konfiguracja uC *****************'***********************************************$regfile = "m8def.dat"$crystal = 4000000 Config Portb = &B00000000 : Portb = &B11111111Config Portc = &B11111111 : Portc = &B11110000Config Portd = &B11111111 : Portd = &B11111111Config Portb.3 = OutputSw_port Alias Pinb Config Timer0 = Timer , Prescale = 64Enable Timer0 : On Timer0 Prztimer0 Enable Interrupts'********** Konfiguracja uC Koniec  ************ '******************  Zmienne *******************'***********************************************Dim Co4ms As ByteDim F4ms As Bit Dim M As Byte , S As ByteDim M2 As ByteDim Pd As Byte , Pc As ByteDim W As Byte , Ktory_w As ByteDim Dled As Bit , Savesig As Bit , Mig As BitDim Buzz As BitDim Odliczanie As Bit , Alarm As BitDim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte       'zmienne'*************  Zmienne Koniec  **************** '************ Warunki Poczatkowe ***************'***********************************************Readeeprom M , 1If M > 99 Or M < 1 Then M = 40S = 0 '*******  Warunki Poczatkowe Koniec  *********** '**************  Petla glowna ******************'***********************************************  Do    If F4ms = 1 Then    F4ms = 0    Gosub Wyswietl    Gosub Przyciski  End If  LoopEnd'************ Petla glowna Koniec ************** '************ Przerwanie timer 0 ***************'***********************************************Prztimer0:Timer0 = 6Set F4msIncr Co4msIf Co4ms = 250 Then  Co4ms = 0  Toggle Mig  If Odliczanie = 1 Then    Dled = Mig    Decr S    If S = 255 Then      S = 59      Decr M    End If     If M = 0 And S = 0 Then       Odliczanie = 0      Alarm = 1      Portb.3 = 1	   End If   Else    Dled = 0   End IfEnd IfReturn'******** Przerwanie timer 0 Koniec ************ Wyswietl: Incr Ktory_w If Ktory_w = 4 Then Ktory_w = 0  Select Case Ktory_w  Case 0:    Reset Portc.0    W = M / 10    If W = 0 Then W = 10    Set Portc.3  Case 1:    Reset Portc.3    W = M Mod 10    Set Portc.2  Case 2:    Reset Portc.2    W = S / 10    Set Portc.1  Case 3:    Reset Portc.1    W = S Mod 10    Set Portc.0 End Select  If Alarm = 0 Then Portb.3 = 0    W = Lookup(w , Tabela) Else   If Mig = 1 Then W = 191 Else W = 255 End If  If Savesig = 1 Then W = 255  Portc.4 = W.4Portc.5 = W.3Pd.0 = W.2Pd.1 = W.6Pd.2 = W.5Pd.3 = W.0Pd.4 = W.1Pd.5 = DledPd.6 = Buzz Portd = Pd  Return  '***********************************************'*****************  Przyciski     **************Przyciski:Sw = Sw_port And &B00000111                                 'maska na piny nieużywane jako sw If Sw <> 7 And Stan_sw = Sw Then    Incr Licznik_sw    If Licznik_sw = 100 Then     Licznik_sw = 0     If Alarm = 0 Then         Select Case Stan_sw          Case &B00000110:                                  'plus            If Odliczanie = 0 Then              If M < 99 Then Incr M              S = 0            End If          Case &B00000101:                                  'minus            If Odliczanie = 0 Then              If M > 1 Then Decr M              S = 0            End If          Case &B00000011:                                  'start/pause            If Savesig = 0 Then Toggle Odliczanie Else Savesig = 0          Case &B00000100:                                  'save            If Odliczanie = 0 Then              Writeeeprom M , 1              Savesig = 1            End If        End Select       Else        Alarm = 0          Readeeprom M , 1        If M > 99 Or M < 1 Then M = 40        S = 0      End If    End If  Else    Stan_sw = Sw    Licznik_sw = 60  End If Return'***********************************************'*************************************************  Tabela:    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255 , 191'znak:    0     1     2     3     4     5     6     7     8     9    pusty  -

Voltmetru.rar

Editat de costyy86
Link spre comentariu

Am o intrebare fata de legarea la masa a pinilor liberi/nefolositi ai LCD-ului, astfel ii legi si in montajele realizate sau doar in acest exemplu? si ce efect are? Intreb pentru ca inca am de furca cu montajele cu LCD care incep sa "aiureze" dupa o perioada de timp fie la apasarea butoanelor sau "din senin" suspectez paraziti, initial am banuit a fi Mc-urile insa cu timpul le-am scos din ecuatie deoarece dupa efectuarea "ca la carte" (si la sugestia/recomandarea celor de aici) a decuplarilor catre masa a cablajului fara bucle de masa + toate celelalte precautii mi-am dat seama ca de fapt acesta (mc-ul) lucreaza bine si de fapt problema e din LCD!!, astfel am incercat si la acesta sa-l decuplez sa-i fac trasee scurte etc etc dar "perfectiunea" tot nu am reusit-o, invariabil mai devreme sau mai tirziu tot incepe sa aiureze si astfel trebuie RESET la tot montajul, de aici si intrebarea......

Da,exact asa le folosesc pe toate, cu pinii de date nefolositi legati la masa.Am cateva care functioneaza zilnic de cativa ani si nu am avut nicio problema.Niciodata n-am folosit afisaje noi, doar recuperate.Toate montajele in care le folosesc sunt facute pe cablaj de test.Pe acei pini de date legati la masa intotdeauna exista zero logic.

Link spre comentariu
  • 1 lună mai târziu...

Am nevoie de ajutor, am un selector, la fiecare apasare de buton se schimba cifra pe un display cu 7 segmente anod comun.

Dar segmentul "G" nu vrea sa functioneze deoarece este pe pinul reset, cum il pot face sa functioneze?

Atasez codul mai jos.

Multumesc.

 

L.E. Am rezolvat, a trebuit dezactivat resetu din fusebiti....

  $regfile = "m8def.dat"$crystal = 8000000Config Portc = Output  Config Portd.7 = InputConfig Portd.6 = Input  Up Alias Pind.7Down Alias Pind.67segment Alias PortcDim A As WordA = 0Do	If Up = 0 And A < 7 ThenA = A + 1 Waitms 500 End If   If Down = 0 And A > 0 ThenA = A - 1 Waitms 500 End If  Select Case A: Case 0 : 7segment = &HF9 Case 1 : 7segment = &HA4 Case 2 : 7segment = &HB0 Case 3 : 7segment = &H99 Case 4 : 7segment = &H92 Case 5 : 7segment = &H82 Case 6 : 7segment = &HF8 Case 7 : 7segment = &H80End Select  LoopEnd                                                         'end program
Editat de costyy86
Link spre comentariu

Am o problema si  nu o pot depista.

Am facut un voltmetru cu atmega8 TQFP si display 7 segmente anod comun, 4 digiti.

El trebuie sa citeasca si sa redea tensiuni intre 0 si 30v.

La fiecare apasare de buton trebuie sa afiseze tensiunea de pe un port.

Programul functioneaza PERFECT in simulator Proteus 8.3, insa in realitate afiseaza numai aiureli, ma puteti ajuta in legatura cu, codul? sunt sigur ca el este problema, insa nu am lucrat cu diplaly led si nu ma prea pricep.

 

Eu suspectez ca problema este undeva la configurarea displayului.

 

Atasez mai jos schema si codul sursa.

Multumesc.

 

 

$regfile = "m8def.dat"$crystal = 8000000Config Portc = Input Config Portb = OutputConfig Portd = OutputConfig Adc = Single , Prescaler = AutoConfig Portd.6 = InputConfig Portd.7 = Input Set Portd.6Set Portd.7 Buton_up Alias Pind.6Buton_down Alias Pind.7 Start Adc  Dim Read_adc As WordDim Volt As SingleDim Volt1 As IntegerDim Bit4 As IntegerDim Bit3 As IntegerDim Bit2 As IntegerDim Bit1 As IntegerDim B1 As ByteDim A As ByteA = 0  Do If Buton_up = 0 And A < 7 ThenA = A + 1Waitms 500End If   If Buton_down = 0 And A > 0 ThenA = A - 1Waitms 500End If	Read_adc = Getadc(a)Volt = Read_adc / 1023 Volt = Volt * 30Volt = Volt * 100Volt1 = Volt   Bit4 = Volt1 / 1000B1 = Lookup(bit4 , Dta)Portd = &B00001000Portb = B1 Bit3 = Volt1 / 100Bit3 = Bit3 Mod 10B1 = Lookup(bit3 , Dta)Portd = &B00000100Portb = B1 Bit2 = Volt1 / 10Bit2 = Bit2 Mod 10B1 = Lookup(bit2 , Dta)Portd = &B00000010Portb = B1 Bit1 = Volt1 Mod 10B1 = Lookup(bit1 , Dta)Portd = &B00000001Portb = B1Loop Dta:Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00

Schema voltmetru.pdf

Link spre comentariu

in Dta nu ai valoarea portului B pentru cifra 9 (&H18)

Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00, &H18
Editat de Elison
Link spre comentariu

Pe langa observatia userului Elison mai am si eu:

- referinta de tensiune este ca si inexistenta. Un divizor format dintr-o rezistenta si un semireglabil nu garanteaza stabilitatea referintei cu temperatura, cu umiditatea s.a.m.d.. In plus, nu are decuplare, fapt ce induce zgomot in procesul de conversie al ADC. Mai bine conecteaza un condensator intre Aref si masa si seteaza referinta ca fiind Vcc.

- de ce nu ai folosit tu PORTD ca port pentru comanda segmentelor si, respectiv PORTB pentru comanda anozilor afisorului? Cred ca era mai confortabil asa, dar daca asta ti-e optiunea ....

- in program, codul de mai jos este eronat din doua puncte de vedere:

Volt = Read_adc / 1023

Corect era:

Volt = Read_adc / 1024Volt=volt*5.00  ' sau alta valoare a referintei de tensiune

Expresia folosita de tine ar putea fi valabila doar pentru o referinta de tensiune de 1.000V.

In alta ordine de idei, intarzierile de 500 ms vor conduce la o rata mica de actualizare a valoarilor afisate atunci cand butonul/butoanele sunt apasate. Incearca sa schimbi solutia de actualizarea a valorii afisate utilizand un timer.

Link spre comentariu

Am facut modificarile, s-a schimbat ceva dar tot nu e ok, am pus si o baterie sa citesc tensiunea si nu citeste nimic, afisajul nu functioneaza ok, am masurat traseele, sunt ok toate, sunt conform schemei,pcb-ul este facut pentru ca displayu sa fie lipit pe fata cu trasee, 

Schema nu am facut-o eu, am avut-o primita,nu mai retin de unde, cu cod cu tot, si am testat dupa cum am spus in simulator si functiona perfect, altfel cautam alta, de testat pe breadboard nu am avut cum, ca nu aveam atmega PDIP..

 

Eu banui ca tot undeva la configurarea displayului e bai, dar nu reusesc sa gasesc,am cautat pe net tutorial de configurare in bascom, dar nu am gasit mai nimic.

Atasez si o poza cu afisajul.

 

Posted Image

Link spre comentariu

Posteaza desenul cablajului cu dispunerea componentelor. in cazul tau multiplexarea nu functioneaza corespunzator. Si inca ceva, daca masurarea se face pe porturile aferente comparatorului solutia soft aleasa de tine nu este cea corecta.

Link spre comentariu

Eu nu vorbeam de inlocuit/scos tranzistori, ci de solutia software de afisare. Ar trebui sa folosesti un timer (ex.TIMER0) setat pentru overflow la 1ms si sa folosesti rutina de overflow  pentru afisare.

Acum am vazut ca citirea se face pe porturile ADC (scuze imi patinau ochii)

Afisarea se face cu afisoare cu anod comun tip VQE (vad ca au 18pini)? Daca da, atunci cablajul a fost prost proiectat si ca sa intelegi, pune afisoarele pe fata opusa traseelor de cupru.

Link spre comentariu

Nu ma pricep sa modific cele spuse, nu am prea mare experienta.

O sa incerc sa vad ce reusesc sa fac, nu mai am nici atmega si nici timp sa realizez altul, problema este numai din program, o sa caut eventualalt program si sa il "adaptez" schemei, daca reusesc.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări