TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: ferloy en 12 de Julio de 2011, 18:24:53
-
Hola, soy nuevo en este foro y necesito ayuda, ya que me he pasado más de 8 horas buscando como escribir y recibir datos de un reloj en tiempo real.
Les cuento:
Estoy trabajando con un modulo BIGPIC 5 de mikroelectronics, el cual, dentro de sus dispositivos, cuenta con un real time clock PCF 8583.
Resulta que lo necesito para hacer un reloj en un display de 7 segmentos, pero no sé hacer el programa para sacar los datos. La conexion es por I2C y nunca había trabajado con eso, lo unico que encuentro en internet es el codigo en assembler, por eso decidi inscribirme en este foro para ver si alguien me ayuda con el codigo en BASIC.
Yo trabajo con el microcode studio.
En la parte de trabajar con el 7 segmentos no tengo problema, solo me gustaria que me ayuden hasta tener la información (fecha, hora minuto segundo) en variables.
Saludos
-
Hola!
Tal vez esto sobre el DS1307 ( I (http://www.neoteo.com/ds1307-reloj-en-tiempo-real-con-18f2550) y II (http://www.neoteo.com/Article.aspx?briefUrl=ds1307-reloj-en-tiempo-real-con-18f2550&pgArt=2)) te ayude, o esto sobre el DS1337 (http://www.neoteo.com/ds1337-rtc-dos-alarmas-sin-cristal).
Al menos para que tengas una idea de cómo sacar los datos hacia las variables. Si bien no es el mismo RTC, tal vez pueda ser de utilidad por tratarse de I2C y BASIC.
Saludos!
Mario
-
PROGRAMADO CON PROTON IDE:
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Miguel Noe Garcia Perez *
'* Notice : Copyright (c) 2010 Iberica 2000 *
'* : All Rights Reserved *
'* Date : 05/05/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device = 16F877A ' Define el Micro a Utilizar
All_Digital = True ' Configura Puertos como dig.
XTAL = 4 ' Define velocidad resonador
PORTB_PULLUPS = ON ' Resistencia interna Activada
'DEFINICION DE VARIABLES, CONSTANTES Y PUERTOS I/O
'---------------------------------------------------------
'TRISA = $00 ' Define el Puerto A como salidas
TRISB = $FF ' Define el Puerto B como Entradas
TRISC = $FF ' Define el Puerto C como Entradas
TRISd = $00 ' Define el Puerto C como salidas
'************************************ reloj
Symbol CLK = PORTc.3
Symbol DTA = PORTc.7
Symbol RST = PORTc.6
symbol T1= PortA.0
symbol T2= PortA.1
symbol T3= PortA.2
symbol T4= PortA.3
symbol T5= PortA.4
symbol T6= PortA.5
Symbol Punto = Portd.7
Symbol Pul1= Portb.0
symbol Pul2= Portb.1
Symbol Pul3= Portb.2
symbol Pul4= Portb.3
Symbol Pul5= Portb.4
symbol Pul6= Portb.5
Symbol Pul7= Portb.6
symbol Pul8= Portb.7
dim Contador as byte
Dim Numero as dword
dim Unidades as dword
dim Decenas as dword
dim Centenas as dword
dim Millares as dword
dim UniMillar as dword
dim CenMillar as dword
dim Btnvar as byte
dim N As byte
'****************************** reloj *************************
Dim RTCCMD as Byte
Dim TEMP as Byte
Dim TEMP1 as Byte
Dim TIMEDATA[7] as Byte
Dim OLDSECONDS as Byte
Dim SECONDS as timedata#0
Dim MINUTES as timedata#1
Dim HOURS as timedata#2
Dim DATE as timedata#3
Dim MONTH as timedata#4
Dim DAY As Timedata#5
Dim YEAR as timedata#6
dim Seg as byte
' Clear Write Protect bit in control register of DS1302
Temp = $10
RTCCmd = %00111
Gosub DS1302_WRITE
Temp = $00
RTCCmd = $00
Gosub DS1302_WRITE
Temp = $80
RTCCmd = %00111
Gosub DS1302_READ
AGAIN:
Gosub DS1302_READ
'if seconds = 16 then seconds = 10
'if seconds = 10 then
' If oldseconds <> seconds Then n=0'Print at 1,1, "TIME ", Hex2 Hours,":",Hex2 Minutes,":",Hex2 Seconds
' at 2,1, "DATE ", Hex2 Date,"/",Hex2 Month,"/20",Hex2 Year
' At 3,1,$FE,$10,$FE,$10,$FE,$10,$FE,$10,"DAY ", hex2 Day
if seconds > 9 then seconds = seconds - 6
if seconds > 19 then seconds = seconds - 6
if seconds > 29 then seconds = seconds - 6
if seconds > 39 then seconds = seconds - 6
if seconds > 49 then seconds = seconds - 6
if Minutes > 9 then Minutes = Minutes - 6
if Minutes > 19 then Minutes = Minutes - 6
if Minutes > 29 then Minutes = Minutes - 6
if Minutes > 39 then Minutes = Minutes - 6
if Minutes > 49 then Minutes = Minutes - 6
if Hours > 9 then Hours = Hours - 6
if Hours > 19 then Hours = Hours - 6
Unidades = dig Seconds,0
Decenas = dig Seconds,1
centenas = dig Minutes,0
Millares = dig Minutes,1
UniMillar = Dig Hours,0
CenMillar = dig Hours,1
gosub Multiplexacion
'gosub DiaSemana
Gosub Pulsadores
Goto AGAIN
'******************************************* 1
Multiplexacion:
numero = Unidades
gosub Paso_a_7Segmento
low punto
HIGH T1
low T2
low T3
low T4
low T5
low T6
delayms 2
clear portd
delayms 1
'******************************************* 2
numero = decenas
gosub Paso_a_7Segmento
low T1
HIGH T2
low T3
low T4
low T5
low T6
'clear portd
delayms 2
clear portd
delayms 1
'******************************************* 3
'centenas = DIG contador,2
numero = centenas
gosub Paso_a_7Segmento
'low punto
high punto
low T1
low T2
HIGH T3
low T4
low T5
low T6
'clear portd
delayms 2
clear portd
delayms 1
'******************************************* 4
'Millares = DIG contador,3
numero = Millares
gosub Paso_a_7Segmento
low punto
low T1
low T2
low T3
high T4
low T5
low T6
'clear portd
delayms 2
clear portd
delayms 1
'******************************************* 5
numero = UniMillar
gosub Paso_a_7Segmento
high punto
low T1
low T2
low T3
low t4
high t5
low t6
delayms 1
'clear portd
delayms 1
'******************************************* 6
numero = cenMillar
gosub Paso_a_7Segmento
low punto
low T1
low T2
low T3
low t4
low t5
high t6
delayms 2
clear porta
delayms 2
clear portd
delayms 1
return
'*******************************************************************************
'********* transformacion a siete segmentos *********************************
'*******************************************************************************
Paso_a_7Segmento:
select case numero
case 0
portd =$3F
case 1
portd =$06
case 2
portd =$5B
case 3
portd =$4F
case 4
portd =$66
case 5
portd =$6D
case 6
portd =$7D
case 7
portd =$07
case 8
portd =$7F
case 9
portd =$67
case else
portd =$49
endselect
return
'-----------------------------------------------------------------------------------
' Write to DS1302 RTC
DS1302_WRITE:
High RST'______________________________5
Shout Dta, Clk, LSBFIRST, [%0\1,RTCCmd\5,%10\2,Temp\8]
Low RST
Return
'-----------------------------------------------------------------------------------
' Read from the DS1302
DS1302_READ:
High RST'__________________________6
Shout DTA, Clk, LSBFIRST, [%111111\6,%10\2]
oldseconds = seconds
Shin DTA, Clk, LSBPRE, [Seconds,Minutes,Hours,Date,Month,DAY,Year]
Low RST
Return
Pulsadores:
button pul1,0,255,250,Btnvar,0,Bp
goto Setup
Bp:
return
'Bp:
' button Pul2,0,255,250,Btnvar,0,cP
' decenas = decenas +1 :gosub decena
'Cp:
' button Pul3,0,255,250,Btnvar,0,DP
' inc Centenas:gosub centena
'Dp:
' button Pul4,0,255,250,Btnvar,0,Ep
' inc Millares:gosub Millar
'Ep:
' button pul5,0,255,250,Btnvar,0,Fp
' dec unidades :gosub unidad
'Fp:
' button Pul6,0,255,250,Btnvar,0,GP
' dec decenas :gosub decena: if Decenas < 0 then Decenas = 5
'Gp:
' button Pul7,0,255,250,Btnvar,0,HP
' dec Centenas:gosub centena: if centenas < 0 then centenas = 9
'Hp:
' button Pul8,0,255,250,Btnvar,0,IP
' dec Millares:gosub Millar: if millares < 0 then Millares = 5
'Ip: button star,0,255,250,Btnvar,0,Sp
' goto Contar
'Sp:
' return
Setup:
clear porta
gosub MultiMinutos
button Pul2,0,255,250,Btnvar,0,Seti
Minutes = Minutes +1 :if minutes >= 60 then minutes = 0
centenas = dig Minutes,0
Millares = dig Minutes,1
Seti:
button pul1,0,255,250,Btnvar,0,setup
gosub DS1302_WRITE
delayms 500
goto AGAIN
MultiMinutos:
numero = centenas
gosub Paso_a_7Segmento
'low punto
high punto
low T1
low T2
HIGH T3
low T4
low T5
low T6
'clear portd
delayms 2
clear portd
delayms 1
'******************************************* 4
'Millares = DIG contador,3
numero = Millares
gosub Paso_a_7Segmento
low punto
low T1
low T2
low T3
high T4
low T5
low T6
'clear portd
delayms 2
clear porta
delayms 1
return
-
Gracias marioguillote, la verdad es que habia visto esa informaciòn pero no podia acceder a la 2da pagina del tutorial, ahora vi algunas cosas que me pueden servir, pero aun no entiendo ya que está echo en otro programa no en microbasic y para otro reloj que tiene distintos registros y todo eso, mañana le preguntaré a un profesor, pero igual si alguien tiene algo para que pueda servir, por favor posteelo aqui.