Vai al contenuto
PLC Forum


Rtc Con M41T00/ Ds1307 Problema Visualizzazione E Impostazione


ic910

Messaggi consigliati

Salve a tutti stò cerando di implementare ad un mio progetto un riferimento temporale. Ho cercato inizialmente di utilizzare come RTC un M41T00 compatibile con il DS1307 .

Con M41T00 sono riuscito a far visualizzare sul diplay sia i minuti e secondi ,tutti e 2 avanzano senza problemi e si incrementano.

Il problema si è presentato con le ore i giorni il mese e l'anno i quali vengono visualizzati in maniera errata.

Inoltre un ulteriore problema e l'impostazione iniziale del RTC che non riesco a eseguire .

Attualmente ho anche a disposizione un modulo con RTC ds 1307 potrei abbandonare anche M41t00 e passare al DS1307.

Sotto vi posto il listato compilato tramite porton ide speriamo di risolvere insieme la problematica Grazie.

Device = 16F877
Xtal 4
Config CP_OFF, DEBUG_OFF, WRT_OFF, CPD_OFF, LVP_ON, BODEN_OFF, PWRTE_ON, WDT_OFF, XT_OSC

TRISD=0

TRISC= %10111000

Declare LCD_Interface 8
Declare LCD_DTPin PORTD.0 'collegamento diplay a 8 bit tutta la porta d
Declare LCD_RSPin PORTC.0
Declare LCD_RWPin PORTC.1
Declare LCD_ENPin PORTC.2
Declare LCD_Lines 2
PORTC.1=0

Declare SDA_Pin PORTC.4
Declare SCL_Pin PORTC.3
Declare Slow_Bus 0 'rallenta la velocità del bus quando si utilizzano quanzi superiori a 4 Mhz
Declare bus_scl On 'elimina la necessità di mettere una pull-up sull scl
Declare Hbus_Bitrate 100 ' velocità standard 100 Khz


Dim GP_Loop As Byte 'serve per contare il bit della variabile
Dim Convert As Byte ' valore convertito da BCD a BIN o BIN a BCD
Dim Temp_Convert As Byte ' Temp_Converter variabile per bcd - bin routines



Dim RTC [8] As Byte 'dichiarazione array

Dim secondi As RTC#0
Dim minuti As RTC#1
Dim ore As RTC#2
Dim day As RTC#3 'giorni della settimana da 1-7
Dim giorno_mese As RTC#4 'giorni del mese da 1-31
Dim mese As RTC#5
Dim anno As RTC#6
Dim control As RTC#7 'registro di control




Symbol trasmissione = %11010000 'come si può notare l'ultimo bit a destra è 0 significa scrivi su RTC
Symbol ricezione = %11010001 'come si può notare l'ultimo bit a destra è 1 significa leggi dal RTC

secondi=%00000000 'corrisponde a decimale 0
minuti=%00000100 'corrisponde a decimale 4
ore=%00000111 'corrisponde a decimale 7
day=%00000110 ' corisponde a decimale 6 indica Sabato
giorno_mese =%00001110 'corrisponde a decimale 14
mese=%00000010 'corrisponde a deciamle 2 indica febbraio
anno=%00001111 'corrisponde a numero deciamle 15 indica 2015
control=%00000000 'registro di controllo


For GP_Loop = 0 To 7 'tramite questo ciclo di For faccio convertire tutti gli 8 indici dell array
Convert = RTC[GP_Loop]
GoSub BIN_BCD
RTC[GP_Loop] = Convert
Next GP_Loop
GoSub Scrittura_RTC

GoTo main

'*******************************************************************************************
aggiornamento:


GoSub Lettura_RTC 'lettura RTC

For GP_Loop = 0 To 7 'ciclo for da 0 a 7 per associare i gli 8 BCD letti alla variabile convert
Convert = RTC[GP_Loop] 'uguaglia le 8 array una per una a alla variabile convert per poi mandarle in conversione
GoSub BCD_BIN 'manda alla routine di conversione dal BCD al binario
RTC[GP_Loop] = Convert '
Next GP_Loop
Return


'************************************************************************************************************************
Lettura_RTC:

HBStart
HBusIn ricezione,0, [str RTC]
HBStop
Return
'***********************************************************************************************************************
Scrittura_RTC:
HBStart
HBusOut trasmissione,0,[str RTC]
HBStop
Return
'***************************************************************************************************************************


main:

GoSub aggiornamento

'ore= ore & %00111111 'ho fatto questo and per escludere il bit 6 e 7 del registro 2 potevano darmi problemi sulla visualizzazione

Print $fe, 1, Dec2 giorno_mese, "/", Dec2 mese , "/" , Dec2 anno, '$fe,1 è equivalente a cls vedere pag 326 del manuale proton
Print At 2,1, " ", Dec2 ore, ":", Dec2 minuti, ":", Dec2 secondi 'Hex2 comando per visualizzare in esa solo 2 cifre

DelayMS 500 ' Ritardo di 500 mS
GoTo main '

'******************************************************************************************************************************
BCD_BIN:

Temp_Convert = Convert & $F0
Swapf Temp_Convert , 1
Temp_Convert = Temp_Convert * 10
Convert = Convert & $0F
Convert = Convert + Temp_Convert

'prende in considerazione (digit alto ) perchè $F0 equivale in binario a 11110000
'di conseguenza facendo AND passera solo il digit alto perchè nella logica AND 1 1 =1
'avendo gli 0 sul digit basso del $F0 non passeranno
'l'Alto nibble BCD maschera il basso nibble poi bit per bit si
'metterà in Low nibble (basso digit)
'fare Temp_Convert = Temp_Convert * 10, hte 10 di cifre
'posizionare il Basso cifra convertito nella Bassa nibble mascherando con un bit per bit e
'Il risultato della somma dei due è il valore binario della bcd orignal il risultato della
'conversione è in Convert

Return
'********************************************************************************************************************************
BIN_BCD:

Temp_Convert = Convert//10
Convert = Convert / 10
Swapf Convert,1
Convert = Convert ^ Temp_Convert

'// effettua la divisione fornendo il resto
'il primo Convert è un valore in binario
'Entra con il valore in Convert, ritorno è anche in Convert
'Temp_Convert ha il resto della divisione per 10 nel nibble basso
'Convert ha il valore intero della divisione per 10 nel nibble basso
'Scambiare i nibbles alto e basso di Temp_Convert e risultato inviarlo al nuovo Temp_Convert
'Bitwise XOR i due risultati per formare il valore BCD


Return

Link al commento
Condividi su altri siti


Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...