Boa tarde,

Estou tentando fazer um projeto de datalogger, utilizando um display LCD 16x4, um DS1307 e um ethernet Shield Wiznet 5100.

Consigo gravar no cartao sem o LCD, e consigo exibir no LCD sem o cartao.

Quando apenas acrescento a biblioteca do SD na programação do LCD, o LCD para de funcionar.

Já alterei toda a pinagem do LCD para não interferir, mas não sei por qual motivo, quando coloco o INCLUDE do SD, o display para de funcionar.

estou ligando o LCD nos pinos 3, 5, 6, 7, 8 e 9 conforme trecho abaixo:

#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal.h>


LiquidCrystal lcd(9, 8, 7, 6, 5, 3);

Alguém sabe o que eu poderia fazer para funcionar?

Agradeço desde já

Exibições: 785

Responder esta

Respostas a este tópico

Coloque o código completo

eu costumo fazer com guias, entao:

-----------------------------GUIA: MAIN------------------------------

#include <SD.h>
#include <Wire.h> // Para a EEPROM 24LC256 DS1621 DS1307 e dispositivos i2c
#include <LiquidCrystal.h>


// Data atual do relógio
unsigned int atual_seg=0;
unsigned int atual_min=0;
unsigned int atual_hora=0;
unsigned int atual_dia=0;
unsigned int atual_mes=0;
unsigned int atual_ano=0;
unsigned int atual_contrato=0;

float entrada_r = 0; // variable to store the value coming from the sensor
float entrada_s = 0;
float entrada_t = 0;

int lcd_refresh = 0;

void setup(void)
{
config_serial_rtc();
config_lcd();
config_sd();
}

void loop()
{
rtc();
relogio_lcd();
medicao();

lcd_refresh++;
if (lcd_refresh >= 10)
{
lcd_refresh = 0;
medicao_lcd();
}

delay(50);
}

-----------------------------GUIA: LCD------------------------------

LiquidCrystal lcd(9, 8, 7, 6, 5, 3);


void config_lcd (void)
{
// set up the LCD's number of columns and rows:
lcd.begin(16, 4);

lcd.setCursor(0, 1);
lcd.print("Fase R:");

lcd.setCursor(-4, 2);
lcd.print("Fase S:");

lcd.setCursor(-4, 3);
lcd.print("Fase T:");
}

void relogio_lcd (void)
{
lcd.setCursor(0, 0);
lcd.print(atual_dia / 10);

lcd.setCursor(1, 0);
lcd.print(atual_dia % 10);

lcd.setCursor(2, 0);
lcd.print("/");

lcd.setCursor(3, 0);
lcd.print(atual_mes / 10);

lcd.setCursor(4, 0);
lcd.print(atual_mes % 10);

lcd.setCursor(5, 0);
lcd.print("/");

lcd.setCursor(6, 0);
lcd.print(atual_ano / 10);

lcd.setCursor(7, 0);
lcd.print(atual_ano % 10);

lcd.setCursor(8, 0);
lcd.print(" - ");

lcd.setCursor(11, 0);
lcd.print(atual_hora / 10);

lcd.setCursor(12, 0);
lcd.print(atual_hora % 10);

lcd.setCursor(13, 0);
lcd.print(":");

lcd.setCursor(14, 0);
lcd.print(atual_min / 10);

lcd.setCursor(15, 0);
lcd.print(atual_min % 10);

}

void medicao_lcd (void)
{
lcd.setCursor(8, 1);
lcd.print(entrada_r);

lcd.setCursor(15, 1);
lcd.print("V");

lcd.setCursor(4, 2);
lcd.print(entrada_s);

lcd.setCursor(11, 2);
lcd.print("V");

lcd.setCursor(4, 3);
lcd.print(entrada_t);

lcd.setCursor(11, 3);
lcd.print("V");
}

-----------------------------GUIA: MEDICAO------------------------------

int r_Pin = A0; // select the input pin for the potentiometer
int s_Pin = A1;
int t_Pin = A2;

float entrada_r_ant = 0; // variable to store the value coming from the sensor
float entrada_s_ant = 0;
float entrada_t_ant = 0;

float calib = 100;
float v_bits = 0.004887586; // 5V / 1023 Bits

void config_medicao (void)
{

}

void medicao (void)
{
// read the value from the sensor:
entrada_r = analogRead(r_Pin);
entrada_s = analogRead(s_Pin);
entrada_t = analogRead(t_Pin);


entrada_r = entrada_r * v_bits;
entrada_r = entrada_r * calib;
entrada_r = ( (entrada_r_ant * 3) + entrada_r ) / 4;
entrada_r_ant = entrada_r;

entrada_s = entrada_s * v_bits;
entrada_s = entrada_s * calib;
entrada_s = ( (entrada_s_ant * 3) + entrada_s ) / 4;
entrada_s_ant = entrada_s;

entrada_t = entrada_t * v_bits;
entrada_t = entrada_t * calib;
entrada_t = ( (entrada_t_ant * 3) + entrada_t ) / 4;
entrada_t_ant = entrada_t;
}

-----------------------------GUIA: SD------------------------------

File dataFile;
char filename_ant;
const int chipSelect = 4;

void config_sd (void)
{

Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(10, OUTPUT);

// see if the card is present and can be initialized:
if (!SD.begin(chipSelect))
{
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
}

void datalogger (void)
{

char filename[] = "20xxxxxx.txt";
filename[2] = atual_ano/10 + 0x30;
filename[3] = atual_ano%10 + 0x30;
filename[4] = atual_mes/10 + 0x30;
filename[5] = atual_mes%10 + 0x30;
filename[6] = atual_dia/10 + 0x30;
filename[7] = atual_dia%10 + 0x30;

dataFile = SD.open(filename, FILE_WRITE);
}

-----------------------------GUIA: RTC------------------------------

//Rotinas para ds1307


// Define ajuste do relógio
unsigned int AJUSTE_SEGUNDO = 0;
unsigned int AJUSTE_MINUTO = 0;
unsigned int AJUSTE_HORA = 0;
unsigned int AJUSTE_DIA = 0;
unsigned int AJUSTE_MES = 0;
unsigned int AJUSTE_ANO = 0;
unsigned int AJUSTE_DIA_SEMANA = 0;

// Data inicial do CONTRATO
unsigned int INI_SEG = 0;
unsigned int INI_MIN = 0;
unsigned int INI_HORA = 0;
unsigned int INI_DIA = 1;
unsigned int INI_MES = 1;
unsigned int INI_ANO = 0;
unsigned int ini_contrato=0;

// Data final do CONTRATO
unsigned int FIN_SEG = 0;
unsigned int FIN_MIN = 0;
unsigned int FIN_HORA = 0;
unsigned int FIN_DIA = 1;
unsigned int FIN_MES = 1;
unsigned int FIN_ANO = 0;
unsigned int fin_contrato=0;


//// Data atual do relógio
//unsigned int atual_seg=0;
//unsigned int atual_min=0;
//unsigned int atual_hora=0;
//unsigned int atual_dia=0;
//unsigned int atual_mes=0;
//unsigned int atual_ano=0;
//unsigned int atual_contrato=0;


#define DS1307_I2C_ID 0x68 // ID no bus i2c do RTC ds1307

// Mascaras para aceder aos registos
#define DS1307_CLOCKHALT 0x80
#define DS1307_LO_BCD 0x0F
#define DS1307_HI_BCD 0xF0
#define DS1307_HI_SEG 0x70
#define DS1307_HI_MIN 0x70
#define DS1307_HI_HR 0x30
#define DS1307_LO_DdS 0x07
#define DS1307_HI_DMES 0x30
#define DS1307_HI_MES 0x30
#define DS1307_HI_ANO 0xF0

// Aten�ao que estes pr�ximos valores n�o s�o os valores definidos no _RTC, s�o mais Offsets
#define DS1307_SEG 0 // Definir o valor offset, segundos
#define DS1307_MIN 1 // Definir o valor offset, minutos
#define DS1307_HR 2 // Definir o valor offset, horas
#define DS1307_DdS 3 // Definir o valor offset, dia da semana (tr3s claro)
#define DS1307_DMES 4 // Definir o valor offset, dia do m�s
#define DS1307_MTH 5 // Definir o valor offset, m�s
#define DS1307_ANO 6 // Definir o valor offset, ano

#define DS1307_BASE_ANO 0 // Base do ano, se quisermos definir 2033 por exemplo, s� temos de dizer que � o ano 33

int rtc_bcd[7]; // Este array vai receber os valores do ds1307 em BCD


void config_serial_rtc (void)
{
Serial.begin(9600); // Valor pequeno mas bom, eu gosto assim :D
Wire.begin(); // Iniciar liga��es i2c - IMPORTANT�SSIMO
while (! Serial); // Wait untilSerial is ready - Leonardo
menu();
calcula_datas_contrato();
}

void rtc (void)
{
atualiza_relogio();
ajusta_relogio();
}


// Rotinas de Relogio - GZ ***********************************************************************
void calcula_datas_contrato(void)
{
ini_contrato = ( ( INI_ANO * 512 ) + ( INI_MES * 32 ) + INI_DIA );
fin_contrato = ( ( FIN_ANO * 512 ) + ( FIN_MES * 32 ) + FIN_DIA );
}

void calcula_data (void)
{
atual_contrato = ( ( atual_ano * 512 ) + ( atual_mes * 32 ) + atual_dia );
}

void atualiza_relogio (void)
{
int rtc[7];
ds1307get(rtc,true);

atual_ano = rtc[DS1307_ANO];
atual_mes = rtc[DS1307_MTH];
atual_dia = rtc[DS1307_DMES];

atual_hora = rtc[DS1307_HR];
atual_min = rtc[DS1307_MIN];
atual_seg = rtc[DS1307_SEG];

calcula_data();
}


// ********************************************************************************************

// Rotinas de serial do relogio

void menu (void)
{
Serial.println("****************** MENU ******************");
Serial.println(" ");
Serial.println("Digite '1' para exibir relogio e contrato");
Serial.println("Digite '2' para ajustar relogio");
Serial.println("Digite '3' para ajustar contrato inicial");
Serial.println("Digite '4' para ajustar contrato final");
Serial.println("Digite '0' para ajuda");
Serial.println(" ");
Serial.println("******************************************");
}

void help (void)
{
Serial.println(" ZANENG ");
Serial.println(" Projetos e Servicos ");
Serial.println(" ");
Serial.println("****************** HELP ******************");
Serial.println(" ");
Serial.println("Digite '2 DD MM AA hh mm ss' para ajuste");
Serial.println("DD = Dia (usar 2 numeros)");
Serial.println("MM = Mes (usar 2 numeros)");
Serial.println("AA = Ano (usar 2 numeros)");
Serial.println("hh = Hora (usar 2 numeros)");
Serial.println("mm = Minuto (usar 2 numeros)");
Serial.println("ss = Segundo (usar 2 numeros)");
Serial.println(" ");
Serial.println("******************************************");
Serial.println(" ");
menu();
}


void ajusta_relogio (void)
{
if (Serial.available())
{
char ch = Serial.read();

if (ch == '1')
{
Serial.println(" ");
exibe_relogio();
exibe_contrato();

// menu();
}
if (ch == '0')
{
help();
// menu();
}

if (ch == '2')
{
AJUSTE_ANO = atual_ano;
AJUSTE_MES = atual_mes;
AJUSTE_DIA = atual_dia;;
AJUSTE_HORA = atual_hora;
AJUSTE_MINUTO = atual_min;
AJUSTE_SEGUNDO = atual_seg;

// help();

Serial.println(" ");

char ch_ajuste = Serial.read(); // espaço


ch_ajuste= Serial.read();
unsigned int dia_10 = ch_ajuste; // dia 1x

ch_ajuste= Serial.read();
unsigned int dia_1 = ch_ajuste; // dia x1


ch_ajuste= Serial.read(); // espaço

ch_ajuste= Serial.read();
unsigned int mes_10 = ch_ajuste; // mes 1x

ch_ajuste= Serial.read();
unsigned int mes_1 = ch_ajuste; // mes x1


ch_ajuste= Serial.read(); // espaço

ch_ajuste= Serial.read();
unsigned int ano_10 = ch_ajuste; // ano 1x

ch_ajuste= Serial.read();
unsigned int ano_1 = ch_ajuste; // ano x1


ch_ajuste= Serial.read(); // espaço

ch_ajuste= Serial.read();
unsigned int hora_10 = ch_ajuste; // hora 1x

ch_ajuste= Serial.read();
unsigned int hora_1 = ch_ajuste; // hora x1


ch_ajuste= Serial.read(); // espaço

ch_ajuste= Serial.read();
unsigned int min_10 = ch_ajuste; // min 1x

ch_ajuste= Serial.read();
unsigned int min_1 = ch_ajuste; // min x1


ch_ajuste= Serial.read(); // espaço

ch_ajuste= Serial.read();
unsigned int seg_10 = ch_ajuste; // seg 1x

ch_ajuste= Serial.read();
unsigned int seg_1 = ch_ajuste; // seg x1


unsigned int dia = ( (dia_10 - 0x30) * 10) + (dia_1 - 0x30);
unsigned int mes = ( (mes_10 - 0x30) * 10) + (mes_1 - 0x30);
unsigned int ano = ( (ano_10 - 0x30) * 10) + (ano_1 - 0x30);
unsigned int hora = ( (hora_10 - 0x30) * 10) + (hora_1 - 0x30);
unsigned int minuto = ( (min_10 - 0x30) * 10) + (min_1 - 0x30);
unsigned int seg = ( (seg_10 - 0x30) * 10) + (seg_1 - 0x30);

Serial.print("erros: ");

if ( (dia >=1) && (dia <=31) )
AJUSTE_DIA = dia;
else
Serial.print("dia, ");

if ( (mes >=1) && (mes <=12) )
AJUSTE_MES = mes;
else
Serial.print("mes, ");

if ( (ano >=0) && (ano <=99) )
AJUSTE_ANO = ano;
else
Serial.print("ano, ");

if ( (hora >=0) && (hora <=23) )
AJUSTE_HORA = hora;
else
Serial.print("hora, ");

if ( (minuto >=0) && (minuto <=59) )
AJUSTE_MINUTO = minuto;
else
Serial.print("min, ");

if ( (seg >=0) && (seg <=59) )
AJUSTE_SEGUNDO = seg;
else
Serial.print("seg ");


Serial.print(".");
Serial.println(" ");
ds1307setup(); // Se for a primeira vez que o RTC � iniciado/ligado esta chamada � necess�ria para o RTC come�ar a contar

atualiza_relogio();
exibe_relogio();

// menu();
}

if (ch == '3')
{
// Serial.println(" ");
// Serial.println("Digite '2 DD MM AA' para ajuste");
// Serial.println("DD = Dia (usar 2 numeros)");
// Serial.println("MM = Mes (usar 2 numeros)");
// Serial.println("AA = Ano (usar 2 numeros)");
// Serial.println(" ");
Serial.println("************ CONTRATO INICIAL ************");

char ch_ajuste = Serial.read(); // espaço


ch_ajuste= Serial.read();
unsigned int dia_10 = ch_ajuste; // dia 1x

ch_ajuste= Serial.read();
unsigned int dia_1 = ch_ajuste; // dia x1


ch_ajuste= Serial.read(); // espaço

ch_ajuste= Serial.read();
unsigned int mes_10 = ch_ajuste; // mes 1x

ch_ajuste= Serial.read();
unsigned int mes_1 = ch_ajuste; // mes x1


ch_ajuste= Serial.read(); // espaço

ch_ajuste= Serial.read();
unsigned int ano_10 = ch_ajuste; // ano 1x

ch_ajuste= Serial.read();
unsigned int ano_1 = ch_ajuste; // ano x1


unsigned int dia = ( (dia_10 - 0x30) * 10) + (dia_1 - 0x30);
unsigned int mes = ( (mes_10 - 0x30) * 10) + (mes_1 - 0x30);
unsigned int ano = ( (ano_10 - 0x30) * 10) + (ano_1 - 0x30);

Serial.print("erros: ");

if ( (dia >=1) && (dia <=31) )
INI_DIA = dia;
else
Serial.print("dia, ");

if ( (mes >=1) && (mes <=12) )
INI_MES = mes;
else
Serial.print("mes, ");

if ( (ano >=0) && (ano <=99) )
INI_ANO = ano;
else
Serial.print("ano ");


Serial.print(".");
Serial.println(" ");

calcula_datas_contrato();
exibe_contrato();

// menu();
}

if (ch == '4')
{
// Serial.println(" ");
// Serial.println("Digite '2 DD MM AA' para ajuste");
// Serial.println("DD = Dia (usar 2 numeros)");
// Serial.println("MM = Mes (usar 2 numeros)");
// Serial.println("AA = Ano (usar 2 numeros)");
// Serial.println(" ");

Serial.println("************* CONTRATO FINAL *************");

char ch_ajuste = Serial.read(); // espaço


ch_ajuste= Serial.read();
unsigned int dia_10 = ch_ajuste; // dia 1x

ch_ajuste= Serial.read();
unsigned int dia_1 = ch_ajuste; // dia x1


ch_ajuste= Serial.read(); // espaço

ch_ajuste= Serial.read();
unsigned int mes_10 = ch_ajuste; // mes 1x

ch_ajuste= Serial.read();
unsigned int mes_1 = ch_ajuste; // mes x1


ch_ajuste= Serial.read(); // espaço

ch_ajuste= Serial.read();
unsigned int ano_10 = ch_ajuste; // ano 1x

ch_ajuste= Serial.read();
unsigned int ano_1 = ch_ajuste; // ano x1


unsigned int dia = ( (dia_10 - 0x30) * 10) + (dia_1 - 0x30);
unsigned int mes = ( (mes_10 - 0x30) * 10) + (mes_1 - 0x30);
unsigned int ano = ( (ano_10 - 0x30) * 10) + (ano_1 - 0x30);

Serial.print("erros: ");

if ( (dia >=1) && (dia <=31) )
FIN_DIA = dia;
else
Serial.print("dia, ");

if ( (mes >=1) && (mes <=12) )
FIN_MES = mes;
else
Serial.print("mes, ");

if ( (ano >=0) && (ano <=99) )
FIN_ANO = ano;
else
Serial.print("ano ");

Serial.print(".");
Serial.println(" ");

calcula_datas_contrato();
exibe_contrato();

// menu();
}
}
}

void exibe_relogio (void)
{
Serial.println(" ");
Serial.println("**************** RELOGIO *****************");
Serial.print(atual_dia, DEC); // Dia
Serial.print("/"); // ...
Serial.print(atual_mes, DEC); // Mes
Serial.print("/"); // ...
Serial.print(atual_ano); // Ano
Serial.print(" - "); // ...
Serial.print(atual_hora, DEC); // Horas
Serial.print(":"); // ...
Serial.print(atual_min, DEC); // Minutos
Serial.print(":"); // ...
Serial.println(atual_seg, DEC); // Segundos
}

void exibe_contrato (void)
{
Serial.println("*************** CONTRATO *****************"); // Contrato
Serial.print("Inicial: "); // inicial:
Serial.print(INI_DIA, DEC); // Dia
Serial.print("/"); // ...
Serial.print(INI_MES, DEC); // Mes
Serial.print("/"); // ...
Serial.print(INI_ANO); // Ano
Serial.print(" calc: "); // inicial:
Serial.println(ini_contrato); // ...

Serial.print(" Final: "); // inicial:
Serial.print(FIN_DIA, DEC); // Dia
Serial.print("/"); // ...
Serial.print(FIN_MES, DEC); // Mes
Serial.print("/"); // ...
Serial.print(FIN_ANO); // Ano
Serial.print(" calc: "); // inicial:
Serial.println(fin_contrato); // ...

Serial.print("Relogio: "); // ...
Serial.print(atual_dia, DEC); // Dia
Serial.print("/"); // ...
Serial.print(atual_mes, DEC); // Mes
Serial.print("/"); // ...
Serial.print(atual_ano); // Ano
Serial.print(" calc: "); // inicial:
Serial.println(atual_contrato); // ...
Serial.println(" "); // ...
}
// ********************************************************************************************


void ds1307setup(void) // Acertar tudo no rel�gio e inici�-lo
{
ds1307stop();
ds1307set(DS1307_SEG,AJUSTE_SEGUNDO); // Altera estes valores e quiseres iniciar o RTC com outra data
ds1307set(DS1307_MIN,AJUSTE_MINUTO);
ds1307set(DS1307_HR,AJUSTE_HORA);
ds1307set(DS1307_DdS,AJUSTE_DIA_SEMANA);
ds1307set(DS1307_DMES,AJUSTE_DIA);
ds1307set(DS1307_MTH,AJUSTE_MES);
ds1307set(DS1307_ANO,AJUSTE_ANO);
ds1307start();
}

void ds1307read(void) // Esta fun��o pede os dados ao ds1307, recebos em BCD e actualiza o array rtc_bcd
{
Wire.beginTransmission(DS1307_I2C_ID);
Wire.write(0x00);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ID, 7); // Pedir 7 bytes: segs, min, hr, dsem, dmes, mes, ano.
for(byte i=0; i<7; i++)rtc_bcd[i]=Wire.read(); // Guardar dados no array
}

void ds1307save(void) // Fun�ao para guardar os dados que est�o no array no ds1307
{
Wire.beginTransmission(DS1307_I2C_ID);
Wire.write(0x00); // Fazer reset ao ponteiro interno do ds1307
for(byte i=0; i<7; i++)Wire.write(rtc_bcd[i]); // Gravar os "ditos cujos"
Wire.endTransmission();
}

void ds1307get(int *rtc, boolean refresh) // Adquire os dados do array rtc_bcd e converte-os para int, se pretendido, actualiza o array.
{
if(refresh) ds1307read();
for(byte i=0;i<7;i++)rtc[i]=ds1307get(i, 0); // Percorre cada elemento do array e actualiza-o
}

int ds1307get(byte c, boolean refresh) // Adquire cada elemento da data, retorna esse valor como int e actualiza o array se pedido
{
if(refresh) ds1307read();
int v=-1; // Se der "fezes" tem de retornar um valor absurdo...
switch(c)
{
case DS1307_SEG:
v=(10*((rtc_bcd[DS1307_SEG] & DS1307_HI_SEG)>>4))+(rtc_bcd[DS1307_SEG] & DS1307_LO_BCD);
break;

case DS1307_MIN:
v=(10*((rtc_bcd[DS1307_MIN] & DS1307_HI_MIN)>>4))+(rtc_bcd[DS1307_MIN] & DS1307_LO_BCD);
break;

case DS1307_HR:
v=(10*((rtc_bcd[DS1307_HR] & DS1307_HI_HR)>>4))+(rtc_bcd[DS1307_HR] & DS1307_LO_BCD);
break;

case DS1307_DdS:
v=rtc_bcd[DS1307_DdS] & DS1307_LO_DdS;
break;

case DS1307_DMES:
v=(10*((rtc_bcd[DS1307_DMES] & DS1307_HI_DMES)>>4))+(rtc_bcd[DS1307_DMES] & DS1307_LO_BCD);
break;

case DS1307_MTH:
v=(10*((rtc_bcd[DS1307_MTH] & DS1307_HI_MES)>>4))+(rtc_bcd[DS1307_MTH] & DS1307_LO_BCD);
break;

case DS1307_ANO:
v=(10*((rtc_bcd[DS1307_ANO] & DS1307_HI_ANO)>>4))+(rtc_bcd[DS1307_ANO] & DS1307_LO_BCD)+DS1307_BASE_ANO;
break;
}
return v;
}

void ds1307set(byte c, byte v) // Actualiza o array e o ds1307
{
switch(c)
{
case DS1307_SEG:
if(v<60 && v>-1) // Desta forma consegue-se manter o clock actual
{
byte state=rtc_bcd[DS1307_SEG] & DS1307_CLOCKHALT;
rtc_bcd[DS1307_SEG]=state | ((v / 10)4) + (v % 10);
}
break;

case DS1307_MIN:
if(v<60 && v>-1)rtc_bcd[DS1307_MIN]=((v / 10)4) + (v % 10);
break;

case DS1307_HR:
// TODO : AM/PM 12HR/24HR
if(v<24 && v>-1) rtc_bcd[DS1307_HR]=((v / 10)4) + (v % 10);
break;

case DS1307_DdS:
if(v<8 && v>-1)rtc_bcd[DS1307_DdS]=v;
break;

case DS1307_DMES:
if(v<=31 && v>-1)rtc_bcd[DS1307_DMES]=((v / 10)4) + (v % 10);
break;

case DS1307_MTH:
if(v<13 && v>-1)rtc_bcd[DS1307_MTH]=((v / 10)4) + (v % 10);
break;

case DS1307_ANO:
if(v<130 && v>-1)rtc_bcd[DS1307_ANO]=((v / 10)4) + (v % 10);
break;
}

ds1307save();
}

void ds1307stop(void) // Parar o ds1307
{
rtc_bcd[DS1307_SEG]=rtc_bcd[DS1307_SEG] | DS1307_CLOCKHALT;
ds1307save();
}

void ds1307start(void) // Comecar o ds1307
{
rtc_bcd[DS1307_SEG]=0;
ds1307save();
}

Boa tarde!

Me deparei com a mesma situação algumas semanas atrás. Eu estava usando um arduino Uno com ATMEGA 328. Depois de pesquisar um pouco descobri que o problema estava na quantidade insuficiente de memoria RAM disponivel para a execucao do codigo. Ao compilar o codigo a tela de mensagem me mostrava que restavam menos de 500 bytes para execução do programa completo. Ao remover a biblioteca SD o programa voltava a funcionar normalmente.

O que acontece: durante a execucao o heap cresce do inicio para o fim e a pilha cresce do final para o começo da memória. Quando há poucos bytes disponiveis corre-se o risco de em algum momento a pilha e o heap crescerem alem do espaco disponivel e se "atravessarem" violando e alterando dados indevidamente. O efeito disso é o software ficar todo maluco e imprevisivel.

De uma olhada no artigo:

http://br-arduino.org/2015/06/arduino-progmem-sram.html.

La tem uma explicacao detalhada sobre o assunto e alguns metodos de programacao que podem resolver o problema.

No meu caso a unica solucao foi subtituir o arduino por outro que tinha maior quantidade de memoria RAM como por exemplo o Teensy ou o arduino Mega.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço