costyy86 Postat Februarie 26, 2016 Partajează Postat Februarie 26, 2016 Multumesc mult. O sa "ma joc" si cu acest program. Link spre comentariu
nickrvl Postat Februarie 27, 2016 Partajează Postat Februarie 27, 2016 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
costyy86 Postat Februarie 27, 2016 Partajează Postat Februarie 27, 2016 (editat) 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 Februarie 27, 2016 de costyy86 Link spre comentariu
Elison Postat Februarie 27, 2016 Partajează Postat Februarie 27, 2016 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
nickrvl Postat Februarie 28, 2016 Partajează Postat Februarie 28, 2016 Acum ca am confirmarea o sa incerc si varianta asta pentru ca e frustrant sa ai un montaj functional care o ia pe aratura doar ca aprind un bec linga sau bag ceva in priza.... Link spre comentariu
costyy86 Postat Martie 29, 2016 Partajează Postat Martie 29, 2016 (editat) 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 Martie 29, 2016 de costyy86 Link spre comentariu
costyy86 Postat Martie 30, 2016 Partajează Postat Martie 30, 2016 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
Elison Postat Martie 31, 2016 Partajează Postat Martie 31, 2016 (editat) in Dta nu ai valoarea portului B pentru cifra 9 (&H18) Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00, &H18 Editat Martie 31, 2016 de Elison Link spre comentariu
nico_2010 Postat Martie 31, 2016 Partajează Postat Martie 31, 2016 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
costyy86 Postat Martie 31, 2016 Partajează Postat Martie 31, 2016 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. Link spre comentariu
nico_2010 Postat Martie 31, 2016 Partajează Postat Martie 31, 2016 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
costyy86 Postat Martie 31, 2016 Partajează Postat Martie 31, 2016 Am incercat si fara tranzistori, am pus in locul lor direct rezistente intre baza si pin afisor, rezistentele afisajului sunt de 220R, alimentare 5v. voltmetru.pdf Link spre comentariu
nico_2010 Postat Martie 31, 2016 Partajează Postat Martie 31, 2016 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
costyy86 Postat Martie 31, 2016 Partajează Postat Martie 31, 2016 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
nico_2010 Postat Martie 31, 2016 Partajează Postat Martie 31, 2016 Citeste ce am scris eu mai devreme si muta afisoarele pe fata opusa celei pe care le ai acum. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum