AIUTO con PCF8563!

  • StefA
  • Autore della discussione
  • Moderatore
  • Moderatore
Di più
12 Anni 7 Mesi fa - 12 Anni 7 Mesi fa #1 da StefA
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...
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
  • Moderatore
Di più
12 Anni 7 Mesi fa - 12 Anni 7 Mesi fa #2 da StefA
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?

..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.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
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

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • StefA
  • Autore della discussione
  • Moderatore
  • Moderatore
Di più
12 Anni 7 Mesi fa #4 da StefA
Risposta da StefA al topic Re: AIUTO con PCF8563!
ok, grazie.
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.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
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

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiStefA

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi