Sari la conținut
ELFORUM - Forumul electronistilor

Invatat programare de la zero


riciu

Postări Recomandate

< do {

temp_value = ADC_Read(0);

tempinK = temp_value*5000/255;

//tempinK = tempinK*10;

tempinC = tempinK-273.15;

//tempinF = 9*tempinC/5 + 3200;

Display_Temperature();

Delay_ms(500); // Temperature sampling at 1 sec interval

} while(1);

}

>


Am postat doar partea de afisare si calcul....ca sa nu incarca forumul

Editat de catalin004
Link spre comentariu

Pare OK portiunea de program.

Ce nu functioneaza sau, si mai bine, ce valori afiseaza?

Butonul de care vorbea mars01 este asta: post-194122-0-28946500-1502367521.png si il gasesti pe bara editorului prin care faci postarile

Link spre comentariu

Deci senzorul l-am alimentat astfel, insa procesorul este un PIC:

temperatura afisata nu este reala...adica este mai mare decat cea normala.....

 

post-218154-0-35909700-1502368023_thumb.png

Link spre comentariu

Nu lucrez pe breadboard....am o placa de test facuta de mine...de pe care scot procesorul si il scriu apoi fac testul...LM este montat tot pe ea....temperatura este mai are cu 6-7 grade...am incercat si din ADJ insa daca ii pun potentiometrul sta fixa la 22 si nu modifica nimic...in general ma interea formula de calcul , restul poate e din hard....

Link spre comentariu

Calibrarea o poti face la punctul de inghet sau fierbere al apei, sau la temperatura corpului, este destul de stabila, insa calibrarea n-o sa te ajute sa afisezi temperatura cu o rezolutie mai mica de doua grade celsius, asta din cauza convertorulului ADC de 8 biti.

Abateri mari poti sa ai si din cauza faptului ca in program nu lucrezi cu variabile de tipul float.

Editat de Elison
Link spre comentariu

Abateri mari poti sa ai si din cauza faptului ca in program nu lucrezi cu variabile de tipul float.

Puteti argumenta afirmatia asta? Multumesc.
Link spre comentariu

Puteti argumenta afirmatia asta? Multumesc.

Sa presupunem ca tempinC este variabila de tipul INT, asta inseamna, conform codului atasat, ca la o valoare temp_value de 143 o sa avem tempinC egal 2529 in loc de 2529.85.

Link spre comentariu

La un LM335 necalibrat, eroarea de 6 grade este normala. Cu un ADC pe 8b, rezolutia este de 2 grade si eroarea indicatiei poate creste.

In primul rand, senzorul trebuie calibrat cu o tensiune ajustabila intre OUT si GND. Daca nu merge, senzorul are calibrarea defecta.

Se poate realiza calibrarea si cu un al doilea ADC la care se aplica o tensiune ajustabila intre GND si +5V. Se aduna la valoarea citita la ADC1 o valoare (pozitiva sau negativa) proportionala cu cea citita la ADC2 (N - 128).

Rezolutia de 8b (20 mV) a MC este prea slaba, ar trebui macar 10b (5 mV) pentru a arata fiecare grad.

Se poate imbunatati mult rezolutia unui ADC prin interpolare liniara, dar este complicat.

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

Salutare...vreau sa fac un singur buton pentru on/off

am ales programul urmator...dar nu prea merge....nu vrea sail stinga....daca scot variabila, si nu bag delay , cand apas pe buton imi porneste si se opreste repede, sau face de 3 ori comanda , adica se repeta si imi reia ciclul...rog ajutor...

 

 

void main()
{
int i=0;
TRISC.F3=0;
TRISB.F0=1;
PORTC.F3=0;
for(;;)
{
if (PORTB.F0==0 && i==0)
{
PORTC.F3=1;
delay_ms(300);
i=1;
}
if (PORTB.F0==0 && i==1)
{
PORTC.F3=0;
delay_ms(300);
i=0;
}
}}
Link spre comentariu

Salut!

 

Ceea ce iti este neclar tie este:

 

1. Tu trebuie sa faci un asa numit toggle: adica fiecare apasare a unui buton sa schimbe starea unei iesiri. Prima apasare a butonului face iesirea ON, a 2-a o face OFF si tot asa. Pentru aceasta se poate face XOR pe bitul corespunzator iesirii tale din registrul portului respectiv, adica in cazul tau PORTB. Sau pur si simplu inversezi starea logica a bitului in cauza.

2. Daca doresti ca atunci cand se tine butonul apasat sa nu se intample nimic atunci tot ce trebuie sa faci este sa tii cont de starea anterioara a butonului si sa conditionezi schimbarea starii iesirii de faptul ca anterior, pe interatia precedenta prin bucla, iesirea sa fi fost in stare diferita.

 

 

Cu alte cuvinte o varianta ar fi asa:

void main() {
   TRISC.F3 = 0;  // iesire
   TRISB.F0 = 1;  // buton
   PORTC.F3 = 0;

   while(1) {
     if (PORTB.F0 == 0) {
       delay_ms(10);
       if (PORTB.F0 == 0) {
         PORTC.F3 = !PORTC.F3;
       }
     }
     delay_ms(300);
   }
}

sau o varianta care tine cont de starea anterioara a butonului astfel incat daca se tine butonul apasat se ramane in aceasi stare, schimbarea efectuandu-se doar cand se apasa butonul, pe tranzitia de la OFF la ON.

#define OFF 1
#define ON  0

void main() {
   unsigned char stare_anterioara = OFF;
   TRISC.F3 = 0;  // iesire
   TRISB.F0 = 1;  // buton
   PORTC.F3 = 0;

   while(1) {
     
     if (PORTB.F0 == OFF) {
       stare_anterioara = OFF;
     }
     
     if (PORTB.F0 == ON && stare_anterioara == OFF) {
       delay_ms(10);
       if (PORTB.F0 == ON) {
         PORTC.F3 = !PORTC.F3;
         stare_anterioara = ON;
       }
     }
   }
}
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