Sari la conținut
ELFORUM - Forumul electronistilor

Probleme de incepatori


ole

Postări Recomandate

Schema de mai sus e greșită - intrarea neinversoare nu are polarizare de curent continuu. Mai mult , rail-to-rail la ieșire trebuie tratat cu atenție . În DS scrie Vss+15mv, Vdd-20mv cu 0.5v input overdrive. La alte modele ( MCP601/602 de exemplu ) se specifică un regim liniar de Vss+100mV , Vdd-100mV deci , dacă e important să coborâți foarte aproape de masă nu vă bazați pe asta . Sigur , probabil cu sarcină de la ieșire la masă se poate coborâ mai mult iar cu sarcină de la ieșire la Vdd se poate urca mai mult , dar nu ambele simultan.

Link spre comentariu

Schema de mai sus e greșită - intrarea neinversoare nu are polarizare de curent continuu. Mai mult , rail-to-rail la ieșire trebuie tratat cu atenție . În DS scrie Vss+15mv, Vdd-20mv cu 0.5v input overdrive. La alte modele ( MCP601/602 de exemplu ) se specifică un regim liniar de Vss+100mV , Vdd-100mV deci , dacă e important să coborâți foarte aproape de masă nu vă bazați pe asta . Sigur , probabil cu sarcină de la ieșire la masă se poate coborâ mai mult iar cu sarcină de la ieșire la Vdd se poate urca mai mult , dar nu ambele simultan.

Schema este cel mult incompleta, insa se poate vedea/deduce tipologia folosita pentru un etaj de intrare banal pentru un "osciloscop" de uz didactic, ca mai mult nu pot sa-i spun. In aceste conditii nu cred ca pe user il va deranja prea tare ca in loc de un semnal - spre exemplu de 5Vpp - va avea vizualizat un semnal cu circa 70mV mai mic. Totusi nu face avioane, iar pentru a vizualiza semnale de cel mult 50kHz (in functie de viteza de esantionare a ADC-ului) este mai mult decat suficient.

Link spre comentariu

stiu ca partea cu tensiunea separata o sa fie cu probleme si intr-adevar o sa am mare bataie de cap cu neliniaritatea o sa ma uit sa vad ce e cu acele avr-uri multumesc de sfat

 

 

Nu vad de ce ai avea nevoie de alimentare separata. Intrarea diferentiala la microcontrollere nu este altceva decat diferenta calculata intre 2 conversii a 2 pini.

Daca faci un divizor de la fiecare punct de masura, cu repetor cu un AO si utilizezi 2 intrari single-ended, este suficient sa faci diferenta software daca folosesti 2 pini ADC sau cu un singur operational, daca vrei sa folosesti numai unul.

Faci un divizor 1:100 pe fiecare punct de masura, iar castigul operationalului il pui la 100, te poti inspira din schema interna a lui AD629, daca nu gasesti chiar acest circuit de cumparat. Aceasta metoda necesita insa alimentare diferentiala (nu neaparat simetrica, poti alimenta la +12, -5V), posibil sa mearga si un rail-to-rail....

 

Cat despre nelinearitate si offset, toate ADC au nevoie de calibrare in cel putin 2 puncte, nu neaparat ca ADC-urile nu ar fi precise, dar de obicei vin dupa un circuit de conditionare care are si el imperfectiunile lui.

 

ADC-ul din AVR totusi nu stiu cat de precis este pentru masurarea tensiunilor, eu l-am utilizat pentru evaluarea starii bateriei, de obicei folosesc un ADC extern.

Editat de one
Link spre comentariu

Salutare. Intampin o problema de incepator, desi nu mai sunt de mult. Am un LCD16x2 conectat la un Atmega 8.

Conexiunile sunt in regula intre atmega si LCD, contrastul este reglat ok, totusi nu functioneaza.

Imi afiseaza niste P-uri in negativ pe primul rand, dupa care odata la cateva secunde se afiseaza caractere aiurea si iar P-uri.

Vreau sa folosesc portul B ca output, oscilator intern.

Am folosit PB1,2,3,4,6,7

 

Am incercat cu clock de la 1Mhz la 8Mhz fara nici un rezultat. Am pus si D0-D3 la masa cu acelasi rezultat. Placa de test are tensiune pe AVCC dar ADC-ul nu este initializat in softul de test. Sa fie asta o problema?

$regfile = "m8def.dat"$crystal = 1000000$hwstack = 32$swstack = 10$framesize = 40Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.4 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.1 , Rs = Portb.2Cursor OffClsLcd "Buna dimineata"LowerlineLcd "Ionut"

Am avut si D4-D7 pe pinB1-4 si E + RS pe 6 respectiv 7 cu acelasi rezultat. Am pus si condensator de filtrare pe alimentarea LCD-ului direct pe placa acestuia.

 

Ceva idei?

Link spre comentariu

A mers, dar abia cand am pus in do ... loop, altfel mergea pentru o fractiune de secunda si disparea.

Acum problema mea este cu un DHT11. Cand conectez senzorul programul ingheata

$regfile = "m8def.dat"$crystal = 1000000$hwstack = 32$swstack = 10$framesize = 40Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.4 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.1 , Rs = Portb.2Config Lcdbus = 4Declare Sub Get_th(t As Byte , H As Byte)Config Serialin = Buffered , Size = 128Config Serialout = Buffered , Size = 128Dht_put Alias Portd.6Dht_get Alias Pind.6Dht_io_set Alias Ddrd.6Dim T As ByteDim H As ByteDim Crc As ByteDim Mybyte As ByteDim Sensor_data As String * 40Dim Tmp_str8 As String * 8Dim Count As ByteEnable InterruptsSet Dht_io_setSet Dht_putDo   Waitms 1500   Call Get_th(t , H)   Locate 1 , 1  Initlcd  Locate 1 , 1   Lcd "TMP: " ; T ; "C"   Lowerline   Lcd "PHP: " ; H ; "%"LoopSub Get_th(t As Byte , H As Byte) Count = 0 Sensor_data = "" Set Dht_io_set Reset Dht_put Waitms 25 Set Dht_put Waitus 40 Reset Dht_io_set Waitus 40 If Dht_get = 1 Then    H = 1    Exit Sub End If  Waitus 80  If Dht_get = 0 Then    H = 2    Exit Sub  End If  While Dht_get = 1 : Wend   Do    While Dht_get = 0 : Wend    Waitus 30     If Dht_get = 1 Then       Sensor_data = Sensor_data + "1"       While Dht_get = 1 : Wend       Else       Sensor_data = Sensor_data + "0"    End If    Incr Count   Loop Until Count = 40   Set Dht_io_set   Set Dht_put   Tmp_str8 = Left(sensor_data , 8)   H = Binval(tmp_str8)   Tmp_str8 = Mid(sensor_data , 17 , 8)   T = Binval(tmp_str8)   Tmp_str8 = Right(sensor_data , 8)   Crc = Binval(tmp_str8)   Mybyte = T + H   If Mybyte <> Crc Then      H = 3   End IfEnd Sub

Ceva idei? Pe ISIS nu pot simula pentru ca am Proteus 7 si nu stie de DHT, iar cu Proteus 8 inca nu ma inteleg :) Deja am obosit de cate ori am scos cipul sa-l pun in programator.

Am rezolvat. Pana nu am pus la 8Mhz clock-ul nu a mers.

Link spre comentariu
  • 2 luni mai târziu...

Salut,

 

Azi mi-am batut capul cu o problema la care nu i-am gasit rezolvare, si anume: doresc sa fac un programel care sa incrementeze sau sa decrementeze variabila B in functie de butoanele care le apas ( + , ++ , -- , -) insa mereu cand ajung la 255 mi se reseteaza si incepe de la 0, sau invers.....si inca nu mi-a trecut nici o idee cum as putea rezolva problema astfel incat in momentul in care ajung la 255 si apas + sau ++ sa nu imi mai continue de la 0 si tot asa....

 

codul este urmatorul:

 

PINA.1 = activ in 1 , daca este activ, incrementeaza/decrementeaza cu valoarea 10 ( ++  ,  -- )

PINF.1 = activ in 1 , incrementez cu 1 (+)

PINF.0 = activ in 1 , decrementez cu 1 (-)

$regfile = "m128def.dat"$crystal = 8000000$hwstack=40$swstack=16$framesize=32Dim A As ByteDim B As ByteDim C As ByteDim D As ByteA = 0B = 0C = 0D = 0DoIf Pina.1 = 1 ThenDoLoop Until Pina.1 = 0D = D + 1If D > 1 ThenD = 0End IfEnd IfPorte.1 = DIf D = 1 And Pinf.1 = 1 ThenB = B + 10DoLoop Until Pinf.1 = 0ElseIf D = 0 And Pinf.1 = 1 ThenB = B + 1DoLoop Until Pinf.1 = 0End IfEnd IfIf D = 1 And Pinf.0 = 1 ThenB = B - 10DoLoop Until Pinf.0 = 0ElseIf D = 0 And Pinf.0 = 1 ThenB = B - 1DoLoop Until Pinf.0 = 0End IfEnd IfLoop   

 

 

Link spre comentariu

Inlocuieste variabilele de tip "Byte", acea e valoarea maxima pe care o pot lua. Cauti in help alte tipuri de variabile si inlocuiesti cu ce ti se potriveste, probabil Single, Word.......

Link spre comentariu

Inlocuieste  tipul "Byte" cu "Word".

In loc de asta:

If D = 1 And Pinf.1 = 1 ThenB = B + 10DoLoop Until Pinf.1 = 0

Poti folisi urmatoarea secventa de cod:

If D = 1 ThenWhile PINF.1=1B = B + 10WENDELSE ...
Link spre comentariu

Salut,

 

Multumesc de raspunsuri, insa cred ca eu nu am fost poate foarte explicit. 

 

Doresc sa fac un cod care sa se prezinte ca un potentiometru daca pot sa-i zic asa cu limite de maxim si minim , si anume:

 

Am o variabila pe 8 biti (256 valori) pe care sa o pot seta in acest interval din doua butoane: + (PINF.1) si  - (PINF.0) ; de tinut cont ca am si al treilea buton pe care daca il apas (variabila D din cod), salturile vor fi din 10 in 10....

Cand ajunge la "capat de scala" sa nu mi se reseteze valoarea variabilei,  daca de exemplu valoarea este 255 si eu apas in continuare pe butonul + pentru a mi se incrementa variabila, aceasta sa ramana la aceasta valoare, sau daca valoarea din variabila este 0 si eu apas in continuare pe butonul de - pentru a se decrementa, aceasta sa nu continue ....2 , 1 , 0 , 255 , 254 , ......s.a.m.d.

 

Sper ca acum sa ma intelegeti exact ce vreau sa fac.

 

Multumesc.

 

 

Cred ca am gasit solutia intre timp:


'**IncrementareIf D = 1 And Pinf.1 = 1 ThenDoLoop Until Pinf.1 = 0If B > 245 ThenB = 255ElseB = B + 10End IfElseIf D = 0 And Pinf.1 = 1 ThenDoLoop Until Pinf.1 = 0If B > 254 ThenB = 255ElseB = B + 1End IfEnd IfEnd If'**DecrementareIf D = 1 And Pinf.0 = 1 ThenDoLoop Until Pinf.0 = 0If B < 10 ThenB = 0ElseB = B - 10End IfElseIf D = 0 And Pinf.0 = 1 ThenDoLoop Until Pinf.0 = 0If B < 1 ThenB = 0ElseB = B - 1End IfEnd IfEnd If

 

Editat de mariuss_suciu
Link spre comentariu

Am probleme cu citirea ADC la un Atmega8, atita timp cit citesc doar o intrare ADC e totul in regula insa daca doresc citirea a inca o intrare ADC totul o ia razna, nu-mi  afisaza corect valorile, se succed cu repeziciune devenind imposibil de citit.

Config Adc = Free , Prescaler = Auto , Reference = Internal       ' Avcc       ' Aref       'Internal       'Start AdcDim V As WordDim Va As String * 4Dim X As ByteDim R As WordDoFor X = 1 To 100V = V + Getadc(0)Next XV = V / 100Va = Str(v)Locate 1 , 1If V > 99 ThenVa = Format(va , 00.00) : Lcd Va ; "V   "ElseVa = Format(va , 0.00) : Lcd Va ; "V   "End IfV = 0R = Getadc(5)Locate 2 , 1 : Lcd R ; "  "Waitms 100Loop

L.E.

 

Mda, aveam Config Adc = Free in loc de Single.....

 

 

Editat de nickrvl
Link spre comentariu

Salutare,

 

Ma chinui de azidimineata cu codul de mai jos si nu ii mai dau de capat...nu imi functioneaza nici pe placa de dezvoltare si nici in simulare Proteus 8.1.....pe display imi apare doar un 0  (valoarea initiala din variabila) si atat...nimic mai mult.

 

am incercat si cu 

 

do

 

for a = 0 to 7

wait 1

locate 2 , 1

wait 1

next

 

loop

 - asa imi numara de la 0 la 7 , dar nu inteleg de ce nu vrea sa imi incrementeze cand apas butonul :(

 

 

post-224932-0-55868800-1431182647_thumb.jpg

$regfile = "m128def.dat"$crystal = 1000000$hwstack = 40$swstack = 16$framesize = 32'Hardware Definition:'PortD:'Bit 0   = LCD DB7'Bit 1   = LCD DB6'Bit 2   = LCD DB5'Bit 3   = LCD DB4'Bit 4   = LCD Enable'Bit 5   = LCD RS'Bit 6   ='Bit 7   =Config Lcdpin = Pin , Rs = Portd.5 , E = Portd.4 , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0Config Lcd = 20 * 4Cursor Off Noblink'Port Definition / DDRx (Direction: 0 = Input ; 1 = Output) / PORTx (Pull-up state: 0 = deactivate ; 1 = activate)'0 = Input, 1 = Output'PortA:'Bit 0   = Encoder Left            INPUT with Pull-UP'Bit 1   = Encoder Right           INPUT with Pull-UP'Bit 2   = Encoder Push Button     INPUT with Pull-UP'Bit 3   = Setting for U or I      INPUT without Pull-UP'Bit 4   ='Bit 5   ='Bit 6   ='Bit 7   = LCD Backlight           OUTPUT pwm (max.8bit)'Ddra = &B11110000Config Porta = Input'PortE:'Bit 0   = LED 1x                 OUTPUT'Bit 1   = LED 10x                OUTPUT'Bit 2   = LED 100x               OUTPUT'Bit 3   ='Bit 4   ='Bit 5   ='Bit 6   ='Bit 7   ='Ddre = &B00000111Config Porte = Output'** Variables and Constantes ***Dim A As Byte                                               'used for U set or I setDim B As Byte                                               'used for multiplicator 1x , 10x , 100xDim C As Byte                                               'used for encoderA = 0B = 0C = 0'*** Program ***Do   'Settings for U set or I set   If Porta.3 = 1 Then   'Do   'Loop Until Porta.3 = 0   A = A + 1   If A > 1 Then   A = 0   End If   End IfLocate 2 , 1Lcd ALoop
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