Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale

Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale (http://forum.roboitalia.com/index.php)
-   Arduino (http://forum.roboitalia.com/forumdisplay.php?f=71)
-   -   help DS1307 Maxim e memoria 24C32 Atmel (http://forum.roboitalia.com/showthread.php?t=11030)

888vita 12-01-2016 23.26.55

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);

}

SoldatoSemplice 13-01-2016 07.36.07

Io non ho capito una sola parola.
Non hai messo un punto, od una virgola.
Cos'Ŕ un'affermazione od una domanda?

888vita 13-01-2016 09.29.32

Citazione:

Orginalmente inviato da SoldatoSemplice (Messaggio 72915)
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?

bernie 15-01-2016 09.56.50

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

888vita 15-01-2016 13.49.15

Citazione:

Orginalmente inviato da bernie (Messaggio 72919)
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

bernie 17-01-2016 10.46.56

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

888vita 17-01-2016 17.04.01

Citazione:

Orginalmente inviato da bernie (Messaggio 72933)
Se sei sicuro che la batteria alimenta correttamente l'integrato ?

suppongo di si il mio modulo e il seguente

http://i63.tinypic.com/15rin3d.jpg

Citazione:

Orginalmente inviato da bernie (Messaggio 72933)
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 (Messaggio 72933)
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

bernie 18-01-2016 01.31.29

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.

888vita 20-01-2016 18.35.41

Citazione:

Orginalmente inviato da bernie (Messaggio 72935)
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);
}

marnic 21-01-2016 08.44.38

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

888vita 24-01-2016 19.04.48

chi mi spiega questo?

quando carico il primo sketchup e regolo l'ora e la data e scollego l'Arduino l'ora rimane ferma,


primo sketchup

#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 = 30; //0-59
byte hour = 20; //0-23
byte weekDay = 2; //1-7
byte monthDay = 24; //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);

}



ma se regolo l'ora con il primo sketchup e subito dopo carico un il secondo sketchup l'ora e la data rimane memorizzata e continua a funzionare con la sua batteria tampone.


chi mi spiegate come mai?



questo e il secondo sketchup, non e mio lo trovato su internet


#include "Wire.h"
#define DS1307_ADDRESS 0x68
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
lcd.begin(16, 2);
Wire.begin();
Serial.begin(9600);
}

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

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);

byte zero = 0x00;
Wire.write(zero);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);
lcd.clear ();
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);
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);

}

bernie 25-01-2016 20.04.57

Penso che le ragioni potrebbero essere due ,
il primo sketch non riavvia l'orologio e quindi l'ora non cambia anche se viene memorizzata , quando carichi il secondo sketch riparte l'orologio

altra possibilitÓ , potrebbe essere che ti ricarica sempre l'ora e quindi tu non la vedi cambiare , ma se carichi il secondo ( che non scrive l'ora) va bene .

sergio_camici 27-01-2016 07.46.26

il ciclo loop del primo attende solo 100mS mentre nel secondo aspetta 1s, errore di battitura o Ŕ veramente cosý?
Non sarÓ che 100mS sono troppo pochi per reinterrogare il chip?


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

Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.