' ********************************************************************** ' * File gmbtmp.bas - Rel. 1.2 con Bascom 8051 DEMO IDE e LIB 2.0.11.0 * ' * GRIFO(R) via Dell'Artigiano 8/6 40016 S. Giorgio di Piano (BO) * ' * Tel. +39 051 892052 Fax. +39 051 893661 * ' * http://www.grifo.com http://www.grifo.it * ' * sales@grifo.it tech@grifo.it grifo@grifo.it * ' * by Graziano Gaiba del 14.05.03 * ' ********************************************************************** ' ' Se sul Mini Modulo e' disponibile il Real Time Clock, questo demo permette di ' gestire tre temporizzatori che agiscono sulle uscite bufferate di CN1. ' In dettaglio da console per tutti i temporizzatori si puo` stabilire ' l'attivazione e l'intervallo di tempo in secondi, mentre solo per i primi due ' e` inseribile la combinazione d'uscita; il terzo invece disattiva tutte le ' uscite. ' ' 17.04.03 - Rel 1.1 By Graziano Gaiba ' ' ' 14.05.03 - Rel 1.2 By Graziano Gaiba ' ' Il file compilato non supera i 2048 bytes, quindi puo' essere ' compilato con il demo gratuito di BASCOM 8051. ' '****************** Direttive del compilatore ************************** ' ' Impostare ad 80h il limite per la memoria interna mediante il menu: ' Options/Compiler/Misc $regfile = "grifo_mm.dat" $romstart = &H0 ' indirizzo di partenza del codice ' macchina per FLASH $ramstart = &H0 ' indirizzo di partenza della area ' dati $ramsize = &H100 ' pongo a 256 bytes la area dati $crystal = 14745600 ' frequenza di clock del microcontrollore $baud = 19200 ' velocitą di comunicazione RS-232 '$large ' indirizzamento a 16 bit ' solo se si non usa la versione demo $map ' Genera una mappa degli indirizzi ' per ogni linea di codice Config Sda = P2.1 ' I2C serial DATA Config Scl = P2.0 ' I2C serial CLK ' '****************** Dichiarazione delle costanti *********************** ' Const Cret = 13 ' Codice di ritorno di carrello Const Nl = 10 ' Codice nuova linea Const Clrscr = 12 ' codice di clear screen Const Bell = 7 ' codice di Bell Const R = 1 ' valore per leggere in I2C Bus Const W = 0 ' valore per scrivere in I2C Bus ' '****************** Dichiarazione delle variabili ********************** ' ' Uso generico Dim Sr As String * 1 ' Stringa di uso generico Dim V As Byte ' Byte di uso generico ' Gestione attivita' 1 Dim M1 As Byte ' Minuto di attivita' 1 Dim A1 As Bit ' Attivazione attivita' 1 Dim Valore1 As Byte ' Valore uscite per attivita' 1 ' Gestione attivita' 2 Dim M2 As Byte ' Minuto di attivita' 2 Dim A2 As Bit ' Attivazione attivita' 2 Dim Valore2 As Byte ' Valore uscite per attivita' 2 ' Gestione Disattivazione uscite Dim M_d As Byte ' Minuto disattivazione uscite Dim A_d As Bit ' Attivazione disattivazione uscite ' Usate dal demo RTC Dim S As Byte ' secondi e uso generico Dim M As Byte ' minuti e uso generico Dim Ho As Byte ' ore Dim D As Byte ' giorno e uso generico Dim We As Byte ' settimana Dim Mnt As Byte ' mese Dim Y As Byte ' anno e uso generico Dim Wm As Byte ' settimana pił mese Dim Yd As Byte ' anno pił giorno ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Rtc() ' Demo gestione RTC Declare Sub Output_orario() ' Stampa dati orario Declare Sub Settime(s As Byte , M As Byte , Ho As Byte , D As Byte , We As Byte , Mnt As Byte , Y As Byte) Declare Sub Gettime() Declare Sub Sn_input() ' Chiede S o N Declare Sub Tempo_input() ' Chiede minuti Declare Sub Valore_input() ' Chiede un valore a 4 bit Declare Sub Set_out(v As Byte) ' Imposta le uscite ' '************************* Programma main ****************************** ' Main: ' Inizializza il demo Disable Interrupts ' Disabilita gli interrupts Auxr = &H0C ' Seleziona Eram Su Area Dati Esterna Eecon = &H00 ' Disabilita Eeprom Del Micro Adcf = Adcf And &HF9 ' Imposta P1.1 e P1.2 come I/O P3 = &HFF ' Setta port 3 in input Do Print Chr(clrscr); ' Pulisce lo schermo Print "Demo 1.1 per GMBHR84 ds100203" Print Print "Dove gira il demo:" Print "1) GM1 o GM2" Print "2) 5115" Print Print "Scelta: "; Do S = Inkey() ' Attesa sospensiva di un tasto Loop Until S <> 0 If S = "2" Then Print "RTC inesistente." Do Loop End If ' Gestisce RTC (componente PCF 8583 sulla scheda) in I2C bus Do ' Visualizzo il menu principale Print Chr(clrscr); ' Cancello lo schermo Print "Demo attivita' temporizzata" Print Print "Imposta le uscite con un valore scelto dall'utente" Print "L'RTC usato ha un interrupt altamente programmabile" Print A1 = 0 ' Disattiva le attivita' A2 = 0 A_d = 0 Print "Attivo temp 1 (S/N)?"; Call Sn_input() If Sr = "S" Then Call Tempo_input() ' Restituisce valore BCD M1 = M Call Valore_input() Valore1 = S A1 = 1 Else Print End If Print "Attivo temp 2?"; Call Sn_input() If Sr = "S" Then Call Tempo_input() ' Restituisce valore BCD M2 = M Call Valore_input() Valore2 = S A2 = 1 Else Print End If Print "Disattiva?"; Call Sn_input() If Sr = "S" Then Call Tempo_input() ' Restituisce valore BCD M_d = M A_d = 1 Else Print End If Print "Orologio" Call Tempo_input() ' Restituisce valore BCD Print ' Secondi scelti dall'utente S = M ' 0=domenica..6=sabato We = 6 ' Giorno D = 31 ' Mese Mnt = 12 ' 0=2002..3=2005 Y = 1 ' Ore Ho = 23 ' Minuti M = 0 Call Settime S , M , Ho , D , We , Mnt , Y ' Imposta RTC Print "Premere tasto..." Do Call Output_orario() ' Gestisce le attivita' temporizzate If A1 = 1 Then If S = M1 Then Call Set_out(valore1) End If End If If A2 = 1 Then If S = M2 Then Call Set_out(valore2) End If End If If A_d = 1 Then If S = M_d Then Call Set_out(&H00) End If End If M = Inkey Loop Until M <> 0 Loop End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' 'Chiede i secondi Sub Tempo_input Print "Secondi:"; Input M M = Makebcd(m) End Sub ' Chiede un valore a 4 bit Sub Valore_input Print "Valore (0-15):"; Input S End Sub ' Mostra l'ora letta dall'RTC Sub Output_orario() Call Gettime() ' Legge RTC ' Ore, minuti , secondi e a capo Print Bcd(ho) ; ":" ; Bcd(m) ; "." ; Bcd(s) ; Chr(13); Waitms 200 ' ritardo End Sub ' Questa procedura visualizza l'ora contenuta nell'RTC Sub Gettime I2cstart ' sequenza start I2cwbyte &HA0 ' punta indirizzo per scrive su PCF8583 I2cwbyte 2 ' punta nel registro 2 I2cstart ' ripete la sequenza di start I2cwbyte &HA1 ' punta indirizzo per leggere I2crbyte S , Ack ' lettura secondi reg. 2 I2crbyte M , Ack ' lettura minuti reg. 3 I2crbyte Ho , Ack ' lettura ore reg. 4 I2crbyte Yd , Ack ' lettura anno e giorno reg. 5 I2crbyte Wm , Nack ' lettura settimana e mese reg. 6 I2cstop ' sequenza stop We = Wm ' memorizzo il valore letto Y = Yd ' memorizzo il valore letto Y = Y And 192 ' elimino i bit che non riguardano anno We = We And 224 ' elimino i bit che non riguardano la settimana Wm = Wm And &H01F ' elimino 3 bit alti Yd = Yd And &H03F ' elimino i 2 bit alti End Sub ' Questa procedura programma l'ora contenuta nell'RTC. ' I valori delle variabili prima di mandarli all'RTC vengono convertiti in BCD Sub Settime(s As Byte , M As Byte , Ho As Byte , D As Byte , We As Byte , Mnt As Byte , Y As Byte) S = Makebcd(s) ' secondi M = Makebcd(m) ' minuti Ho = Makebcd(ho) ' ore D = Makebcd(d) ' giorno Mnt = Makebcd(mnt) ' mese Y = Y * 64 ' sposto i primi 2 bit di 6 posti Yd = Y Or D ' compongono il registro anno e giorno We = We * 32 ' sposto i primi 3 bit di 5 posti Wm = We Or Mnt ' compongo il registro settimana e mese I2cstart ' sequenza start I2cwbyte &HA0 ' punta indirizzo per scrive su PCF8583 I2cwbyte 0 ' seleziona control register nel reg. 0 I2cwbyte 0 ' attivo la lettura dei bit alti I2cstop ' sequenza stop ' I2cstart ' genera start I2cwbyte &HA0 ' punta indirizzo per scrive su PCF8583 I2cwbyte 2 ' punta nel registro 2 I2cwbyte S ' scrive secondi, reg. 2 I2cwbyte M ' scrive minuti, reg. 3 I2cwbyte Ho ' scrive ore, reg. 4 I2cwbyte Yd ' scrive anno e giorno, reg. 5 I2cwbyte Wm ' scrive settimana e mese, reg. 6 I2cstop ' sequenza stop End Sub ' Chiede S o N Sub Sn_input Do Sr = Waitkey() Sr = Ucase(sr) Loop Until Sr = "S" Or Sr = "N" Print Sr End Sub ' Imposta le uscite Sub Set_out(v As Byte) P1.4 = Not V.0 P1.5 = Not V.1 P1.6 = Not V.2 P1.7 = Not V.3 End Sub