sfinge Inserito: 5 ottobre 2005 Segnala Inserito: 5 ottobre 2005 Ciao a tutti!Vi espongo un piccolo listato in C che ho realizzato per visualizzare i punti del convertitore A/D del pic 16f876 su un piccolo Display.Il display normalmente scrive le cifre da sx a dx in modo incrementale.Io vorrei che le scrivesse da dx a sx come di solito si fa.Ho provato a mascherare con degli IF il registro da visualizzare ma non funziona.Qualcuno sarebbe cosi gentile da darmi una dritta?Ciao a tutti! /******Visualizza sul display i punti del convertitore A/D******//* */#include<pic.h>#include<pic1687x.h>#include"delay.c"#include"lcd.c"unsigned int Vis_AD;main (void){ //Inizio routine MAIN TRISB0=0; //Pin 0 PORTB come LCD data 4. TRISB1=0; //Pin 1 PORTB come LCD data 5. TRISB2=0; //Pin 2 PORTB come LCD data 6. TRISB3=0; //Pin 3 PORTB come LCD data 7. TRISB4=0; //Pin 4 PORTB come Register select. TRISB5=0; //Pin 5 PORTB come Enable. TRISB7=0; TRISA=0x3F; //Tutta la PORTA come ingressi. DelayMs(100); //Serve per stabilizzare l'alimentazione dell'lcd. LCD_INIT(); //Inizializza LCD. DelayMs(100); //Piccolo ritardo dopo setup LCD. LCD_CLEAR(); //Cancella LCD. LCD_CMD(LCD_line1); //Scrivo sulla linea 1. LCD_PUTS("Punti Conv.="); //Scrivo stringa. ADCON1=0b10001110; /*Configura i PIN della PORTA, giustifica nella Word il dato della conversione A/D da Dx-Sx o Sx-Dx */ ADCON0=0b01000001; /*Imposta la frequenza di conversione A/D Fosc/8 seleziona l'ingresso RA0 come ing.Analog abilita il modulo di conversione A/D */ ADIF=0; //Cancella flag di interrupt A/D verificato ADIE=1; //Abilita interrupt x conversione A/D eseguita PEIE=1; GIE=1; //Abilita in modo globale gli interrupt ADGO=1; //Start alla conversione A/D for(; { Vis_AD=ADRESL; //Parte bassa del risultato Vis_AD=Vis_AD+(ADRESH<<8); //Parte alta del risultato if(Vis_AD<10){ //Scrive le unità a dx (0-9) LCD_GOTO(1,16); //Sposto il cursore (sovrascrivendo il valore di volta in volta) LCD_PUTUN(Vis_AD); //Visualizzo conteggio } if(Vis_AD>=10){ //Scrive le decine a sx (10-99) LCD_GOTO(1,15); //Sposto il cursore (sovrascrivendo il valore di volta in volta) LCD_PUTUN(Vis_AD); //Visualizzo conteggio } if(Vis_AD>=100){ //Scrive le centinaia a sx (100-999) LCD_GOTO(1,14); //Sposto il cursore (sovrascrivendo il valore di volta in volta) LCD_PUTUN(Vis_AD); //Visualizzo conteggio } if(Vis_AD>=1000){ //Scrive le migliaia a sx (100-9999) LCD_GOTO(1,13); //Sposto il cursore (sovrascrivendo il valore di volta in volta) LCD_PUTUN(Vis_AD); //Visualizzo conteggio } }} //Fine routine MAINstatic void interrupt timer (void){ if(ADIF=1) { ADIF=0; //Cancella flag di interrupt A/D verificato ADGO=1; //Start alla conversione A/D }}
ifachsoftware Inserita: 5 ottobre 2005 Segnala Inserita: 5 ottobre 2005 Non so che compilatore usi , comunque in C puoi usare la funzione unsigned int Valore;char Buff[5];Valore = 12;sprintf(Buff,"%04u",Valore);risultato in Buff = "0012"se invece fai sprintf(Buff,"%4u",Valore);risultato in Buff = " 12"Poi scrivi la stringa a partire dalla posizione scelta.N.B. controlla bene i parametri di sprintf che ho notato che con i pic possono variare da compilatore a compilatore , e misura i tempi di esecuzione che spesso anche con compilatori decenti sono piuttosto alti (naturalmente dipende dall'applicazione) , per esempio con i dsPIC ho fatto una scelta di questo tipo// 4Digit 6,4us [at] 120MHzvoid NumToDec4(unsigned int n,char *Buff,unsigned int StartPos){ Buff[startPos + 3] = (n % 10) + 48; n/=10; Buff[startPos + 2] = (n % 10) + 48; n/=10; Buff[startPos + 1] = (n % 10) + 48; n/=10; Buff[startPos ] = (n % 10) + 48; }Tale funzione convertiva un unsigned int in un numero di max. 4 caratteri con 0 fill a Sxper usarla unsigned int Valore;char Buff[5];Valore = 12;Buff[4] = '\0';NumToDec4(Valore,Buff,0);Ciao
sfinge Inserita: 5 ottobre 2005 Autore Segnala Inserita: 5 ottobre 2005 (modificato) Grazie ifachsoftware non sono esperto in prog. C potresti brevemente spiegarmi che effetto hanno queste istruzioni sul contenuto del registro che devo visualizzare?Ciao! Modificato: 5 ottobre 2005 da sfinge
sfinge Inserita: 6 ottobre 2005 Autore Segnala Inserita: 6 ottobre 2005 (modificato) Ma come avviene lo spostamento? Mi piacerebbe capire.Se la mia Var da visualizzare è Vis_ad alla fine cosa devo fare Vis_ad=Buff e poi spararlo sul display?Quale devo usare delle routine elencate e come lavorano?Scusami ma io sono alle prime armi con il C.P.S il compilatore è PICCLITE.Ciao Grazie! Modificato: 6 ottobre 2005 da sfinge
ifachsoftware Inserita: 6 ottobre 2005 Segnala Inserita: 6 ottobre 2005 unsigned int Vis_ad;char Buff[5];Buff[4] = '\0'; // Mi assicuro di avere la stringa terminata correttamenteVis_ad = 12; // Imposto per esempio come valore 12 , ma sara' il valore letto dall'A/D// Con questa funzione riempi il Buffer di caratteri Buff a partire dal carattere // per max 4 caratteri , mettendo degli 0 alla Sx del numero nel caso non // fossero impegnati.NumToDec4(Valore,Buff,0);print_lcd(Buff); // QUesta sara' la tua funzione (lo chiamata in questa maniera non conoscendo il PICC Lite , naturalmente dovrai chiamarla nel modo giusto , con i parametri corretti.Spero di essermi spiegatoCiao
RESNIC Inserita: 27 ottobre 2005 Segnala Inserita: 27 ottobre 2005 Buongiorno,Io ho un problema sempre con un 16x2 e probabilmente ho copiato con qualche modifica il File lcd.c che ho visto incluso sopra... ma purtroppo non vuole andare alla riga 2. La mia domanda è :Qual'è l'istruzione (comando) che il display deve vedere per andare alla riga 2 ?
sfinge Inserita: 28 ottobre 2005 Autore Segnala Inserita: 28 ottobre 2005 L'isrtuzione è:LCD_CMD(LCD_line2); //Scrivo sulla linea 2.Ciao!
RESNIC Inserita: 28 ottobre 2005 Segnala Inserita: 28 ottobre 2005 Ti ringrazio sfinge.... comunque ho risolto, il problema stava da un'altra parte!!!! Ciao
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora