Ir ao conteúdo
  • Cadastre-se

Código para PIC 18F2550 + ds1307


Ir à solução Resolvido por ianfreitas,

Posts recomendados

Bom dia a todos! Estou estudando micro controladores pic, por conta própria. Consegui simular no proteus o LCD 16X2, com driver (lcd_flex),tentei montar o relógio para ser mostrado no lcd mais nada, será que alguém pode me dar uma ajuda, no código fonte (uso o compilador pcw) depois de muitas tentativas peço a ajuda, pelo menos tentei, vou tentar anexar a foto, me ajudem com o código fonte por favor, se possível aceito dicas de onde colocar botões de ajuste de horas minutos etc, afinal aprender nunca é demais. Desde já agradeço a todos que me ajudarem, pelo tempo e dedicação que foi investido a minha pessoa.:D

post-774153-13884963189856_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Estou tentando postar o arquivo e os códigos fontes para ver se mais algumas pessoas podem ajudar, eu realmente agradeço, pois já estou tentando há vários dias, agradeço ao colega “MatheusLPS” que me deu uma dica muito valiosa mais não consegui muitos avanços. A dica foi muito boa sou eu que não esta conseguindo fazer.:D

http://www.4shared.com/get/-MYVFuTW/CLUBE.html

Link para o comentário
Compartilhar em outros sites

Primeiramente desculpe demora na resposta. Estava de viagem.

O código do DS1307.C está lá no outro tópico. Mas reposto para você:


/// DS1307.C ///
/// Driver for Real Time Clock ///
/// ///
/// ds1307_init() - Enable oscillator without clearing the seconds register -///
/// used when PIC loses power and DS1307 run from 3V BAT ///
/// - Disable squarewave output ///
/// ///
/// ds1307_set_date_time(day,mth,year,dow,hour,mim,sec) Set the date/time ///
/// ///
/// ds1307_get_date(day,mth,year,dow) Get the date ///
/// ///
/// ds1307_get_time(hr,mim,sec) Get the time ///
/// ///
////////////////////////////////////////////////////////////////////////////////

#define RTC_SDA PIN_C4
#define RTC_SCL PIN_C3

#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
#use i2c(sda=PIN_C4, scl=PIN_C3, stream=I2C_HW)

BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

void ds1307_init(void)
{
BYTE seconds = 0;

i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_start();
i2c_write(0xD1); // RD from RTC
seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
i2c_stop();
seconds &= 0x7F;

delay_us(3);

i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x07); // Control Register
i2c_write(0x10); // Disable squarewave output pin
i2c_stop();

}

void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE mim, BYTE sec)
{
sec &= 0x7F;
hr &= 0x3F;

i2c_start();
i2c_write(0xD0); // I2C write address
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_write(bin2bcd(sec)); // REG 0
i2c_write(bin2bcd(mim)); // REG 1
i2c_write(bin2bcd(hr)); // REG 2
i2c_write(bin2bcd(dow)); // REG 3
i2c_write(bin2bcd(day)); // REG 4
i2c_write(bin2bcd(mth)); // REG 5
i2c_write(bin2bcd(year)); // REG 6
i2c_write(0x10); // REG 7 - Disable squarewave output pin
i2c_stop();
}

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x03); // Start at REG 3 - Day of week
i2c_start();
i2c_write(0xD1);
dow = bcd2bin(i2c_read() & 0x7f); // REG 3
day = bcd2bin(i2c_read() & 0x3f); // REG 4
mth = bcd2bin(i2c_read() & 0x1f); // REG 5
year = bcd2bin(i2c_read(0)); // REG 6
i2c_stop();
}

void ds1307_get_time(BYTE &hr, BYTE &mim, BYTE &sec)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_start();
i2c_write(0xD1);
sec = bcd2bin(i2c_read() & 0x7f);
mim = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read() & 0x3f);
i2c_stop();

}

BYTE bin2bcd(BYTE binary_value)
{
BYTE temp;
BYTE retval;

temp = binary_value;
retval = 0;

while(1)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(temp >= 10)
{
temp -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += temp;
break;
}
}

return(retval);
}


// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
BYTE temp;

temp = bcd_value;
// Shifting upper digit right by 1 is same as multiplying by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;

// Now return: (Tens * 8) + (Tens * 2) + Ones

return(temp + (temp >> 2) + (bcd_value & 0x0f));
}
////////////////////////////////////////////////////////////////////////////////

Para mudar para o 18F2550, apenas mude a primeira linha do código. Está para o 16F877A. Coloque 18F2550.

Veja que os pinos do 18F2550 são diferentes. Apenas mude de acordo com os que você tem sobrando.

EDIT:

Tenho o costume de entrar no fórum e abrir todas as postagens não lidas de uma vez. São muitas abas ao mesmo tempo! :D. Acaba que levo umas 2 horas para ler todas.. aí não vi sua última acima.

Acabei de ver sua postagem acima.

Vou dar uma olhada no código que você postou.

Falou

Link para o comentário
Compartilhar em outros sites

Desculpe a demora ao retornar, pois estava tentando Estudar as mudanças que você sugeriu.

MatheusLPS pode me tirar uma duvida? Baixei o projeto que você fez no anexo da pagina:

http://www.4shared.com/file/WFI6CE3C/DS1307_LM35_LCD_relogio.html

Funcionou muito bom. Ai vai a duvida tenho que ter os drives do ds1307 + o do LCD que foi utilizado no mesmo projeto que você usou?

No seu projeto você usa os sete pinos do LCD no meu eu uso só seis pode ser isso o porquê de estar dando errado. Se possível anexar o drive do LCD que você usou, por gentileza.

Também mudei o pic 18f2550, para o 18f4550 que tenho aqui.

Desde já agradeço sua ajuda

Falta muito pouco.

post-774153-13884963326335_thumb.jpg

Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...