- Messaggi: 1222
- Ringraziamenti ricevuti 104
AIUTO con PCF8563!
- StefA
-
Autore della discussione
- Moderatore
-
Less
Di più
12 Anni 7 Mesi fa - 12 Anni 7 Mesi fa #1
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
AIUTO con PCF8563! è stato creato da StefA
utilizzando la libreria di Mauro per PCF8563, non riesco a prendere nessuna delle varie variabili, mi funzionano solamente le funzioni che si trovano nel libro:
WriteVarLCD (get_time_RTCC ());
WriteVarLCD (get_date_RTCC ());
ad esempio compilando questo semplice codice...
ottengo come risultato le seguenti 3 schermate sul display della freedom II:
|Time: 02:57
|Date: 30/12/08
|Var:
|
|Int: 48 18 8
| 2 88 8
cosa sbaglio?
Inoltre volendo assegnare ad una variabile il dato, come ad esempio:
giorno = get_days_RTCC ();
che tipo di variabile deve essere giorno? (ammesso che si possa fare)
Grazie
Ste
WriteVarLCD (get_time_RTCC ());
WriteVarLCD (get_date_RTCC ());
ad esempio compilando questo semplice codice...
Code:
#include <p18f4550.h>
#include <portb.h>
#include <PCF8563.h>
//#include <PCF8563.c>
#define LCD_DEFAULT
#include <LCD_44780.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici
#define BT1 0b11100000
#define BT2 0b11010000
#define BT3 0b10110000
#define BT4 0b01110000
/******************************************/
// Prototipo di funzione
/******************************************/
void High_Int_Event (void);
//Interrupt vector per modalita' compatibile
#pragma code high_interrupt_vector = 0x08
void high_interrupt (void) {
// Salto per la gestione dell'interrupt
_asm GOTO High_Int_Event _endasm
}
#pragma code
/******************************************/
// Gestione Interrupt
/******************************************/
#pragma interrupt High_Int_Event
// Funzione per la gestione dell'interruzione
void High_Int_Event (void) {
// Indice per il ciclo di pausa
int i;
unsigned char button;
// Controllo che l'interrupt sia stato generato da PORTB
if (INTCONbits.RBIF == 1 ) {
//pausa filtraggio spike
delay_ms (30);
button = PORTB;
button = button & 0xF0;
// Controllo del tasto premuto
switch(button) {
case BT1 & BT3:
increment_minutes_RTCC ();
break;
case BT1 & BT4:
increment_hours_RTCC ();
break;
case BT2:
increment_years_RTCC ();
break;
case BT3:
increment_months_RTCC ();
break;
case BT4:
increment_days_RTCC ();
break;
}
// Resetto il flag d'interrupt per permettere nuove interruzioni
INTCONbits.RBIF = 0;
}
}
/******************************************/
// Programma Principale
/******************************************/
void main (void){
// Variabile per salvare il dato di ritorno
unsigned char data = 0;
unsigned int giornoInt = 0;
unsigned char giornoChar = 0;
unsigned char giorno3 = 0;
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi, RC1 come output
LATC = 0x00;
TRISC = 0b11111100;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
// Inizializza il modulo I2C a 400KHz @20MHz
OpenI2C(MASTER, SLEW_ON);
SSPADD = 12;
OpenLCD (20);
BacklightLCD (TURN_ON);
// Inizializzo la data
set_days_RTCC (0x30);
set_months_RTCC (0x12);
set_years_RTCC (0x08);
// Inizializzo l'ora
set_hours_RTCC (0x02);
set_minutes_RTCC (0x56);
set_seconds_RTCC (0x33);
// Abilita i resistori di pull-up sulla PORTB
EnablePullups();
// Abilito le interruzioni su PORTB
INTCONbits.RBIE = 1;
// Abilito modalita' compatibile (di default vale gia' 0)
RCONbits.IPEN = 0;
// Abilito l'interrupt globale
INTCONbits.GIE = 1;
// Abilito l'interrupt periferiche
INTCONbits.PEIE = 1 ;
// Ciclo infinito
while (1) {
HomeLCD();
ClearLCD();
WriteStringLCD ("Time : ");
WriteVarLCD (get_time_RTCC ());
Line2LCD ();
WriteStringLCD ("Date : ");
WriteVarLCD (get_date_RTCC ());
delay_ms(1000);
HomeLCD();
ClearLCD();
WriteStringLCD ("Var: ");
WriteVarLCD (get_days_RTCC ());
WriteStringLCD (" ");
WriteVarLCD (get_months_RTCC ());
WriteStringLCD (" ");
WriteVarLCD (get_years_RTCC ());
WriteStringLCD (" ");
Line2LCD ();
WriteVarLCD (get_hours_RTCC ());
WriteStringLCD (" ");
WriteVarLCD (get_minutes_RTCC ());
WriteStringLCD (" ");
WriteVarLCD (get_seconds_RTCC ());
WriteStringLCD (" ");
delay_ms(2000);
HomeLCD();
ClearLCD();
WriteStringLCD ("Int: ");
WriteIntLCD (get_days_RTCC (),2);
WriteStringLCD (" ");
WriteIntLCD (get_months_RTCC (),2);
WriteStringLCD (" ");
WriteIntLCD (get_years_RTCC (),2);
WriteStringLCD (" ");
Line2LCD ();
WriteIntLCD (get_hours_RTCC (),2);
WriteStringLCD (" ");
WriteIntLCD (get_minutes_RTCC (),2);
WriteStringLCD (" ");
WriteIntLCD (get_seconds_RTCC (),2);
WriteStringLCD (" ");
delay_ms(2000);
}
}
ottengo come risultato le seguenti 3 schermate sul display della freedom II:
|Time: 02:57
|Date: 30/12/08
|Var:
|
|Int: 48 18 8
| 2 88 8
cosa sbaglio?
Inoltre volendo assegnare ad una variabile il dato, come ad esempio:
giorno = get_days_RTCC ();
che tipo di variabile deve essere giorno? (ammesso che si possa fare)
Grazie
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Ultima Modifica 12 Anni 7 Mesi fa da StefA.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- StefA
-
Autore della discussione
- Moderatore
-
Less
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
12 Anni 7 Mesi fa - 12 Anni 7 Mesi fa #2
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Re: AIUTO con PCF8563!
dichiarando unsigned char anno diciamo che si riesce ad acquisire i vari dati, come ad esempio anno = get_years_RTCC ();
Il problema però rimane quando si vogliono visualizzare sul display LCD utilizzando la libreria di Mauro.
Se si fa WriteCharLCD(), mi stampa il carattere corrispondente a quel numero e se si fa WritrIntLCD() stampa il valore decimale di quel numero. Il fatto è che il numero..ad esempio 44 è decimale ma salvato come char, quindi io intendo 44 decimale, ma lo salva come 44 esadecimale; stampando l'Int visualizza 68 e stampando il Char stampa 'D'.
Come posso fare a visualizzare 44?
Un metodo che ho trovato è il seguente:
anno = get_years_RTCC();
sprintf(tempPrint,"%x",anno);
WriteStringLCD ("Anno: ");
WriteVarLCD(tempPrint);
dove le variabili sono dichiarate in questo modo:
unsigned char anno;
unsigned char tempPrint[3];
Però il compilatore mi da due warning che non sono belli per niente
Warning [2054] suspicious pointer conversion
Warning [2066] type qualifier mismatch in assignment
Mi sono stracomplicato la vita? Qualche anima pia conosce un metodo migliore?
Il problema però rimane quando si vogliono visualizzare sul display LCD utilizzando la libreria di Mauro.
Se si fa WriteCharLCD(), mi stampa il carattere corrispondente a quel numero e se si fa WritrIntLCD() stampa il valore decimale di quel numero. Il fatto è che il numero..ad esempio 44 è decimale ma salvato come char, quindi io intendo 44 decimale, ma lo salva come 44 esadecimale; stampando l'Int visualizza 68 e stampando il Char stampa 'D'.
Come posso fare a visualizzare 44?
Un metodo che ho trovato è il seguente:
anno = get_years_RTCC();
sprintf(tempPrint,"%x",anno);
WriteStringLCD ("Anno: ");
WriteVarLCD(tempPrint);
dove le variabili sono dichiarate in questo modo:
unsigned char anno;
unsigned char tempPrint[3];
Però il compilatore mi da due warning che non sono belli per niente

Warning [2054] suspicious pointer conversion
Warning [2066] type qualifier mismatch in assignment
Mi sono stracomplicato la vita? Qualche anima pia conosce un metodo migliore?
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Ultima Modifica 12 Anni 7 Mesi fa da StefA.
Si prega Accesso o Crea un account a partecipare alla conversazione.
12 Anni 7 Mesi fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: AIUTO con PCF8563!
Ciao SteFa,
mi ero scordato di questo Thread perche' non avevo messo il flag.
Non puoi scrivere direttamente sul display i valori ritornati per i singoli valori, perche' sono in formato BCD.
Per tale ragione ho creato le funzioni per la data e l'orario.
Se guardi il codice sorgente PCF8563.c puoi vedere come converto i valori in stringa.
Per sapere il valore di ritorno o tipo di una variabile fai sempre riferimento al file header .h, indipendentemente dalla libreria che usi. Questa settimana dovrei finire la nuova documentazione delle librerie tutto scritto per Doxigen...
Ovvero tramite browser puoi navigare tra la documentazione ti tutte le librerie LaurTec.
Saluti,
Mauro
mi ero scordato di questo Thread perche' non avevo messo il flag.
Non puoi scrivere direttamente sul display i valori ritornati per i singoli valori, perche' sono in formato BCD.
Per tale ragione ho creato le funzioni per la data e l'orario.
Se guardi il codice sorgente PCF8563.c puoi vedere come converto i valori in stringa.
Per sapere il valore di ritorno o tipo di una variabile fai sempre riferimento al file header .h, indipendentemente dalla libreria che usi. Questa settimana dovrei finire la nuova documentazione delle librerie tutto scritto per Doxigen...
Ovvero tramite browser puoi navigare tra la documentazione ti tutte le librerie LaurTec.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- StefA
-
Autore della discussione
- Moderatore
-
Less
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
12 Anni 7 Mesi fa #4
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Re: AIUTO con PCF8563!
ok, grazie.
La soluzione adottata da me è comunque una cosa fattibile o è proprio orrenda?
La soluzione adottata da me è comunque una cosa fattibile o è proprio orrenda?
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accesso o Crea un account a partecipare alla conversazione.
12 Anni 7 Mesi fa #5
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: AIUTO con PCF8563!
Ciao,
sprintf non e' inusuale che venga usata per convertire dati.
Unica cosa e' che potresti perdere in efficienza, cosa che nel caso in questione non credo sia un problema.
Se hai ottenuto lo scopo credo sia una soluzione pulita.
...aggiungi solo un commento che spiega la conversione e la scelta fatta.
Saluti,
Mauro
sprintf non e' inusuale che venga usata per convertire dati.
Unica cosa e' che potresti perdere in efficienza, cosa che nel caso in questione non credo sia un problema.
Se hai ottenuto lo scopo credo sia una soluzione pulita.
...aggiungi solo un commento che spiega la conversione e la scelta fatta.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, StefA
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti