DINASTIA SOFT
Home Page
DS1302 por Flavio 
e-mailFormulario de consultasHome Page

 

Este ejemplo es donado por Atilio, un usuario de Bascom-8051.

Este programa lo estoy usando y anda muy bien si quieren mejorarlo no hay problemas.
Con respecto a la trampita el DS3102 es mañoso lo que pasa que el shiftout no queda con el flanco negativo cuando termina, lo que hace es que se va a positivo, entonces lo que ago chequeo cuando llega a ser cero y realizo una rotación, y un left 1 y listo.

Autor: flaviooscar@hotmail.com


Codigo:

'ESTA PROBADO CON UN AT89C52
'LAS CONECCIONES AL DS1302 (IO=P2.0) (RST=P2.1) (SCLK=P2.2)

$large
$baud = 9600
$crystal = 11059200

Dim B3 As Bit
Dim U1 As Byte , U2 As Byte , U3 As Byte , U4 As Byte , U5 As Byte , Gps(41) As Byte
Dim D1 As String * 1 , D2 As String * 5

Io Alias P2.0
Rst Alias P2.1
Sclk Alias P2.2

'segungos
' Const Rsec = &H81
' Const Wsec = &H80
'minutos
' Const Rmin = &H83
' Const Wmin = &H82
'horas
' Const Rhr = &H85
' Const Whr = &H84
'dia
' Const Rdate = &H87
' Const Wdate = &H86
'mes
' Const Rmonth = &H89
' Const Wmonth = &H88

' Const Rday = &H8B
' Const Wday = &H8A
'año
' Const Ryear = &H8D
' Const Wyear = &H8C

' Const Rcontrol = &H8F
' Const Wcontrol = &H8E

' Const Rtc = &H91
' Const Wtc = &H90

' Const Rcb = &HBF
' Const Wcb = &HBE


' Const Rram0 = &HC1
' Const Wram0 = &HC0


' Const Rramb = &HFF
' Const Wramb = &HFE


D2 = "" : U5 = 0

Largada:

Print "1=VER RELOJ"
Print "2=GRABAR DATOS AL RELOJ"

Do

U2 = Inkey()

Select Case U2

Case 49 :
Gosub Time
Goto Largada

Case 50 :
Gosub Seteo
Goto Largada

Return
End Select
Loop
End

'INGRESO LOS DATOS PARA SETEAR EL DS1302
Seteo:
Print "hhmmssddmmaaaa"

U5 = 0
Do
   U1 = Inkey()
   If U1 >= 48 And U1 <= 57 Then Gosub Lola1
   If U1 = 27 Then Goto Seteo1
Loop Until U1 = 13
If U5 < 14 Then Goto Salgo
Goto Save

Lola1:
INC u5
If U5 > 14 Then Goto Salgo
Gps(u5) = U1
Print Chr(u1);
Return

Save:
Print

Call Invierto

' ESTO ES EL CONTROL DE ERRORES POR SI PONES LETRAS EN LUGAR DE NUMEROS
For U1 = 1 To 14 Step 2
    U5 = U1 + 1
    D2 = Chr(gps(u1)) + Chr(gps(u5))
    U2 = Val(d2)
    Select Case U1
        'ss
        Case 1:
        If U2 > 59 Then Goto Salgo

        'mm
        Case 3:
        If U2 > 59 Then Goto Salgo

        'hh
        Case 5:
        If U2 > 23 Then Goto Salgo

        'dd
        Case 7:
        If U2 > 31 Or U2 = 0 Then Goto Salgo

        'mm
        Case 9:
        If U2 > 12 Or U2 = 0 Then Goto Salgo

        'año 20
        Case 11:
        If U2 <> 20 Then Goto Salgo

        'año 02
        Case 13:
        If U2 > 99 Or U2 < 0 Then Goto Salgo
   End Select
Next U1
Goto Hj

Salgo:
Print : Print "ERROR INTENTE NUEVAMENTE"
Goto Largada

'NO OLVIDAR QUE EL DS1302 LOS DATOS SE SETEAN CON BCD COMPACTADO
'CONVIERTO A BCD COMPACTADO

Hj:

For U5 = 1 To 13 Step 2
   U1 = Gps(u5) - 48
   Rotate U1 , Left , 4
   U3 = U5 + 1
   U2 = Gps(u3) - 48
   Gps(u5) = U1 Or U2
Next U5


'PROGRAMAR AL DS1302
'SETEO SS MM HH DD MM

U1 = 1
Restore Dta1
For U5 = 1 To 6
   Read U2
   Sclk = 0 : Rst = 0 : Rst = 1
   Shiftout Io , Sclk , U2 , 3
   Shiftout Io , Sclk , Gps(u1) , 3
   Rst = 0 : Sclk = 0
   U1 = U1 + 2
   If U5 = 5 Then U1 = U1 + 2
Next U5

'GPS(1)=HH
'GPS(3)=MM
'GPS(5)=SS
'GPS(7)=DD
'GPS(9)=MM
'GPS(11)=AA
'GPS(13)=AA

'leer a ds1302


Print "OK"

'LEO SEGUNDO MINUTO HORA DIA MES AÑO
'NO OLVIDAR QUE EL DS1302 ENTREGA BCD COMPACTADO

Time:
U4 = 1
Restore Dta2
For U5 = 1 To 6
   Read U2
   Sclk = 0 : Rst = 0 : Rst = 1
   Shiftout Io , Sclk , U2 , 3
   B3 = Io
   Shiftin Io , Sclk , U1 , 2
   Rst = 0 : Sclk = 0
   Rotate U1 , Left , 1
   If B3 = 1 Then
      U1 = U1 Or 1
   Else
      U1 = U1 And &HFE
   End If

   'CONVIERTO EL BCD COMPACTADO PARA PODER PASARLO A LOS DATOS ORIGINALES
   U3 = U1 And &H0F
   U3 = U3 + 48
   Rotate U1 , Right , 4
   U2 = U1 And &H0F
   U2 = U2 + 48
   Gps(u4) = U2
   U4 = U4 + 1
   Gps(u4) = U3
   inc u4
Next U5

Call Invierto


'COLOCO EN PANTALLA LOS DATOS CARGADOR
For U1 = 1 To 12 Step 2
   U3 = U1 + 1
   D2 = Chr(gps(u1)) + Chr(gps(u3))
   If U1 = 11 Then D2 = "20" + Chr(gps(u1)) + Chr(gps(u3))
   Print D2 ;
   If U1 = 1 Or U1 = 3 Then Print ":";
   If U1 = 5 Then Print " ";
   If U1 = 7 Or U1 = 9 Then Print "/";
Next U1

Seteo1:
Print
Print "FIN"
Return

'INVERTIR hhmmssddmmaaaa A ssmmhhddmmaaaa
Sub Invierto

   D2 = Chr(gps(1)) + Chr(gps(2)) + Chr(gps(5)) + Chr(gps(6))
   D1 = Mid(d2 , 1 , 1)
   Gps(5) = Asc(d1)
   D1 = Mid(d2 , 2 , 1)
   Gps(6) = Asc(d1)
   D1 = Mid(d2 , 3 , 1)
   Gps(1) = Asc(d1)
   D1 = Mid(d2 , 4 , 1)
   Gps(2) = Asc(d1)

End Sub


'DIRECCIONES PARA LA GRABACION DEL DATO
Dta1:
Data &H80 , &H82 , &H84 , &H86 , &H88 , &H8C

'DIRECCIONES PARA LA LECTURA DEL DATO
Dta2:
Data &H81 , &H83 , &H85 , &H87 , &H89 , &H8D

Bajar Archivo DS1302.ZIP

Consultas al autor: flaviooscar@hotmail.com

 

 Dinastia Soft Copyright 1997-2002 Todos los derechos reservados