spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica di base > Arduino

Rispondi
 
Strumenti discussione Modalità  visualizzazioe
  #1  
Vecchio 13-01-2016, 00.26.55
888vita 888vita non è collegato
Robottaro senior
 
Data registrazione: 13-02-2015
Residenza: ITALIA
Messaggi: 53
Potenza reputazione: 22
888vita E' per ora ancora un mistero
Predefinito help DS1307 Maxim e memoria 24C32 Atmel

ciao ragazzi spero che qualcuno mi possa aiutare o un problema con DS1307 Maxim e memoria 24C32 Atmel carico il seguente sketchup che troverete sotto subito dopo i secondi cominciano a sballare
effettua un ciclo che parte da 09 secondi e arrivano a 59 secondi dopo
parte da 09 - 19 - 29 - 39 - 49 - 59 - 69 - 79 - 89 - 99 per poi ricominciare con 10 secondi e arrivare a 59 secondi
questo e alternato non capisco cosa sbaglio spero che qualcuno mi aiuti gentilmente grazie



#include "Wire.h"
#include <LiquidCrystal.h> //include la libreria per il funzionamento dell'lcd

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //settia le uscite di arduino per lcd
float tempC; //dichiarazione di variabile
int tempPin = 0; //inizializzazione del pin di Arduino

#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527

void setup(){
lcd.begin(16, 2); // setta del numero delle colonne e delle righe
Wire.begin();



Serial.begin(9600);
setDateTime(); //MUST CONFIGURE IN FUNCTION
}

void loop(){
printDate();
delay(100);
}

void setDateTime(){

byte second = 0; //0-59
byte minute = 54; //0-59
byte hour = 0; //0-23
byte weekDay = 2; //1-7
byte monthDay = 13; //1-31
byte month = 01; //1-12
byte year = 16; //0-99

Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator

Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));

Wire.write(zero); //start

Wire.endTransmission();

}

byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}

void printDate(){

// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);

int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());

//print the date EG 3/1/11 23:59:59
lcd.setCursor(0, 0); // setta il cursore sulla seconda riga al primo carattere
lcd.print(monthDay);
lcd.print("/");
lcd.print(month);
lcd.print("/");
lcd.print(year);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(hour);
lcd.print(":");
lcd.print(minute);
lcd.print(":");
lcd.print(second);

}
Rispondi citando
  #2  
Vecchio 13-01-2016, 08.36.07
L'avatar di SoldatoSemplice
SoldatoSemplice SoldatoSemplice non è collegato
Robottaro master
 
Data registrazione: 06-07-2009
Residenza: Roma
Età : 36
Messaggi: 263
Potenza reputazione: 132
SoldatoSemplice La sua reputazione è oltre la sua famaSoldatoSemplice La sua reputazione è oltre la sua famaSoldatoSemplice La sua reputazione è oltre la sua famaSoldatoSemplice La sua reputazione è oltre la sua famaSoldatoSemplice La sua reputazione è oltre la sua fama
Predefinito

Io non ho capito una sola parola.
Non hai messo un punto, od una virgola.
Cos'è un'affermazione od una domanda?
Rispondi citando
  #3  
Vecchio 13-01-2016, 10.29.32
888vita 888vita non è collegato
Robottaro senior
 
Data registrazione: 13-02-2015
Residenza: ITALIA
Messaggi: 53
Potenza reputazione: 22
888vita E' per ora ancora un mistero
Predefinito

Citazione:
Orginalmente inviato da SoldatoSemplice Visualizza messaggio
Io non ho capito una sola parola.
Non hai messo un punto, od una virgola.
Cos'è un'affermazione od una domanda?
ero di fretta.

Quando carico lo sketchup che hai visto mi da il problema hai secondi.

In questa seguenza.

I secondi iniziano da 9 e arriva a 59 secondi non arriva mai a 00.

Quando ricomincia vengono scritti in questa seguenza
09 - 19 - 29 - 39 - 49 - 59 - 69 - 79 - 89 - 99 .

per poi ricominciare con 10 secondi e arrivare a 59 secondi.

questo e alternato, cosa sbaglio?
Rispondi citando
  #4  
Vecchio 15-01-2016, 10.56.50
bernie bernie non è collegato
Robottaro sostenitore
 
Data registrazione: 24-07-2003
Messaggi: 628
Potenza reputazione: 82
bernie E' sulla buona strada
Predefinito

Mi verrebbe da dire che quando inizi a scrivere i secondi non cancelli il valore precedente , lo sovrascrivi solo , quindi quando passi da 59 secondi a 0 , potrebbe essere che sovrascrivi solo il primo carattere,( quello che precedentemente erano le decine ) mentre quello delle unità rimane invariato ( a 9 ) fino a che non arrivi a 10 , quindi li sovrascrivi entrambi .
Potresti provare a cancellare il display ogni volta prima di scriverlo
Rispondi citando
  #5  
Vecchio 15-01-2016, 14.49.15
888vita 888vita non è collegato
Robottaro senior
 
Data registrazione: 13-02-2015
Residenza: ITALIA
Messaggi: 53
Potenza reputazione: 22
888vita E' per ora ancora un mistero
Predefinito

Citazione:
Orginalmente inviato da bernie Visualizza messaggio
Mi verrebbe da dire che quando inizi a scrivere i secondi non cancelli il valore precedente , lo sovrascrivi solo , quindi quando passi da 59 secondi a 0 , potrebbe essere che sovrascrivi solo il primo carattere,( quello che precedentemente erano le decine ) mentre quello delle unità rimane invariato ( a 9 ) fino a che non arrivi a 10 , quindi li sovrascrivi entrambi .
Potresti provare a cancellare il display ogni volta prima di scriverlo
ok grazie o risolto inserendo il comando (lcd.clear ();.

volevo chiederti un'altro cosa che mi sfugge come faccio a mantenere l'ora e la data corretta?

la batterie e funzionante ma la data e l'ora si sballa una volta che spengo il pc
Rispondi citando
  #6  
Vecchio 17-01-2016, 11.46.56
bernie bernie non è collegato
Robottaro sostenitore
 
Data registrazione: 24-07-2003
Messaggi: 628
Potenza reputazione: 82
bernie E' sulla buona strada
Predefinito

Se sei sicuro che la batteria alimenta correttamente l'integrato ?
Io ho usato i moduli RTC per alcune cose , ma evito di mettere nello sketch il settaggio dell'ora , faccio uno sketch per settare data e ora , poi dopo carico lo sketch definitivo .
Nel caso che tu voglia aggiornare la data ogni volta che colleghi il tutto a un PC , in questo caso il mio sistema non va bene .
Quando spegni il PC , il circuito rimane alimentato ?
Non potrebbe essere che quando spegni il PC ti si resetta l'arduino e quando si rialimenta , rifa il ciclo e ricarica la "void setDateTime(){" ?
Aloha
Rispondi citando
  #7  
Vecchio 17-01-2016, 18.04.01
888vita 888vita non è collegato
Robottaro senior
 
Data registrazione: 13-02-2015
Residenza: ITALIA
Messaggi: 53
Potenza reputazione: 22
888vita E' per ora ancora un mistero
Predefinito

Citazione:
Orginalmente inviato da bernie Visualizza messaggio
Se sei sicuro che la batteria alimenta correttamente l'integrato ?
suppongo di si il mio modulo e il seguente



Citazione:
Orginalmente inviato da bernie Visualizza messaggio
Quando spegni il PC , il circuito rimane alimentato ?
no spengo il pc si spegne tutto anche l'arduino perche e alimentato con usb

Citazione:
Orginalmente inviato da bernie Visualizza messaggio
Non potrebbe essere che quando spegni il PC ti si resetta l'arduino e quando si rialimenta , rifa il ciclo e ricarica la "void setDateTime(){" ?

suppongo di no.

comunque o sostituito lo sketchup con il seguente inserendo anche il modulo DHT11

#define dht_dpin A0
byte bGlobalErr;
byte dht_dat[5];
#include "Wire.h"
#include <LiquidCrystal.h>
#define DS1307_ADDRESS 0x68 // Indirizzo dell'integrato DS1307
// come indicato nel datasheet
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte zero = 0x00;
struct tDataOra
{
byte second; //0-59
byte minute; //0-59
byte hour; //0-23
byte weekDay; //1-7
byte monthDay; //1-31
byte month; //1-12
byte year; //0-99
};

// Converte dalla notazione BCD alla notazione in base 10
byte bcdToDec(byte val)
{
// val % 16 => corrisponde ai 4 bit a destra di un byte
// (val - val % 16)/ 16 => corrisponde ai 4 bit a sinistra di un byte
// ovvero a shiftare verso destra di 4 bit quindi
// (val-val%16)/16 equivale a val >> 4
return ( (val-val%16)/16*10 + val%16 );
}

boolean getDateTime(void *V)
{
lcd.setCursor(0, 0);
tDataOra *D=(tDataOra *)V;
// inizializzo la trasmissione partendo
// dall'indirizzo 0x00
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

// requestFrom e' utilizzato dal master per richiedere
// n byte alle device slave. In questo caso ne richiede
// 7 bytes alla device con l'indirizzo indicato
// il DS1307 utilizza 56 bit (7byte) per registrare la data/ora
Wire.requestFrom(DS1307_ADDRESS, 7);
if (Wire.available())
{
D->second = bcdToDec(Wire.read());
D->minute = bcdToDec(Wire.read());
D->hour = bcdToDec(Wire.read() & 0b111111); // modo 24 ore
// considero i primi 6 bit
D->weekDay = Wire.read(); // non mi serve convertire (Range da 1 a 7 => 3 bit)
D->monthDay = bcdToDec(Wire.read());
D->month = bcdToDec(Wire.read());
D->year = bcdToDec(Wire.read());
return true;
}
return false;
}

void printShortDateTime(void *V)
{
char buffer[25]={
'\0' };
tDataOra *D=(tDataOra *)V;
sprintf(buffer, "%02d/%02d/20%02d %02d:%02d:%02d",
D->monthDay,D->month,D->year,
D->hour, D->minute, D->second);
lcd.println(buffer);
}

void printLongDateTime(void *V)
{
const char* days[] = {
"Domenica", "Lunedi'", "Martedi'", "Mercoledi'",
"Giovedi'", "Venerdi'", "Sabato" };
const char* months[] = {
"Gennaio", "Febbraio", "Marzo", "Aprile",
"Maggio", "Giugno", "Luglio", "Agosto",
"Settembre", "Ottobre", "Novembre", "Dicembre" };
char buffer[40]={
'\0' };
tDataOra *D=(tDataOra *)V;

sprintf(buffer, "%s, %u %s 20%2u %02u:%02u:%02u",
days[D->weekDay-1], D->monthDay, months[D->month-1],D->year,
D->hour, D->minute, D->second);
Serial.println(buffer);
}

void setup()
{
lcd.begin(16, 2);
Wire.begin(); // Si connette al bus i2c
Serial.begin(9600);

InitDHT(); // funsion definida mas abajo para claridad del código principal
Serial.begin(9600);
delay(300);
Serial.println("Humedad y Temperatura\n\n");
delay(700);
}

void loop()
{
lcd.setCursor(0, 0);
tDataOra *D = new tDataOra();
if (getDateTime(D))
{
printLongDateTime(D);
printShortDateTime(D);
}
else
Serial.println("Errore di lettura Data/ora");
delay(1000);

lcd.setCursor(0, 1);
ReadDHT(); //función definida mas abajo para claridad del código principal
switch (bGlobalErr){
case 0:
lcd.print("umid");
lcd.print(dht_dat[0], DEC);
Serial.print(".");
Serial.print(dht_dat[1], DEC);
lcd.print("% ");
lcd.print("Temp");
lcd.print(dht_dat[2], DEC);
Serial.print(".");
Serial.print(dht_dat[3], DEC);
lcd.print("C ");
break;
case 1:
Serial.println("Error 1: DHT start condition 1 not met.");
break;
case 2:
Serial.println("Error 2: DHT start condition 2 not met.");
break;
case 3:
Serial.println("Error 3: DHT Suma de comprobación Error.");
break;
default:
Serial.println("Error: Código no Reconocido.");
break;
}
delay(1000);
}

void InitDHT(){
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,HIGH);
}

void ReadDHT(){
bGlobalErr=0;
byte dht_in;
byte i;
digitalWrite(dht_dpin,LOW);
delay(20);

digitalWrite(dht_dpin,HIGH);
delayMicroseconds(40);
pinMode(dht_dpin,INPUT);
//delayMicroseconds(40);
dht_in=digitalRead(dht_dpin);

if(dht_in){
bGlobalErr=1;
return;
}
delayMicroseconds(80);
dht_in=digitalRead(dht_dpin);

if(!dht_in){
bGlobalErr=2;
return;
}
delayMicroseconds(80);
for (i=0; i<5; i++)
dht_dat[i] = read_dht_dat();
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,HIGH);
byte dht_check_sum =
dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
if(dht_dat[4]!= dht_check_sum)
{bGlobalErr=3;}
};

byte read_dht_dat(){
byte i = 0;
byte result=0;
for(i=0; i< 8; i++){
while(digitalRead(dht_dpin)==LOW);
delayMicroseconds(30);
if (digitalRead(dht_dpin)==HIGH)
result |=(1<<(7-i));
while (digitalRead(dht_dpin)==HIGH);
}
return result;
}




il problema persiste
Rispondi citando
  #8  
Vecchio 18-01-2016, 02.31.29
bernie bernie non è collegato
Robottaro sostenitore
 
Data registrazione: 24-07-2003
Messaggi: 628
Potenza reputazione: 82
bernie E' sulla buona strada
Predefinito

Scusa,ma io non capisco questa mentalità masochista,non ti funziona e invece di fare un codice semplice per provare le varie funzioni una alla volta li fai ancora più incasinato.
Inizia caricando un codice che solo imposta l'ora e la data nel RTC,poi senza scollegare niente carichi in codice che solo legge l'ora e la data e la stampi nel monitor, per il momento elimina LCD. Dopo di ciò scolleghi arduino dal pc aspetti 5 minuti e lo colleghi nuovamente e vai a vedere l'ora, se va bene proseguì, se non va bene bisogna capire se il problema è hw o sw.
Rispondi citando
  #9  
Vecchio 20-01-2016, 19.35.41
888vita 888vita non è collegato
Robottaro senior
 
Data registrazione: 13-02-2015
Residenza: ITALIA
Messaggi: 53
Potenza reputazione: 22
888vita E' per ora ancora un mistero
Predefinito

Citazione:
Orginalmente inviato da bernie Visualizza messaggio
Scusa,ma io non capisco questa mentalità masochista,non ti funziona e invece di fare un codice semplice per provare le varie funzioni una alla volta li fai ancora più incasinato.
Inizia caricando un codice che solo imposta l'ora e la data nel RTC,poi senza scollegare niente carichi in codice che solo legge l'ora e la data e la stampi nel monitor, per il momento elimina LCD. Dopo di ciò scolleghi arduino dal pc aspetti 5 minuti e lo colleghi nuovamente e vai a vedere l'ora, se va bene proseguì, se non va bene bisogna capire se il problema è hw o sw.

ok faccio come suggerito o trovato questo sketchup sembra funzionare solo che non riesco a capire come regolare l'ora e il giorno



/* -------------------------------------------------------
* Lettura un RTC con DS1307
* ------------------------------------------------------- */
#include "Wire.h"
#define DS1307_ADDRESS 0x68 // Indirizzo dell'integrato DS1307
// come indicato nel datasheet

byte zero = 0x00;
struct tDataOra
{
byte second; //0-59
byte minute; //0-59
byte hour; //0-23
byte weekDay; //1-7
byte monthDay; //1-31
byte month; //1-12
byte year; //0-99
};

// Converte dalla notazione BCD alla notazione in base 10
byte bcdToDec(byte val)
{
// val % 16 => corrisponde ai 4 bit a destra di un byte
// (val - val % 16)/ 16 => corrisponde ai 4 bit a sinistra di un byte
// ovvero a shiftare verso destra di 4 bit quindi
// (val-val%16)/16 equivale a val >> 4
return ( (val-val%16)/16*10 + val%16 );
}

boolean getDateTime(void *V)
{
tDataOra *D=(tDataOra *)V;
// inizializzo la trasmissione partendo
// dall'indirizzo 0x00
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

// requestFrom e' utilizzato dal master per richiedere
// n byte alle device slave. In questo caso ne richiede
// 7 bytes alla device con l'indirizzo indicato
// il DS1307 utilizza 56 bit (7byte) per registrare la data/ora
Wire.requestFrom(DS1307_ADDRESS, 7);
if (Wire.available())
{
D->second = bcdToDec(Wire.read());
D->minute = bcdToDec(Wire.read());
D->hour = bcdToDec(Wire.read() & 0b111111); // modo 24 ore
// considero i primi 6 bit
D->weekDay = Wire.read(); // non mi serve convertire (Range da 1 a 7 => 3 bit)
D->monthDay = bcdToDec(Wire.read());
D->month = bcdToDec(Wire.read());
D->year = bcdToDec(Wire.read());
return true;
}
return false;
}

void printShortDateTime(void *V)
{
char buffer[25]={
'\0' };
tDataOra *D=(tDataOra *)V;
sprintf(buffer, "%02d/%02d/20%02d %02d:%02d:%02d",
D->monthDay,D->month,D->year,
D->hour, D->minute, D->second);
Serial.println(buffer);
}

void printLongDateTime(void *V)
{
const char* days[] = {
"Domenica", "Lunedi'", "Martedi'", "Mercoledi'",
"Giovedi'", "Venerdi'", "Sabato" };
const char* months[] = {
"Gennaio", "Febbraio", "Marzo", "Aprile",
"Maggio", "Giugno", "Luglio", "Agosto",
"Settembre", "Ottobre", "Novembre", "Dicembre" };
char buffer[40]={
'\0' };
tDataOra *D=(tDataOra *)V;

sprintf(buffer, "%s, %u %s 20%2u %02u:%02u:%02u",
days[D->weekDay-1], D->monthDay, months[D->month-1],D->year,
D->hour, D->minute, D->second);
Serial.println(buffer);
}

void setup()
{
Wire.begin(); // Si connette al bus i2c
Serial.begin(9600);
}

void loop()
{
tDataOra *D = new tDataOra();
if (getDateTime(D))
{
printLongDateTime(D);
printShortDateTime(D);
}
else
Serial.println("Errore di lettura Data/ora");
delay(1000);
}
Rispondi citando
  #10  
Vecchio 21-01-2016, 09.44.38
L'avatar di marnic
marnic marnic non è collegato
Administrator
 
Data registrazione: 24-05-2002
Residenza: Monselice (PD)
Età : 57
Messaggi: 5,458
Potenza reputazione: 422
marnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua famamarnic La sua reputazione è oltre la sua fama
Predefinito

vado a memoria ma devi fermare l'orologio mettendo a zero (o 1 ma è scritto nel datasheet) un bit di un registro dopodichè vai a scrivere negli altri registri il valore relativo a ore giorni ecc.
Attenzione che il dato deve essere formattato in BCD ossia all'interno del byte hai 4 bit per le unità, 2 o 4 per le decine ecc. fai sempre riferimento al datasheet
__________________
Marnic
Roboitalia Staff
www.fabbrimarco.com
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalità  visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code è Attivato
Le smilies sono Attivato
[IMG] è Attivato
Il codice HTML è Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
Problema funzionamento ds1307 stecamux Arduino 27 09-03-2015 21.48.14
problemi grossi con time clock ds1307 e mikroC VILLO P. in C, C++ 0 26-09-2009 11.31.30
maxim 7300 dwz Elettronica 1 25-08-2005 13.59.44
maxim 4427 dwz Elettronica 5 02-12-2004 14.01.19
maxim rinux Forum generale 0 07-04-2003 16.20.00


Tutti gli orari sono GMT. Adesso sono le: 06.56.35.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB