Vai al contenuto
PLC Forum


Visualizzare Punti A/d - Shift Cifre


sfinge

Messaggi consigliati

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 MAIN

static void interrupt timer (void)

{

if(ADIF=1)

{

ADIF=0; //Cancella flag di interrupt A/D verificato

ADGO=1; //Start alla conversione A/D

}

}

Link al commento
Condividi su altri siti


ifachsoftware

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] 120MHz

void 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 Sx

per usarla

unsigned int Valore;

char Buff[5];

Valore = 12;

Buff[4] = '\0';

NumToDec4(Valore,Buff,0);

Ciao :)

Link al commento
Condividi su altri siti

:unsure: 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: da sfinge
Link al commento
Condividi su altri siti

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: da sfinge
Link al commento
Condividi su altri siti

ifachsoftware

unsigned int Vis_ad;

char Buff[5];

Buff[4] = '\0'; // Mi assicuro di avere la stringa terminata correttamente

Vis_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 spiegato

Ciao :)

Link al commento
Condividi su altri siti

  • 3 weeks later...

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 ?

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...