Progetti

   

Tutorial

   

Servizi

   

Sponsor  

   
Benvenuto, Ospite
Nome utente: Password: Ricordami

ARGOMENTO: centralina irrigazione 16f877

centralina irrigazione 16f877 1 Mese 2 Settimane fa #1

  • graziano1985
  • Avatar di graziano1985
  • Offline
  • Junior Boarder
  • Messaggi: 21
  • Karma: 0
ciao a tutti , mi sto cimentando nella realizzazione di una centralina per irrigazione ,
utilizzo come RTC un DS1337, e fin qua tutto bene in linea di massima funziona.
ho letto nelle librerie (V 4.0.4 ) che i dati sono espressi in esadecimale quindi il problema sorge quando voglio impostare l'ora di attivazione dopo il 9 quindi 10 che in decimale diventa 16 e cosi per gli altri valori. di seguito il codice che sto usando:
 
unsigned int start = 0x00;  //variabile per i minuti attivazione irrigazione
unsigned int stop =0x00; //variabile per i minuti stop irrigazione
unsigned int orastart = 0x00; //variabile per le ore attivazione irrigazione
 
while(1){
 
        if (PORTBbits.RB0==0)
        {
        RTCC_increment_minutes ();
        delay_ms (150);
        }   
 
        if (PORTBbits.RB1==0)
        {
        RTCC_increment_hours ();
        delay_ms (300);
        }  
LCD_home();  
LCD_write_message("Time :  ");
LCD_write_string (RTCC_get_time_seconds());
 
LCD_goto_xy (1,2);
 
LCD_write_integer (orastart,3, ZERO_CLEANING_ON);  
 
LCD_write_integer (RTCC_get_hours(),2, ZERO_CLEANING_ON);  
     if (RTCC_get_hours()==orastart)
        {
 
        if ((RTCC_get_minutes()>=start)&&(RTCC_get_minutes()<=stop))
        {
 
        PORTAbits.RA0=1;
        }
        else 
        {
        PORTAbits.RA0=0;
        }                  
 

chi mi suggerisce una soluzione ??
grazie
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

centralina irrigazione 16f877 1 Mese 2 Settimane fa #2

  • firstcolle
  • Avatar di firstcolle
  • Offline
  • Platinum Boarder
  • Messaggi: 331
  • Ringraziamenti ricevuti 37
  • Karma: 4
Ciao, se non ricordo male, i valori vengono restituiti in BCD. il che significa che il valore esadecimale 0x16 non identifica il valore decimale 10 ma identifica il valore decimale 16.
nei byte codificati in BCD, i 4 bit alti identificano le decine, con valore da 0x00 a 0x90, e i 4 bit bassi identificano le unità. con valore da 0x00 a 0x09.

per scrivere il valore sul display ti conviene scrivere prima il valore delle decine e poi il valore delle unità. dovrebbe essere cosi:
unsinged char seconds = 0;
seconds = RTCC_get_time_seconds();
LCD_write_integer (seconds >>4, 1, ZERO_CLEANING_ON);  
LCD_write_integer (seconds & 0x0F, 1, ZERO_CLEANING_ON);  

ovviamente la stessa cosa vale se vuoi salvare l'orario nel DS1337: se vuoi scrivere le ore 10:30 devi inviare per le ore il valore esadecimale 0x10 e per i minuti il valore 0x30
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Powered by Forum Kunena
   
© LaurTec 2006-2015