' ********************************************************************** ' * File gmb_bas.bas - Rel. 1.1 con Bascom 8051 DEMO IDE e LIB 2.0.6.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.04.03 * ' ********************************************************************** ' ' 14.04.03 - Rel 1.1 By Graziano Gaiba ' Programma di demo per il modulo block GMB HR84. ' Funziona con CAN GM1, CAN GM2 e GMM 5115. ' In particolare, questo programma mostra come accedere ai dati del ' Real Time Clock. ' ' 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 V As Byte , T As Byte ' Byte di uso generico Dim S0 As Bit ' Bit di uso generico Dim Cntintr As Byte ' Contatore di interrupt avvenuti ' 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 Rtc_int() ' Mostra interrupt periodico dell'RTC ' '************************* 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 GMB HR84 ds 100203" Print Print "Su quale Mini Modulo grifo(r) sta girando il demo:" Print "1) CAN GM1" Print "2) CAN GM2" Print "3) GMM 5115" Print Print "SELEZIONE: "; Do S = Inkey() ' Attesa sospensiva di un tasto Loop Until S <> 0 If S = "3" 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 RTC" Print Print "Orologio impostato a 31/12/2003 23:59.55" ' 0=domenica..6=sabato We = 6 ' Giorno D = 31 ' Mese Mnt = 12 ' 0=2002..3=2005 Y = 1 ' Ore Ho = 23 ' Minuti M = 59 ' Secondi S = 55 Call Settime S , M , Ho , D , We , Mnt , Y ' Imposta RTC Print "Premere un tasto per demo interrupt" Call Output_orario() Call Rtc_int() ' Int periodico dell'RTC Loop End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' ' Usata dal demo RTC, mostra continuamente l'ora letta dall'RTC ' Finchč non viene premuto un tasto Sub Output_orario() Do Call Gettime() ' Legge RTC If We = 0 Then Print "Dom "; ' Giorno della settimana If We = 32 Then Print "Lun "; If We = 64 Then Print "Mar "; If We = 66 Then Print "Mer "; If We = 128 Then Print "Gio "; If We = 160 Then Print "Ven "; If We = 192 Then Print "Sab "; Print " " ; Bcd(yd) ; ' Giorno Print "/" ; Bcd(wm) ; "/"; ' Mese Print "200" ; If Y = 0 Then Print "2"; ' Anno If Y = 64 Then Print "3"; If Y = 128 Then Print "4"; If Y = 192 Then Print "5"; Print " Ore " ; Bcd(ho) ; ' Ore Print ":" ; Bcd(m) ; ":" ; Bcd(s); ' Minuti e secondi Print " " ; Chr(13); ' A capo Waitms 200 ' ritardo S = Inkey Loop Until S <> 0 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 ' Demo interrupt periodico dell'RTC Sub Rtc_int() Print Chr(clrscr); ' Cancello lo schermo Print "Interrupt" Print Print "Conteggio transizioni H->L del pin P2.5" S0 = P2.5 Cntintr = 0 Do If S0 = 1 And P2.5 = 0 Then Incr Cntintr S0 = P2.5 Print Cntintr ; Chr(cret); Waitms 200 S = Inkey Loop Until S <> 0 End Sub