Jump to content
ELFORUM - Forumul electronistilor

ADC 16f716


Guest Zuma Delux

Recommended Posts

Guest 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 to comment
  • Replies 6
  • Created
  • Last Reply

Top Posters In This Topic

  • Mircea

    1

  • costi002

    1

  • mars01

    1

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
Edited by thunderer
Link to comment

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

Edited by mars01
Link to comment
  • 1 month later...
Guest 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 to comment
Guest 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 to comment
Guest 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 to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines