Ler dado do RTC e enviar via SERIAL para o PC

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Ler dado do RTC e enviar via SERIAL para o PC

Mensagempor dedos » 25 Set 2008 18:49

Estou com problema em programar o RTC com o 8051, minha aplicação é:

- Inserir um tempo inicial no RTC (DS1307), isto já consegui via dado serial do microcontrolador 8051.
- Após o tempo inserido e o RTC estar rodando independentemente preciso ler os dados do RTC pelo 8051 a cada 1Hz.
- Ao ler o dado do RTC(DS1307) preciso enviar para o PC via RS-232 serial do 8051 o dado de Tempo e Data.

Não vou utilizar uma tela LCD, apenas um software supervisório no PC para ler este dado, exemplo Hyper Terminal

Se puderem me ajudar agradeço,

Obrigado!
dedos
Bit
 
Mensagens: 6
Registrado em: 18 Set 2008 21:20

Mensagempor Djalma Toledo Rodrigues » 25 Set 2008 19:26

Não entendi bem a finalidade, já que o PC tem data / hora interno
mas, você irá necessitar de um MAX232, ou equivalente, para compatilizar os
níveis de tensão da UART.
O mais é configurar a Serial do uC com uma velocidade compatível com uma das diversas
velocidades da UART do PC.
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor brasilma » 26 Set 2008 10:13

- Inserir um tempo inicial no RTC (DS1307), isto já consegui via dado serial do microcontrolador 8051.


Desconfio que não, o RTC é I2C e desconheço algum modo simples de "conversar" com ele pela serial.

Abaixo estão as rotininhas que uso para comunicação com o RTC, para entender como usá-las é interessante dar uma lida no data-sheet do 1307 para entender como ele funciona.

Não se esqueça que o formato dos dados nos registros dele é BCD.

;-------------| Rotina Le Byte do RTC |---------------
; R3 = Endereco no RTC da variavel a ser lida; A = Valor lido
READBYTEHEX: CLR EA
CALL DS1307START
MOV A,#DS1307W
CALL DS1307SEND
MOV A,R3
CALL DS1307SEND
CALL DS1307STOP
CALL DS1307DELAY ; DELAY FOR AN OPERATION
CALL DS1307START
MOV A,#DS1307R
CALL DS1307SEND
SETB LASTREAD
CALL DS1307READ
SETB EA
RET

;-------------| Rotina Escreve Byte no RTC |---------------
; R3 = Endereco no RTC da variavel a ser escrita; R2 = Variavel ajustada
WRITEBYTEHEX: CLR EA
CALL DS1307START
MOV A,#DS1307W
CALL DS1307SEND
MOV A,R3
CALL DS1307SEND
MOV A,R2
; MOV B,#0AH
; DIV AB
; SWAP A
; ADD A,B
CALL DS1307SEND
CALL DS1307STOP
SETB EA
RET

; **********************************************************
; Envia 1 byte ao RTC A = Byte a ser enviado
; **********************************************************
; Deve ser feita previamente a inicializacao do ponteiro do RTC
DS1307SEND: PUSH 04H
MOV R4,#8
CLR C
DS1307SENDL1: RLC A
CLR SDA
JNC DS1307SENDD1
SETB SDA
DS1307SENDD1: NOP
SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
CALL DS1307DELAY
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
DJNZ R4,DS1307SENDL1
SETB SDA ; SET SDA HIGH TO LOOK FOR
SCL_HIGH ; ACKNOWLEDGE PULSE
JNB SDA,DS1307SENDD2; CHECK FOR ACK OR NOT ACK
;SETB DS1307ERR ; SET ACKNOWLEDGE FLAG FOR ERROR

DS1307SENDD2: CALL DS1307DELAY ; DELAY FOR AN OPERATION
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
CALL DS1307DELAY ; DELAY FOR AN OPERATION
POP 04H
RET

; **********************************************************
; Le 1 byte do RTC
; **********************************************************

DS1307READ: PUSH 03H
MOV R3,#08H ; SET COUNTER FOR 8-BITS DATA
MOV A,#0
SETB SDA ; SET SDA HIGH TO ENSURE LINE FREE
DS1307READL1: SCL_HIGH ; TRANSITION SCL LOW-TO-HIGH
MOV C,SDA ; MOVE DATA BIT INTO CARRY
RLC A ; ROTATE CARRY-BIT INTO ACC.0
CLR SCL ; TRANSITION SCL HIGH-TO-LOW
DJNZ R3,DS1307READL1 ; LOOP FOR 8-BITS

JB LASTREAD,DS1307READD1 ; CHECK TO SEE IF THIS IS THE LAST READ
CLR SDA ; IF NOT LAST READ SEND ACK-BIT

DS1307READD1: SCL_HIGH ; PULSE SCL TO TRANSMIT ACKNOWLEDGE
CALL DS1307DELAY
CLR SCL ; OR NOT ACKNOWLEDGE BIT
POP 03H
RET

; **********************************************************
; Gera condicao START
; **********************************************************

DS1307START: SETB SDA ; Rotina START
SCL_HIGH
CLR SDA
CALL DS1307DELAY
CLR SCL
RET

; **********************************************************
; Gera condicao STOP
; **********************************************************

DS1307STOP: CLR SDA ; Rotina STOP
SCL_HIGH
SETB SDA
RET

; **********************************************************
; Delay
; **********************************************************

DS1307DELAY: MOV B,#08H ; DELAY FOR BUS TIMING
DJNZ B,$
RET
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Re: Ler dado do RTC e enviar via SERIAL para o PC

Mensagempor dedos » 30 Set 2008 22:46

Preciso enviar 6 bytes pela serial do 8051, porém os dois últimos bytes são dados de diferentes ports.
Exemplo:

Indicação de porta = Porta EQU P1.0
Luz EQU P2.1
Setb Porta
Setb Luz
Mov A,P1.0
Mov SBUFF,A
JNB TI,$

Como posso fazer para enviar o bit de dados da Porta e Luz que estão em ports diferentes?

Agradeço pela ajuda,

Obrigado!
dedos
Bit
 
Mensagens: 6
Registrado em: 18 Set 2008 21:20

Mensagempor brasilma » 01 Out 2008 08:16

Uai, carrega o SBUF com um dado e envia depois carrega com o outro e envia, não estou entendendo o problema???
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor jeanfernandes » 14 Out 2008 02:13

Se não me falha a memória,
o DS1307 tem uma saída de clock que voce pode ajustar para trigguer de 1 segundo....
Dai voce nao precisa usar um timer para ler o RTC e mandar os dados pela serial
Liga essa saida numa int. externa...que é batata.....
Interrompe na borda de descida .... e mandar o dado no SBUF...

A proposito....tente achar na Internet "The Final Word on 8051"...
o TI (sobe quando o dado eh transmitido) ...dai voce ja pode bimbar o SBUF de novo....(claro fazendo TI = 0 antes).....Ou entao compre o livro do Mauricio de Sá ...acho que oce vai entender mais da bagaça....

Nem li teu codigo ASM ...eheheheheh que (que C num programa em C?).....


:lol:
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor styg » 14 Out 2008 16:10

Poseh Brasilma quando que vai comecar a postar rotinas em C meu veio?
abraço
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor brasilma » 14 Out 2008 16:41

Ei Sty,

Aqui será dificil, deixa eu explicar, estou trabalhando com duas plataformas uma baseada no '51 em assembly, display LCD, 4 teclas, RTC (desenvolvida), e outra baseada em AVR em C, display GLCD, 16 teclas, RTC (em desenvolvimento).

Então dependendo da aplicação encaixo uma ou outra.

Minha intenção a principio era parar definitivamente com o '51, mas acabei percebendo que ainda não é possivel, ele resolve alguns problema$ como nenhum outro.

Abraços.
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra


Voltar para 8051

Quem está online

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

x