ic910 Inserito: 17 febbraio 2015 Segnala Share Inserito: 17 febbraio 2015 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora