Sari la conținut
ELFORUM - Forumul electronistilor

Ajutor cu un volt-termometru cu display OLED


fratello

Postări Recomandate

Dacă firele folosite pentru SCL și SDA sunt prea lungi, e posibil să apară blocaje. Micșorează frecvența SCL din interfața TWI a microcontrolerului. Eu am avut afișaje care nu mergeau corect cu fire de 5 centimetri lungime. Am scăzut frecvența SCL din interfața TWI a microcontrolerului la 2000Hz și au început să meargă bine. După asta, afișajele mergeau bine chiar și cu fir de 50 centimetri.

 

Dacă activezi rezistențele pull-up din microcontroler, nu mai este nevoie de rezistențele pull-up up externe. Rezistențele pull-up interne au tot 10K.

Link spre comentariu
  • Răspunsuri 117
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

eu nu am mai umblat in C de vreo 15 ani.   Doar in asm. Frecvenţa SCL se calculează în funcţie de cristal (şi uneori de tipul microcontrolerului, iar pentru asta trebuie văzut datasheetul).

Pentru un atmega32 cu un cristal de 8MHz, pun registrul TWBR = 15 iar presacalerul este 4 (bitii TWPS1 şi TWPS0). Asta înseamnă Ftwi = 2MHz. La final, am SCL = 1039 Hz.

 

Dacă te uiţi in datasheet la atmega 328p, o sa gaseşti o formulă pe la pagina 180 care e un pic diferita de cea de la atmega32. 

 

Încearcă cu frecvenţe mici chiar daca afişarea o sa fie mai lentă, şi dacă nu se mai blochează, atunci e vina afişajului care e mai trântor...

 

.equ    TWBR_rate=15                    ; seteaza rata CLK pentru interfata TWI (impreuna cu 
                                        ;  bitii TWPS0 si TWPS1 din TWSR)
........

init_TWI_block: in r16,TWCR  andi r16,0b_1111_1110  out TWCR,r16    ; opreste intreruperile interfetei TWI (TWI=0)
                ; SCL = 1039Hz cu TWI prescaler 4 (TWSR = 01) si TWBR=15 (0x0F)
                ; initializeaza viteza de transmisie, SCL clock la o rata de 1039 Hz
                ; TWBR = 15 si TWPS1.0=4 (TWPS1=0, TWPS0=1)

                in r16,SFIOR                andi r16,0b11111011         ; pozitioneaza PUD din SFIOR (bit 2) pe 0, pull-up enable
                out SFIOR,r16                                           ; inscrie SFIOR

                ldi r16,TWBR_rate           out TWBR,r16    	; seteaza rata de transmisie TWI in TWBR
                cbi TWSR,TWPS1              sbi TWSR,TWPS0  	; prescalerul TWI setat pe x4
                cbi PORTC-1,0               sbi PORTC,0     	; SCL pe intrare cu pull-up activ
                cbi PORTC-1,1               sbi PORTC,1     	; SDA pe intrare cu pull-up activ
                ret

 

Link spre comentariu

Deci sunt 15 ore de cand montajul functioneaza perfect cu u8g2lib si modificarea facuta in cod.

Am lamurit problema cu acest display :

-a avut nevoie de rezistente de pull-up

-a avut nevoie de o frecventa mai mica a busului de date.

Multumesc pentru suport. Duminica placuta !

Link spre comentariu
La 16.02.2024 la 18:32, zvonacfirst a spus:

La calculul tensiunii am introdus un coeficient de corectie kV deoarece nu am masurat rezistentele din divizorul rezistiv ca sa folosesc in cod valorile lor reale. Este mai simplu asa pentru a face o calibrare deoarece sunt pe breadboard si poate nici contactele nu sunt cele mai bune.

 

 

 

Cum ai calculat kV ?

Link spre comentariu

factor de compensare folosesc şi eu la toate programele. Se adună sau se inmulţeşte cu valoarea totală (aici depinde de senzor) apoi se afişează rezultatul. Eu nu stau să-l calculez ci îl salvez în EEPROM şi apoi îl pot modifica din taste ca să nu mai fie nevoie să fac modificări în program şi să trebuiască să reînscriu microcontrolerul în cazul în care schimb piesulici.

 

Pentru convertorul AD  cu divizor in faţă se calculeaza înmulţind k cu tensiuna dată ce convertor:

La început elimini pe k din formulă sau îl pui 1.

k = tensiunea_de_măsurat / tensiunea_indicată_pe_afişaj.

după ce bagi pe k în formulă, tensiunea arătată pe afişaj o să fie cea corectă. 

 

 

Editat de cimitavita
Link spre comentariu

Update : ieri am primit un alt display (tot din RPC) ; pe spate arata diferit de primul. Functioneaza de aseara, fara probleme, cu u8g2lib (fara rezistente de pull-up, fara modificari de bus in cod).

Deci primul exemplar de display a fost mai "sensibil" ...

Link spre comentariu

Dacă te uiți mai bine pe afișaj, o să vezi că are rezistențe pull-up pe el de 4,7K. Fără rezistențe pull-up, magistrala I2C nu are cum să meargă pentru că atât SCL cât și SDA sunt de tipul open collector.

Sunt mai multe module pentru arduino care au rezistențele pull-up pe ele (4,7K), cum ar fi adaptorul pentru display cu PCF8574, ceasul RTC cu DS3231, și altele...

Editat de cimitavita
Link spre comentariu
Acum 6 ore, fratello a spus:

O fi avand rezistente pe cablaj, dar fara cele suplimentare nu merge. Le-am verificat pe cele de pe cablaj : au 10K, merg la pinii SDA si SCK.

Al doilea display merge fara nicio modificare, hard sau soft.

Inlocuiestele cu 4k7 si o sa functioneze bine si ala "sensibil". 10k e cam mult!

Link spre comentariu
  • 2 săptămâni mai târziu...

E posibil ca Nano sa nu poate gestiona treaba cu ecranul (poate procesor prsa slab, prea puțin RAM, mai ales la o clona). Citisem pe undeva ca sunt probleme la combinatia asta de nano cu ecran (grafic) oled. Incearca cu un ESP32, poate e mai potent. E doar o parere...

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