oder ne RTC, hab mal n bissl an der SPI RTC-4553 getüftelt.
hier der Code:
Code:
'----------------------------------------------------------
' Programm initialisieren
'----------------------------------------------------------
'
' ACHTUNG JTAG per Fuse abschalten !!!!
'
' SPI RTC an MISO MOSI CS0 = PortC.7 CS1 = PortC.6 RW = PortC.5
' Habe noch SRF04 Ultraschallenfernungssensor an PortC.2 und PortC.3
' Ist nicht besonders elegant gecodet, aber kann ja je nach Bedarf
' eventbasierend individuell umgebaut werden.
'
' Nur zur Verdeutlicheung der Grundfunktionen der RTC-4553 Uhrenfunktion
$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200
Declare Function Ultrasonic() As Integer ' Funktionen deklarieren
Declare Function Spitransfer(byval Outbyte As Byte ) As Byte
Dim A As Byte ' variablen deklarieren
Dim I As Byte
Dim X As Byte
Dim Temp As Word
Dim Tempint As Integer
Dim Tempstr As String * 16
Enable Interrupts
Config Pinc.2 = Output
Config Pinc.3 = Input
Config Portc.5 = Output
Config Portc.6 = Output
Config Portc.7 = Output
' Konstanten deklarieren
Const Setyear = &B00001011
Const Setmonth = &B00001001
Const Setday = &B00000111
Const Sethour = &B00000100
Const Setminute = &B00000010
Rtcwr Alias Portc.5
Rtccs1 Alias Portc.6
Rtccs0 Alias Portc.7
Rtccs1 = 1
Rtccs0 = 0
' SPI konfigurieren und initialisieren
Config Spi = Hard , Interrupt = Off , Data Order = Lsb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
Spiinit
' RTC-4553 initialisieren
Rtcwr = 0
X = Spitransfer(&B00001111) 'c3 (Initialisierung)
X = Spitransfer(&B00011101) 'c1 (Initialisierung)
Rtcwr = 1
Do
Tempstr = ""
For A = &B00001100 To 0 Step -1 ' absteigende Reihenfolge
X = Spitransfer(a) ' sena Anfrage
X = Spitransfer(0) ' empfange Antwort
X = X And &B11110000
Shift X , Right , 4
Tempstr = Tempstr + Str(x) ' Zahlenwert in String umwandeln und an String anreihen
Next A
I = Inkey() ' UART abfragen
Select Case I ' Je nach Zeichen Funktion auslösen
Case &H79: ' wenn y
Rtcwr = 0
X = Spitransfer(setyear)
Rtcwr = 1
Case &H6D: ' wenn m
Rtcwr = 0
X = Spitransfer(setmonth)
Rtcwr = 1
Case &H64: ' wenn d
Rtcwr = 0
X = Spitransfer(setday)
Rtcwr = 1
Case &H68: ' wenn h
Rtcwr = 0
X = Spitransfer(sethour)
Rtcwr = 1
Case &H69: ' wenn i
Rtcwr = 0
X = Spitransfer(setminute)
Rtcwr = 1
End Select
Waitms 200
Print Tempstr ; " "; ' Ausgabe Datum und Uhrzeitstring
Tempint = Ultrasonic() ' Entfernung per SRF04 messen
Tempint = Tempint * 10 ' in cm umrechnen
Tempint = Tempint / 62
Print Tempint 'Enfernung ausgeben
Loop
End
Function Ultrasonic() As Integer
Portc.2 = 0
Pulseout Portc , 2 , 20
Pulsein Ultrasonic , Pinc , 3 , 1
End Function
Function Spitransfer(byval Outbyte As Byte) As Byte
Spdr = Outbyte ' SPI-Ausgabe
Do
Loop Until Spsr.spif = 1 ' Warten bis Byte raus ist
Spitransfer = Spdr ' Rückgabewert auslesen
End Function
End
Lesezeichen