Sari la conținut
ELFORUM - Forumul electronistilor

ADC 16f716


Vizitator Zuma Delux

Postări Recomandate

Vizitator Zuma Delux

Buna ziua,incerc sa citesc RA0 si RA1 pe un 16f716 si am incercat sa scriu un cod in C,recunosc sunt absolut la inceput de drum si sper ca se gaseste cineva sa-mi spuna unde gresesc.Am redus codul,el nu mai contine si textele pe care oricum la simulare in ISIS 7 si reala le scrie pe lcd care e un 2x16.Dar in rest nu vrea sa-mi puna cele doua valori pe lcd.

Daca aveti un pic de timp sa ma indrumati si pe mine va rog din suflet.Nu vreau sa abandonez doar pentru ca la inceput de drum mi-am cam prins urechile.

Va multumesc.

 

Aveti ma jos codul:

 

sbit LCD_RS at RB3_bit;
sbit LCD_EN at RB2_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB3_bit;
sbit LCD_EN_Direction at TRISB2_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;



int vala;
int valb;
char a[4];
char b[4];


void main()
{

TRISA.RA0=1;
TRISA.RA1=1;


ADC_Init();
Lcd_Init();

Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Cmd(_LCD_CLEAR);




while(1);
{
vala=adc_read(0);
vala=vala*19.60; // (5*1000/255)
valb=adc_read(1);
valb=valb*19.60; // (5*1000/255)
floattostr(vala,a);
floattostr(valb,b);

LCD_Out (1,1,a);
LCD_Out (2,1,b);
delay_ms(500);
}
}

 

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

Top autori în acest subiect

Valoarea dupa FloatToStr e de 11 caractere 14 caractere (multumesc Marius). Tu ai numai 4 asignate, dupa cum spune si colegul costi.

Adc_read(x) iti va da o valoare de 10 biti. Deci impartirea ta la 255 (trebuia sa fie 256 pentru 8 biti) trebuie facuta la 1024.

LE: ai dreptate cu 8 biti la ADC.

LE2: Arata ceva LCD-ul? Caci bibliotecile MikroC sunt pentru 44870.

Incearca si asta (la toate conexiunile catre LCD):

sbit LCD_RS at PORTB3_bit
Editat de thunderer
Link spre comentariu

Salut.

 

1. Scrie in clar ce compilator C folosesti. Chiar daca esti incepator, noi nu trebuie sa ghicim ca este vorba de mikroC.

2. Variabilele vala si valb ar fi mai "citibile" daca le-ai scrie ca val_a si val_b, adica folosind un underscore

3. Variabilele vala si valb le declari ca INTEGER adica valori intregi (stocheaza valori de la -2^15 pana la (2^15)-1 pentru controlerul ales). Mai apoi stochezi o valoare returnata de ADC (care poate avea valori doar intre 0 si 255 - ADC pe 8 bit), ceea ce este OK pentru ca acest interval este inclus in intervalul de valori al INT. Dar ceea ce nu este OK este ca apoi tu incerci sa stochezi in aceasi variabila tip INT (vala sau valb, este la fel pentru oricare) o valoare FLOAT. Ceea ce nu se poate pentru ca majoritatea compilatoarelor C (mikroC inclus) fac promotie automata la INT si nu la FLOAT.

 

Ori declari variabilele vala si valb ca FLOAT si cand faci asignarea valorii ADC in ele, o faci cu casting la FLOAT. Adica:

float vala;
float valb;

/*
cod
*/

vala = (float)adc_read(0);

// cod

valb = (float)adc_read(1);

// cod

Sau renunti la zecimale si faci casting la INT unde este cazul, plus ca vei folosi in acest caz functia IntToStr(int input, char *string).

 

BTW, cum au spus si colegii, functia floattostr are nevoie ca stringurile de destinatie sa:

"Destination string should be at least 14 characters in length." - din helpul mikroC.

 

 

LE:

 

Big issue:

Cam ce crezi ca face ; dupa:

while(1);

Nu cumva ramane in bucla infinita si numai executa nimic dupa?

Ia incearca sa scoti acel punct si virgula ... si fa modificarile pe care ti le-am sugerat ...

 

288rx2w.jpg

Editat de mars01
Link spre comentariu
  • 1 lună mai târziu...
Vizitator Zuma Delux

Va multumesc tuturor pentru sfaturi,pana la urma am mai studiat problema si in final am reusit sa scriu codul in mikroc pro care si functioneaza atat in simulare cu Proteus cat si realizat fizic.Asa arata codul acum:

 

// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D4 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB7_bit;
sbit LCD_D4_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
float val;
char v[8];
void main()
{
LCD_Init();
ADC_Init();
TRISA.RA0=1;
TRISB=0;
LCD_cmd(_LCD_CLEAR);
LCD_cmd(_LCD_CURSOR_OFF);
LCD_out(1,1,"Voltmetru");
delay_ms(1000);
LCD_cmd(_LCD_CLEAR);
while(1)
{
val=ADC_read(0);
val=val*5;
val=val/255;
floattostr(val,v);
v[4]=0;
LCD_out(2,1,"RA0=");
LCD_out(2,5,Ltrim(v));
LCD_out(2,10,"Volti");
delay_ms(300);
}
}
Link spre comentariu
Vizitator Zuma Delux

Am o alta mare rugaminte,acum ma chinui la propriu cu un ceas fara RTC,doar cu tmr1,am incercat cu tmr0 dar ori o ia inainte ori inapoi.Tot cu 16f716,cu ce valoare trebuie sa incarc registrii tmr1h si tmr1l in cazul unui oscilator extern cu cuartz de 4 Mhz,am tot incercat cu calculatorul de la mikroc,dar patesc aceeasi chestiune,ori inainte ori inapoi.Si ar mai fi INTCON care in cazul meu este 0b00100001,este valoarea corecta si cum sa fac intreruperea la 1 secunda.Scuze pentru imbecilitatea mea manifestata la 20 de ani cand am ignorat aceste lucruri.Acum la 52 sper sa imi vina mintea la cap.Poate,sper,ca nu e prea tarziu.Multumesc anticipat.

Link spre comentariu
Vizitator Zuma Delux

Am rezolvat intre timp,cu TMR2 si cu ajutorul calculatorul de timer de la mikroc.Acum dupa vreo 5 ore de mers e la secunda.Ce nu inteleg este de ce cu tmr0 nu e precis.

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