pic problema display e ad590

« Older   Newer »
  Share  
mattia281193
view post Posted on 27/7/2012, 21:39




ragazzi utilizzo un MCU a 8 bit pic 16f876a con il micro c pro ho realizzato questo sofware che permette di visualizzare su un display con standard hitachi una temperatura che va da 0 a 100 C attraverso l'adc e la formula della proporzione :P il problema che sul display si vedono tanti simboli strani , cio sta indicare che ce un problema o di conversione o di formula ( o entrambe)
il listato è in c
ps è tutto collegato bene :lol:
CODICE
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

unsigned int dato;
long volt;
char volt2[7];

void main(){
 TRISB=0x00;
 ADCON1 = 0x80;
 TRISA=0xFF;



 Lcd_Init();
 while(1){
 dato=adc_read(0);
 volt=  ((dato*100)/634);
 IntToStr(volt,volt2);
 Lcd_Cmd(_LCD_CLEAR);
 Lcd_Cmd(_LCD_CURSOR_OFF);
 Lcd_Out(1,1,"temp=");
 Lcd_Out(1,6,volt2);

 Delay_ms(1000);
 };


 }
 
Top
view post Posted on 29/7/2012, 08:33
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Mamma mia....io ho fatto la stessa cosa in assembler e il codice è un sacco più lungo....maledizione a me che non imparo il C....mi ero messo...ma tra una balla e l'altra mi sono fermato
Pazienza riprenderò.

Le temporizzazione sul l'lcd, sono ok? Cioè, hai già fatto la prova sommaria con un altro programma? Che so, scrivere ciao all'lcd?
Se te lo scrive, l'lcd è ok.
Ricordati che ai numeri, devi sempre sommare il numero decimale 48!

Es (assembler) voglio mandare il numero 5 all'lcd

MOVLW 5
....vado a routine che fa 5+48
CALL lcdsendata (vado a routine predisposta)

Un'altra cosa, potrebbe essere il tempo d'acquisizione da parte del modulo ad, gli dai il tempo giusto? La fine conversione, la fai in polling o via interrupt?


 
Top
mattia281193
view post Posted on 29/7/2012, 15:53




lcd è ok !! ha sempre funzionato..i se scrivo "ciao" sul display appare ciao ...non la sapevo questa cosa del 48 in esadecimale , ho realizzato un voltmetro a una cifra con la stessa formula della proporzione e funzionava benissimo.
è possibile che stia "stretto" nella grandezza della stringa?? "char volt2[7]"
 
Top
view post Posted on 29/7/2012, 17:28
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Attenzione Mattia 48 DECIMALE o 30 in esadecimale.
Poi, non vorrei confonderti, magari col C non è così, dovresti chiedere a Ele 38, Lakier o altri, loro lo sanno di sicuro.
In assembler la solfa è così: se io voglio scrivere il numero 5....ma inteso solo come carattere, posso dire tranquillamente:

MOVLW "5" carica 5 in w e spedisci all'lcd
ma quel 5, non ha valore numerico, è come se fosse un carattere
Se io invece devo fare somme, operazioni, sono costretto a fare la correzione.
Se guardi il codice asci, capisci il perchè.

Per il discorso della stringa, non saprei...ripeto, non uso il c...purtroppo
 
Top
TheMrLucas
view post Posted on 31/7/2012, 12:38




Io ti consiglierei di usare un'altra libreria per la gestione dell'lcd.
Se vuoi ti mando via pm la libreria che uso io, che già di suo gestisce caratteri in formato char, int e anche con virgola se non ricordo male, così non devi fare tu la conversione con "IntToStr"
 
Top
mattia281193
view post Posted on 5/8/2012, 16:19




magari =)=)
 
Top
riemann
view post Posted on 5/8/2012, 18:00




Non uso mikroC, solo avrstudio in asm e qualche volta gcc, comunque, a naso, direi che l'adc non è inizializzato, nel senso, c'è una sorta di adc_init() da lanciare o non è necessario?
Ripeto, prendilo con le molle perchè con le librerie preimpacchettate di mikroC non sono pratico :)

Se non l'hai gia' fatto dai uno sguardo anche al datasheet del tuo PIC, per capire esattamente come settare e come fare una lettura dal canale x correttamente :P

Prova anche a inserire ADCON0 = 0x01 per accendere il convertitore sul canale 0 (piedino A0) e frequenza di conversione Fosc/2 (00).

Sul datasheet ripeto c'è la procedura per operare correttamente

http://ww1.microchip.com/downloads/en/devicedoc/30292c.pdf

Pagina 111. Procedura inizio pagina 113.
 
Top
view post Posted on 9/8/2012, 09:40
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Non ricordo bene, ma il modulo AD, "gira" su TRISA o PORTA, e mi pare che vada specificato se quella sezione la vuoi digitale o analogica, ne parlavo secoli fa con Ele38.
 
Top
mattia281193
view post Posted on 9/8/2012, 13:31




TRISA ^_^
 
Top
kokiua
view post Posted on 9/8/2012, 14:04




mattia281193, a prescindere dal processore usato, per fare del buon debug in C io procedo sempre sostituendo richiami a funzioni con istruzioni dal risultato certo.
Nel tuo caso io proverei a mettere
CODICE
volt2 = "123";

prima di
CODICE
Lcd_Out(1,6,volt2);

Così se il display ti mostra il valore corretto (123) allora il problema lo hai nella funzione di conversione IntToStr() o nel valore che gli passi.
In questo caso la prima cosa da fare è mettere un controllo sui limiti dei valori passati, del tipo:
CODICE
if(volt < -32765) volt = -32765;
 if(volt > 32765) volt = 32765;

(i limiti sono per un valore signed int)
Un ultimo appunto è sull'uso delle variabili intere con operazioni in virgola mobile dove è sempre bene anteporre la definizione del tipo di variabile da elaborare, e indicare le costanti come float così che il compilatore non ti tronchi i risultati:
CODICE
volt = (float)( ((float)dato * 100.0) / 634.0 );

in questo modo prima di assegnare il risultato come int a volt l'operazione viene eseguita come valori float perdendo nella conversione implicita (da float a int) solo la parte eccedente (i decimali)

 
Top
9 replies since 27/7/2012, 21:39   176 views
  Share