Ajuda ds1307 + lcd + 16f877

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Ajuda ds1307 + lcd + 16f877

Mensagempor jrmaceio » 21 Set 2009 13:09

Sou iniciante e estou com problemas, não encontro o erro no codigo abaixo.
Na simulação do proteus ele mostra no display mas nao puxa a data e a hora do ds1307.

Código Mikroc

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections


// Software I2C connections
sbit Soft_I2C_Scl at RC3_bit;
sbit Soft_I2C_Sda at RC4_bit;
sbit Soft_I2C_Scl_Direction at TRISC3_bit;
sbit Soft_I2C_Sda_Direction at TRISC4_bit;
// End Software I2C connections

unsigned short horas,minuto,segundo;
unsigned short dia, mes, ano, dia_semana;
unsigned short var1, var2;
char *texto;

// Rotina de conversão de dados para BCD
void BCD(unsigned short lin, unsigned short col,unsigned short var) {
var1= (var >> 4) + 0x30; //converte o primeiro nibble em BCD e após em string
LCD_Chr(lin,col,var1);//escreve caractere no LCD
var2= (var & 0x0F) + 0x30; //converte o segundo nibble em BCD e após isso, em string
LCD_Chr_Cp(var2); //escreve caractere no LCD
}

void leitura_rtc() { //rotina de leitura do DS1307
I2C1_Init(100000);
I2C1_Start(); //inicializa comunicação i2c
I2C1_Wr(0xD0); //end fixo para DS1307: 1101000X, onde x = 0 é para gravação
I2C1_Wr(0); //end onde começa a programação do relógio, end dos segundos.
I2C1_Repeated_Start(); //Issue I2C signal repeated start
I2C1_Wr(0xD1); //end fixo para DS1307: 1101000X, onde x=1 é para leitura
segundo= I2C1_Rd(1); //lê o primeiro byte(segundos),informa que continua lendo
minuto= I2C1_Rd(1); //lê o segundo byte(minutos)
horas= I2C1_Rd(1); //lê o terceiro byte(horas)
dia_semana= I2C1_Rd(1);
dia= I2C1_Rd(1);
mes= I2C1_Rd(1);
ano= I2C1_Rd(0); //lê o sétimo byte(ano),encerra as leituras de dados
I2C1_Stop(); //finaliza comunicação I2C
}

void grava_rtc(){
I2C1_Init(100000);//iniciliza I2C com frequencia de 100KHz
I2C1_Start(); //inicializa a comunicação I2c
I2C1_Wr(0xD0); //end fixo para DS1307: 1101000X, onde x = 0 é para gravação
I2C1_Wr(0); //end onde começa a programação do relógio, end dos segundos.
I2C1_Wr(0x04); //inicializa com 04 segundos.
I2C1_Wr(0x12); //inicializa com 12 minutos.
I2C1_Wr(0x09); //inicializa com 09:00hs (formato 24 horas).
I2C1_Wr(0x03); //inicializa com terça
I2C1_Wr(0x17); //inicializa com dia 17
I2C1_Wr(0x04); //inicializa com mês 04
I2C1_Wr(0x07); //inicializa com ano 07
I2C1_Stop(); //finaliza comunicação I2C
}

void encontra_dia_semana() {
switch (dia_semana) {
case 01: texto= "DOMINGO"; break; //caso dias_semana = 01 então..
case 02: texto= "SEGUNDA"; break; //caso dias_semana = 02 então..
case 03: texto= "TERCA"; break; //caso dias_semana = 03 então..
case 04: texto= "QUARTA"; break; //caso dias_semana = 04 então..
case 05: texto= "QUINTA"; break; //caso dias_semana = 05 então..
case 06: texto= "SEXTA"; break; //caso dias_semana = 06 então..
default: texto= "SABADO"; //se não for nenhum desses então...
}
}

void display_lcd() {
lcd_cmd(_lcd_clear); //apaga lcd
Lcd_Out(1,1,"(Hora)");
BCD(1,7,horas); //conversão da variável horas para BCD
LCD_Chr_Cp(':'); //escreve no display LCD
BCD(1,10,minuto); //conversão da variável minuto para BCD
LCD_Chr_Cp(':'); //escreve no display LCD
BCD(1,13,segundo); //conversão da variável segundo para BCD
Lcd_Out(2,1,"(Data)");
BCD(2,7,dia); //conversão da variável dia para BCD
LCD_Chr_Cp('/'); //escreve no display LCD
BCD(2,10,mes); //conversão da variável mes para BCD
LCD_Chr_Cp('/'); //escreve no display LCD
BCD(2,13,ano); //conversão da variável ano para BCD
encontra_dia_semana();
Lcd_out(3,1,texto); //mostra dia da semana
}

void main(){
PORTE = 0xFF;
TRISE = 0x0F; // PORTE is input
PORTB = 0;
TRISB = 0; // PORTB is output
TRISD=0;
PORTD=0;
TRISC=0;
PORTC=0;
adcon1= 0x06; //torna todos os pinos AD como i/o de uso geral

Lcd_Cmd(_Lcd_CLEAR); //apaga display
Lcd_Cmd(_Lcd_CURSOR_OFF); //desliga cursor
grava_rtc();

while(1){
display_lcd(); //escreve no display lcd o valor
leitura_rtc(); //efetua leitura de segundo, minuto e horas do DS1307
delay_ms(200); //delay de 200 milisegundos
}
}


proteus :

Imagem
jrmaceio
Bit
 
Mensagens: 9
Registrado em: 03 Abr 2009 14:29

Mensagempor Alesandro F Zagui » 21 Set 2009 19:46

Isso nao deve resolver seu problema, mas faça a leitura do RTC antes de atualizar o LCD.
Alesandro Freire Zagui
Alesandro F Zagui
Byte
 
Mensagens: 154
Registrado em: 12 Mai 2009 11:03
Localização: Campo Mourao, Pr

Mensagempor Andre_Cruz » 21 Set 2009 21:13

jrmaceio,

Na rotina "leitura_rtc" você passa o parametro para os segundos os minutos as horas o dia ... o parametro 1.

Código: Selecionar todos
segundo= I2C1_Rd(1); //lê o primeiro byte(segundos),informa que continua lendo
minuto= I2C1_Rd(1); //lê o segundo byte(minutos)
horas= I2C1_Rd(1); //lê o terceiro byte(horas)
dia_semana= I2C1_Rd(1);
dia= I2C1_Rd(1);
mes= I2C1_Rd(1);
ano= I2C1_Rd(0); //lê o sétimo byte(ano),encerra as leituras de dados


Não programo no MicroC, mas não deveria ser parametro 1 a função ler o primeiro byte, parametro 2 para a função ler o segundo byte ?
É apenas uma observação, posso estar enganado.

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor jrmaceio » 22 Set 2009 08:51

Esta rotina eu encontrei na internet em outro forum e a pessoa dizia que estava funcionando só queria fazer uma mudança no laço de atualização do display. Mas aqui não está funcionando, vamos ver se alguém descobre o que pode ser, obrigado os que analisaram.
jrmaceio
Bit
 
Mensagens: 9
Registrado em: 03 Abr 2009 14:29

Mensagempor fabim » 22 Set 2009 09:00

coloca o analizador I2C na linha DT CK, veja se esta transitando dados, se não tiver.
Das duas uma.
Ou o mikroC ta com droga estragada, e por proteção esta defecando o codigo, ou o proteus esta defecado...

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor jrmaceio » 23 Set 2009 10:33

Refiz o codigo e está funcionando certinho, obrigado a todos.
jrmaceio
Bit
 
Mensagens: 9
Registrado em: 03 Abr 2009 14:29


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x