' ********************************************************************** ' * File: Corso_BASCOMAVR_090.BAS * ' * Versione: 1.1 * ' * Data: 20.02.11 * ' * Ambiente sviluppo: Bascom-AVR Demo Ver. 1.11.9.1 + * ' * + AVR bootloader grifo(r) Ver. 1.2 * ' * Schede: GMM AM08 + GMM TST3 * ' * Sviluppato da: GRIFO(r) Italian Technology * ' * 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 * ' * Autore: Gianluca Angelini * ' ********************************************************************** ' Programma di esempio 090 del corso BASCOM AVR. ' Programma di gestione di un pannello operatore, tipo QTP 03, abbinato ad un ' RTC, tipo PCF 8583, tramite linea seriale sincrona I2C BUS. ' L'ora e la data attuale vengono continuamente prelevate dal RTC e poi ' rappresentate sul display della QTP, grazie ad una comunicazione effettuata ' con l'interfaccia I2C BUS. Quest'ultima è collegata in rete a tutti i tre ' dispositivi usati, ovvero al Mini Modulo (master), al RTC (slave) ed alla ' QTP (slave) con un bit rate di circa 12 KHz. ' Infine tramite i tasti collegati alla QTP è possibile variare l'ora e la data ' attuale. ' Il programma funziona solo se la GMM AM08 è montata sullo zoccolo Z2 della ' GMM TST3!! ' La linea seriale I2C BUS della QTP 03 deve essere opportunamente configurata ' e collegata dall'utente come indicato nel manuale tecnico. ' ' Aggiunte: Byref. ' ' 20/02/11: Corso_BASCOMAVR_090.BAS - Ver 1.1 - By G.A. ' Prima versione. ' ' '*************************** Configurazioni IDE ******************************** ' NOTE: per usare correttamente questo programma demo, eseguire i seguenti ' punti: ' 1) Controllare la presenza del file M8DEF.DAT nella directory di ' installazione del BASCOM-AVR e se non disponibile copiarlo e dopo ' rilanciare l'IDE. ' 2) Nella finestra "Options | Compiler | Chip" impostare: ' Chip: m8def.dat ' XRAM: None ' HW Stack: 64 ' Soft Stack: 32 ' Framesize: 64 ' XRAM waitstate: disattivo ' External Access Enable: disattivo ' 3) Nella finestra "Options | Compiler | I2C, SPI, 1WIRE" settare: ' I2C ' SCL port = PORTC.5 ' SDA port = PORTC.4 ' 1Wire ' 1wire = indifferente ' SPI ' Clock = indifferente ' MOSI = indifferente ' MISO = indifferente ' SS = indifferente ' Use Hardware SPI = disattivo ' 4) Nella finestra "Options | Communication" settare: ' COM port = la linea del PC collegata alla GMM AM08, tramite la GMM TST3 ' Baudrate = 19200 ' Parity = None ' Databits = 8 ' Stopbit = 1 ' Handshake = None ' Emulation = TTY ' Font = Terminal, Normale, 12 punti, colore bianco ' Backcolor = Navy ' 5) Al termine della compilazione, della programmazione del codice nella ' GMM AM08, aprire la finestra di emulazione terminale del BASCOM AVR con ' l'opzione: Tools | Terminal emulator (Ctrl+T) ed a questo punto resettare ' o riaccendere il Mini Modulo. '********************** Direttive del compilatore ****************************** $regfile "M8DEF.DAT" ' File di definizione microcontrollore usato $romstart = &H0 ' Indirizzo inizio codice in FLASH $crystal = 7372800 ' Frequenza quarzo del microcontrollore $hwstack = 64 ' Spazio per stack hardware $swstack = 32 ' Spazio per stack software $framesize = 64 ' Spazio per frame $map ' Genera informazioni di debug $baud = 19200 ' Velocità comunicazione seriale: 19200 Baud ' Altri parametri sono fissi a: 8 bit x chr ' 1 Stop bit ' No parity $serialinput = Handle_consoleinp ' Ridireziona console input $serialoutput = Handle_consoleout ' Ridireziona console output '******************************* Definizioni *********************************** ' Le risorse usate dal programma sono collegate come illustrato nella seguenti ' tabelle: ' !!! N.B. Sulla GMM TST3 i jumper devono essere posizionati come segue: ' J1 in 2-3 ; J2 in 1-2 ; J3 in 1-2 ; J5 in 2-3 ; J7 in 2-3 ; J8 in 2-3 ' J9 in 2-3 !!! ' 'Segnale pin CN3 Segnale Risorsa pin Z2 pin Segnale Segnale uP 'QTP 03 QTP 03 PCF8583 GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' SCL 4 SCL CN3.15 12 6 PC5 ADC5 SCL PC5 ' SDA 6 SDA CN3.16 13 7 PC4 ADC4 SDA PC4 '+5Vdc 1 Vdd CN3.18 34 28 +5 Vdc - ' GND 7,8 GND CN3.17 20 14 GND - ' ' Segnale pin COMx pin CN5 pin Z2 pin Segnale Segnale uP ' PC DB9 GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' TX 3 3 9 3 RxD RS232 PD0 ' RX 2 2 10 4 TxD RS232 PD1 ' GND 5 5 20 14 GND - ' Da questa tabella si ricava che il cavo di collegamento tra la COM del PC ed ' il CN5 della GMM TST3 è un normale cavo dritto o prolunga. Volendolo ' richiedere alla grifo(r) si deve specificare il codice CCR 9+9E. Pinrx Alias Ddrd.0 ' Bit con direzione segnale collegato a RxD GMM AM08 Pintx Alias Ddrd.1 ' Bit con direzione segnale collegato a TxD GMM AM08 ' Flag di stato per la linea seriale hw Ri Alias Ucsra.7 ' Flag chr ricevuto su linea seriale hw Ti Alias Ucsra.5 ' Flag trasmissione possibile su linea seriale hw '************************ Dichiarazioni costanti ******************************* ' Costanti per QTP Const Esc = 27 ' Codice ASCII di escape Const Slawqtp = &H80 ' Slave address QTP in scrittura Const Slarqtp = &H81 ' Slave address QTP in lettura Const Qtpreslen = 5 ' Lunghezza risposta da QTP Const Nokey = &HFF ' Valore per indicare nessun tasto premuto Const Key1 = &H31 ' Codici tasti QTP usati Const Key2 = &H32 ' Costanti per RTC Const Slawpcf8583 = &HA0 ' Slave address PCF8583 in scrittura Const Slarpcf8583 = &HA1 ' Slave address PCF8583 in lettura '************************ Dichiarazioni variabili ****************************** ' Variabili generiche Dim Hlpb As Byte ' Variabile di aiuto ad uso generico Dim Hlpw As Word ' Variabile word di aiuto ad uso generico Dim Ntpar As Byte ' Numero parametro temporale in variazione Dim Tpar As Byte ' Attuale parametro temporale in variazione Dim Coltpar As Byte ' Colonna attuale parametro temporale in variazione Dim Rowtpar As Byte ' Riga attuale parametro temporale in variazione ' Variabili per console Dim Consi2c As Bit ' Flag che selezione il dispositivo di console (0=ser.hw, 1=I2C BUS) Dim Bufrx(qtpreslen) As Byte ' Buffer di ricezione da console Dim Wpntrx As Byte ' Puntatore scrittura buffer ricezione da console Dim Rpntrx As Byte ' Puntatore lettura buffer ricezione da console Dim I2cnd As Byte ' Numero dati da I2C BUS Dim Ischr As Bit ' Flag dalla console status per chr disponibile Dim Chrx As Byte ' Carattere ricevuto da console Dim Chtx As Byte ' Carattere da trasmettere su dispositivo di console ' Variabili per QTP Dim Cur_qtp As Byte ' Parametro per tipo cursore della QTP Dim Col_qtp As Byte ' Parametri per posizione cursore della QTP Dim Row_qtp As Byte Dim Tout As Byte ' Contatore timeout Dim Key_qtp As Byte ' Tasto premuto su QTP ' Variabili per RTC Dim Wee As Byte ' Giorno settimana RTC Dim Scn As Byte ' Secondi RTC Dim Mnu As Byte ' Minuti RTC Dim Hou As Byte ' Ore RTC Dim Day As Byte ' Giorno mese RTC Dim Mon As Byte ' Mese RTC Dim Yea As Word ' Anno RTC '************************ Dichiarazioni procedure ****************************** ' Procedure generiche Declare Sub Ini_i2c() ' Inizializza linee usate per l'interfaccia I2C BUS software Declare Sub Inc_tpar(byref Tpar As Byte , Byval Tmin As Byte , Byval Tmax As Byte) ' Incrementa parametro temporale in modo circolare ' Procedure per console (le altre sono dichiarate nelle direttive del compilatore) Declare Sub Consolesta() ' Controlla stato della console ' Procedure per QTP 03 Declare Sub Iniseq_qtp() ' Inizia operazioni per l'invio comandi alla QTP Declare Sub Endseq_qtp() ' Termina operazioni per l'invio comandi alla QTP Declare Sub Clear_qtp() ' Cancella tutto il display della QTP Declare Sub Cur_type_qtp(byval Cur_qtp As Byte) ' Setta tipo cursore della QTP Declare Sub Pos_cur_qtp(byval Col_qtp As Byte , Byval Row_qtp As Byte) ' Posiziona cursore della QTP Declare Sub Wt_eerdy_qtp() ' Attende EEPROM della QTP pronta Declare Sub Is_keyp_qtp() ' Verifica pressione tasto su QTP ' Procedure per RTC Declare Sub Get_rtc() ' Acquisisce data ed ora da RTC Declare Sub Set_rtc() ' Setta data ed ora su RTC Declare Sub Shw_time() ' Rappresenta ora formattata sulla console Declare Sub Shw_date2() ' Rappresenta data formattata sulla console con anno a 2 cifre '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Call Ini_i2c() ' Inizializza linee usate per l'interfaccia I2C BUS software Wpntrx = 1 ' Inizializza puntatore scrittura buffer ricezione console Rpntrx = 1 ' Inizializza puntatore lettura buffer ricezione console ' Le istruzioni d'uso non vengono mostrate su console in quanto è associata ' alla linea I2C BUS connessa alla QTP 03. ' Effettuare seguenti operazioni prima di usare il programma: ' - Montare Mini Modulo su Z2 della GMM TST3. ' - Collegare 3 pulsanti normalmente aperti a CN3 della QTP 03. ' - Fornire un adeguata alimentazione alla QTP 03. ' - Tramite SETUP LOCALE configurare QTP 03 a: ' COMMUNICATION:I2C ' BAUD RATE: Indifferente ' STOP BIT: Indifferente ' KEY-CLICK: ON ' Sl.ADD.(Hex): 80 ' EEPROM DATA: INIT ' - Collegare linea I2C BUS da CN3 GMM TST3 a CN3 QTP 03 ed al RTC PCF8583 ' come riportato nelle definizioni e nello schema elettrico. ' - Configurare QTP 03 per la comunicazione I2C BUS come riportato nel suo ' manuale. ' - Una volta fornita l'alimentazione la data e l'ora attuale vengono ' continuamente rappresentati sulle due righe della QTP. ' - Premendo il tasto 1 si entra nella modalità di settaggio data ed ora ' dell'orologio RTC: la rappresentazione viene interrotta e si attiva il ' cursore sul primo valore temporale. ' - Premendo il tasto 2 si incrementa il valore temporale su cui è posizionato ' il cursore, in modo circolare. ' - Ripremendo il tasto 1 si passa al valore temporale seguente, ovvero si ' sposta il cursore al prossimo valore a destra; una volta arrivati ' all'ultimo valore (secondi) i valori impostati, attualmente rappresentati ' su display, vengono impostati nell'orologio. Call Wt_eerdy_qtp() ' Attende EEPROM della QTP pronta Call Clear_qtp() ' Cancella display della QTP Call Cur_type_qtp(0) ' Disattiva cursore QTP Ntpar = 0 ' Nessun parametro temporale in variazione Coltpar = 5 ' Inizializza coordinate parametro temporale in variazione Rowtpar = 1 ' su posizione del primo parametro = giorno settimana Do Waitms 300 ' Ritardo tra acquisizioni e controlli Call Is_keyp_qtp() ' Verifica pressione tasto su QTP ' Determina valori temporali da rappresentare in base allo stato di variazione Select Case Ntpar ' Verifica stato variazione parametri temporali Case 0: ' Nessun parametro temporale in variazione Call Get_rtc() ' Acquisisce data ed ora attuale da RTC Yea = Yea Mod 100 ' Mantiene solo ultime due cifre dell'anno Case 1: ' Primo parametro temporale (giorno settimana) in variazione Coltpar = 5 ' Inizializza coordinate su posizione del giorno settimana Rowtpar = 1 Call Inc_tpar(wee , 0 , 6) ' Se tasto 2 su QTP premuto, incrementa giorno settimana in modo circolare Case 2: ' Secondo parametro temporale (giorno) in variazione Coltpar = 8 ' Inizializza coordinate su posizione del giorno Rowtpar = 1 Call Inc_tpar(day , 1 , 31) ' Se tasto 2 su QTP premuto, incrementa giorno in modo circolare Case 3: ' Terzo parametro temporale (mese) in variazione Coltpar = 11 ' Inizializza coordinate su posizione del mese Rowtpar = 1 Call Inc_tpar(mon , 1 , 12) ' Se tasto 2 su QTP premuto, incrementa mese in modo circolare Case 4: ' Quarto parametro temporale (anno) in variazione Coltpar = 14 ' Inizializza coordinate su posizione dell'anno Rowtpar = 1 Tpar = Yea ' Salva anno a due cifre su variabile byte Call Inc_tpar(tpar , 0 , 99) ' Se tasto 2 su QTP premuto, incrementa due cifre dell'anno in modo circolare Yea = Tpar Case 5: ' Quinto parametro temporale (ore) in variazione Coltpar = 8 ' Inizializza coordinate su posizione delle ore Rowtpar = 2 Call Inc_tpar(hou , 0 , 23) ' Se tasto 2 su QTP premuto, incrementa ore in modo circolare Case 6: ' Sesto parametro temporale (minuti) in variazione Coltpar = 11 ' Inizializza coordinate su posizione dei minuti Rowtpar = 2 Call Inc_tpar(mnu , 0 , 59) ' Se tasto 2 su QTP premuto, incrementa minuti in modo circolare Case 7: ' Settimo parametro temporale (secondi) in variazione Coltpar = 14 ' Inizializza coordinate su posizione dei secondi Rowtpar = 2 Call Inc_tpar(scn , 0 , 59) ' Se tasto 2 su QTP premuto, incrementa secondi in modo circolare End Select ' Rappresenta attuali valori temporali su display della QTP Call Pos_cur_qtp(3 , 1) ' Posiziona cursore per rappresentazione data su prima riga Call Iniseq_qtp() ' Inizia operazioni per l'invio comandi alla QTP Call Shw_date2() ' Rappresenta data attuale con anno a 2 cifre Call Endseq_qtp() ' Termina operazioni per l'invio comandi alla QTP Call Pos_cur_qtp(7 , 2) ' Posiziona cursore per rappresentazione ora su seconda riga Call Iniseq_qtp() ' Inizia operazioni per l'invio comandi alla QTP Call Shw_time() ' Rappresenta ora attuale Call Endseq_qtp() ' Termina operazioni per l'invio comandi alla QTP ' Posiziona cursore su attuale parametro in variazione If Ntpar <> 0 Then ' Se variazione parametro temporale in corso Call Pos_cur_qtp(coltpar , Rowtpar) ' Posiziona cursore su colonna e riga dove è rappresentato il parametro attuale End If ' Verifica azioni utente su tasto 1 che varia parametro in variazione If Key_qtp = Key1 Then ' Se premuto tasto 1 su QTP If Ntpar = 7 Then ' Se parametro temporale in variazione = secondi: termina variazione Ntpar = 0 ' Nessun parametro temporale in variazione Call Set_rtc() ' Inizializza RTC con parametri temporali inseriti Call Cur_type_qtp(0) ' Disattiva cursore Else Incr Ntpar ' Incrementa parametro temporale in variazione Call Cur_type_qtp(85) ' Attiva cursore blocco lampeggiante End If End If Loop ' Fine ciclo infinito End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** '************************** Procedure generiche ******************************** ' Inizializza segnali e variabili usati per l'interfaccia I2C BUS gestita via ' software ' Ingresso: Nulla ' Uscita: Nulla Sub Ini_i2c() ' Questa procedura è stata realizzata per compatibilità con i programmi demo ' delle EEPROM con altri protocolli gestite a basso livello. Per il protocollo ' I2C BUS si usano invece le istruzioni ad alto livello del BASCOM. ' Per le connessioni linee dell'interfaccia I2C BUS software vedere help in ' linea e precedente tabella. Config I2cdelay = 100 ' Imposta bit rate I2C BUS a circa 10 KHz Config Scl = Portc.5 ' Segnale del micro usato come segnale SCL dell'I2C BUS Config Sda = Portc.4 ' Segnale del micro usato come segnale SDA dell'I2C BUS I2cinit ' Inizializza segnali I2C BUS End Sub ' Se è stato premuto il tasto 2 della QTP, incrementa il parametro temporale ' passato in modo circolare. ' Ingresso: Tpar = Attuale parametro temporale ' Tmin = Valore minimo del parametro temporale ' Tmax = Valore massimo del parametro temporale ' Uscita: Tpar = Attuale parametro temporale aggiornato Sub Inc_tpar(byref Tpar As Byte , Byval Tmin As Byte , Byval Tmax As Byte) If Key_qtp = Key2 Then ' Se premuto tasto 2 su QTP If Tpar = Tmax Then ' Incrementa parametro temporale in modo circolare Tpar = Tmin Else Incr Tpar End If End If End Sub '*********************** Procedure gestione console **************************** ' Procedura che restituisce il console status del dispositivo attualmente ' selezionato dalla variabile: Consi2c = 0 -> linea seriale asincrona hw ' = 1 -> linea seriale sincrona I2C BUS sw ' nella variabile Ischr e l'eventuale carattere, nella variabile Chrx Sub Consolesta() If Consi2c = 0 Then ' Controlla dispositivo scelto Ischr = Ri ' Dispositivo = linea seriale hw: salva flag chr ricevuto da seriale hw If Ischr = 1 Then ' Se chr ricevuto da seriale hw Chrx = Udr ' Preleva chr ricevuto da seriale hw End If Else ' Dispositivo = linea I2C BUS If Wpntrx <= Rpntrx Then ' Se buffer di ricezione da console vuoto I2cstart ' Manda start I2cwbyte Slarqtp ' Manda slave address QTP+R I2crbyte I2cnd , Ack ' Legge numero dati da I2C BUS If I2cnd <= Qtpreslen Then ' Se numero dati da I2C BUS è valido Wpntrx = 1 ' Inizializza puntatore scrittura buffer ricezione console Rpntrx = 1 ' Inizializza puntatore lettura buffer ricezione console While Wpntrx <= I2cnd ' Ciclo ripetuto per tutti i dati da I2C BUS If Wpntrx = I2cnd Then ' Se dato da I2C BUS è l'ultimo I2crbyte Chrx , Nack ' Legge dato da I2C BUS senza ACK Else I2crbyte Chrx , Ack ' Legge dato da I2C BUS con ACK End If Bufrx(wpntrx) = Chrx ' Salva dato letto nel buffer ricezione Incr Wpntrx ' Incrementa puntatore scrittura buffer ricezione console Wend End If I2cstop ' Manda stop If I2cnd = 0 Then ' Se dati non ricevuti da I2C BUS Ischr = 0 ' Indica carattere non ricevuto Else ' Dati ricevuti da I2C BUS Chrx = Bufrx(rpntrx) ' Preleva e restituisce primo carattere ricevuto da buffer ricezione Incr Rpntrx ' Incrementa puntatore lettura in modo circolare Ischr = 1 ' Indica carattere ricevuto End If Else ' Buffer di ricezione da console non vuoto Chrx = Bufrx(rpntrx) ' Preleva carattere ricevuto da buffer ricezione Incr Rpntrx ' Incrementa puntatore lettura in modo circolare Ischr = 1 ' Indica carattere ricevuto End If End If End Sub ' Procedura che gestisce la console input di un carattere dal dispositivo ' attualmente selezionato dalla variabile: Consi2c = 0 -> linea seriale asincrona hw ' = 1 -> linea seriale sincrona I2C BUS sw ' La procedura è scritta in BASCOM invece che in assembler in modo da ' semplificarne la scrittura e la comprensione: questa scelta peggiora le ' prestazioni di esecuzione, ma in modo accettabile. !Handle_consoleinp: Pushall ' Salva tutti i registri del microcontrollore Do ' Ciclo attesa chr da dispositivo console scelto Call Consolesta() ' Verifica e riceve carattere da dispositivo console scelto Loop Until Ischr = 1 ' Attende chr disponibile Popall ' Ripristina tutti i registri del microcontrollore lds R24, {chrx} ' Restituisce chr ricevuto e salvato, in R24 Return ' Procedura che gestisce la console output di un carattere sul dispositivo ' attualmente selezionato dalla variabile: Consi2c = 0 -> linea seriale asincrona hw ' = 1 -> linea seriale sincrona I2C BUS sw ' La procedura è scritta in BASCOM invece che in assembler in modo da ' semplificarne la scrittura e la comprensione: questa scelta peggiora le ' prestazioni di esecuzione, ma in modo accettabile. !Handle_consoleout: STS {Chtx},R24 ' Salva chr da inviare (salvato in R24) in Chtx Pushall ' Salva tutti i registri del microcontrollore If Consi2c = 0 Then ' Controlla dispositivo scelto Do ' Dispositivo = linea seriale hw Loop Until Ti = 1 ' Attende trasmettitore seriale hw libero Udr = Chtx ' Invia chr (salvato in R24) su seriale hw Else ' Dispositivo = linea I2C BUS I2cwbyte Chtx ' Manda chr su linea I2C BUS End If Popall ' Ripristina tutti i registri del microcontrollore Return '************************* Procedure gestione QTP ****************************** ' Esegue le prime operazioni comuni per l'invio dei comandi alla QTP, tramite ' la console su I2C BUS ' Ingresso: Nulla ' Uscita: Nulla Sub Iniseq_qtp() Consi2c = 1 ' Console su linea I2C BUS I2cstart ' Manda start I2cwbyte Slawqtp ' Manda slave address QTP+W End Sub ' Esegue le ultime operazioni comuni per l'invio dei comandi alla QTP, tramite ' la console su I2C BUS ' Ingresso: Nulla ' Uscita: Nulla Sub Endseq_qtp() I2cstop ' Manda stop Consi2c = 0 ' Console su seriale asincrona hw End Sub ' Cancella tutto il display della QTP e riporta cursore in HOME ' Ingresso: Nulla ' Uscita: Nulla Sub Clear_qtp() Call Iniseq_qtp() ' Inizia operazioni per l'invio comandi alla QTP Printbin 12 ' Manda comando cancella pagina: FF Call Endseq_qtp() ' Termina operazioni per l'invio comandi alla QTP End Sub ' Setta tipo cursore della QTP in base al parametro passato ' Ingresso: Cur_qtp = tipo cursore (0->disattivo, 85->lampeggiante, 255->fisso) ' Uscita: Nulla Sub Cur_type_qtp(byval Cur_qtp As Byte) Call Iniseq_qtp() ' Inizia operazioni per l'invio comandi alla QTP Select Case Cur_qtp Case 0 : Printbin Esc ; 80 ' Manda comando disattivazione cursore: ESC P Case 85 : Printbin Esc ; 81 ' Manda comando attivazione cursore lampeggiante: ESC Q Case 255 : Printbin Esc ; 79 ' Manda comando attivazione cursore fisso: ESC O End Select Call Endseq_qtp() ' Termina operazioni per l'invio comandi alla QTP End Sub ' Posiziona cursore della QTP sulla posizione definita dai parametri passati, ' che partono da 1 ' Ingresso: Col_qtp = Colonna del cursore ' Row_qtp = Riga del cursore ' Uscita: Nulla Sub Pos_cur_qtp(col_qtp As Byte , Row_qtp As Byte) Call Iniseq_qtp() ' Inizia operazioni per l'invio comandi alla QTP Printbin Esc ; 89 ' Manda comando posizionamento cursore: Hlpb = Row_qtp + 31 ' ESC Y r+32 c+32 Printbin Hlpb Hlpb = Col_qtp + 31 Printbin Hlpb Call Endseq_qtp() ' Termina operazioni per l'invio comandi alla QTP End Sub ' Attende EEPROM della QTP pronta, con un timeout di sicurezza di circa 500 ' millisecondi ' Ingresso: Nulla ' Uscita: Nulla Sub Wt_eerdy_qtp() Tout = 0 ' Azzera contatore timeout Do Incr Tout ' Incrementa contatore timeout Call Iniseq_qtp() ' Inizia operazioni per l'invio comandi alla QTP Printbin Esc ; 51 ' Manda comando richiesta disponibilità EEPROM: ESC 3 Call Endseq_qtp() ' Termina operazioni per l'invio comandi alla QTP Waitms 100 ' Attende tempo per ricezione risposta Consi2c = 1 ' Console su linea I2C BUS Call Consolesta ' Verifica se ricevuta risposta a comando Consi2c = 0 ' Console su seriale asincrona hw If Ischr = 1 Then ' Se risposta ricevuta: la controlla If Chrx = 6 Then ' Se EEPROM QTP pronta Tout = 6 ' Setta per uscita immediata End If End If Loop Until Tout >= 5 ' Ripete fino a EEPROM pronta o timeout scaduto End Sub ' Verifica pressione tasto su QTP ' Ingresso: Nulla ' Uscita: Key_qtp = Codice tasto premuto su QTP (Nokey se nessun tasto) Sub Is_keyp_qtp() Consi2c = 1 ' Console su linea I2C BUS Call Consolesta() ' Verifica se tasto premuto su QTP e lo preleva Consi2c = 0 ' Console su seriale asincrona hw If Ischr = 1 Then ' Se tasto premuto su console = QTP Key_qtp = Chrx ' Restituisce codice tasto premuto Else Key_qtp = Nokey ' Restituisce nessun tasto premuto End If End Sub '************************* Procedure gestione RTC ****************************** ' Procedura che preleva data ed ora attuali dal RTC PCF 8583, in I2C BUS ' Ingresso: Nulla ' Uscita: Scn,Mnu,Hou = orario prelevato ' Day,Mon,Yea,Wee = data prelevata (con anno a 4 cifre) Sub Get_rtc() I2cstart ' Manda start I2cwbyte Slawpcf8583 ' Manda slave address PCF8583+W I2cwbyte &H02 ' Manda indirizzo registro 2 I2cstart ' Manda repeated start I2cwbyte Slarpcf8583 ' Manda slave address PCF8583+R I2crbyte Scn , Ack ' Legge secondi da reg. 2 I2crbyte Mnu , Ack ' Legge minuti da reg. 3 I2crbyte Hou , Ack ' Legge ore da reg. 4 I2crbyte Hlpb , Ack ' Legge anno e giorno da reg. 5 I2crbyte Wee , Nack ' Legge settimana e mese da reg. 6 I2cstop ' Manda stop Scn = Makedec(scn) ' Ottiene secondi Mnu = Makedec(mnu) ' Ottiene minuti Hou = Makedec(hou) ' Ottiene ore Day = Hlpb And &H3F ' Ottiene giorno Day = Makedec(day) Shift Hlpb , Right , 6 ' Ottiene offset anno (0÷3) Yea = Hlpb Mon = Wee And &H1F ' Ottiene mese Mon = Makedec(mon) Shift Wee , Right , 5 ' Ottiene settimana ' Preleva anno a 4 cifre da ultime locazioni RAM del PCF 8583 I2cstart ' Manda start I2cwbyte Slawpcf8583 ' Manda slave address PCF8583+W I2cwbyte &HFE ' Manda indirizzo penultima locazione I2cstart ' Manda repeated start I2cwbyte Slarpcf8583 ' Manda slave address PCF8583+R I2crbyte Hlpb , Ack ' Legge byte high anno a 4 cifre da RAM Hlpw = Hlpb ' Salva byte high anno a 4 cifre I2crbyte Hlpb , Nack ' Legge byte low anno a 4 cifre da RAM I2cstop ' Manda stop Shift Hlpw , Left , 8 ' Ottiene anno a 4 cifre dai due byte letti Hlpw = Hlpw Or Hlpb Yea = Yea + Hlpw ' Aggiunge offset anno letto da RTC End Sub ' Procedura che setta data ed ora attuali sul RTC PCF 8583, in I2C BUS ' Ingresso: Scn,Mnu,Hou = orario prelevato ' Day,Mon,Yea,Wee = data prelevata (con anno a 4 cifre) ' Uscita: Nulla Sub Set_rtc() Scn = Makebcd(scn) ' Trasforma secondi Mnu = Makebcd(mnu) ' Trasforma minuti Hou = Makebcd(hou) ' Trasforma ore Day = Makebcd(day) ' Trasforma giorno Mon = Makebcd(mon) ' Trasforma mese Shift Wee , Left , 5 ' Trasforma settimana Wee = Wee Or Mon ' Ottiene settimana e mese I2cstart ' Manda start I2cwbyte Slawpcf8583 ' Manda slave address PCF8583+W I2cwbyte &H00 ' Manda indirizzo registro 0 I2cwbyte &H84 ' Manda comando stop RTC su reg. 0 I2cstop ' Manda stop I2cstart ' Manda start I2cwbyte Slawpcf8583 ' Manda slave address PCF8583+W I2cwbyte &H01 ' Manda indirizzo registro 1 I2cwbyte &H00 ' Manda centinaia secondi I2cwbyte Scn ' Manda secondi su reg. 2 I2cwbyte Mnu ' Manda minuti su reg. 3 I2cwbyte Hou ' Manda ore su reg. 4 I2cwbyte Day ' Manda anno=0 e giorno su reg. 5 I2cwbyte Wee ' Manda settimana e mese su reg. 6 I2cstop ' Manda stop I2cstart ' Manda start I2cwbyte Slawpcf8583 ' Manda slave address PCF8583+W I2cwbyte &H00 ' Manda indirizzo registro 0 I2cwbyte &H00 ' Manda comando start RTC su reg. 0 I2cstop ' Manda stop ' Setta anno a 4 cifre su ultime locazioni RAM del PCF 8583 I2cstart ' Manda start I2cwbyte Slawpcf8583 ' Manda slave address PCF8583+W I2cwbyte &HFE ' Manda indirizzo penultima locazione Hlpb = High(yea) ' Preleva byte high anno a 4 cifre I2cwbyte Hlpb ' Manda byte high anno a 4 cifre su RAM Hlpb = Low(yea) ' Preleva byte low anno a 4 cifre I2cwbyte Hlpb ' Manda byte low anno a 4 cifre su RAM I2cstop ' Manda stop End Sub ' Rappresenta data formattata sulla console nel formato gg/mm/aa ' Ingresso: Wee,Day,Mon,Yea = data attuale ' Uscita: Nulla Sub Shw_date2() Select Case Wee ' Rappresenta giorno della settimana Case 0 : Print "Lun "; Case 1 : Print "Mar "; Case 2 : Print "Mer "; Case 3 : Print "Gio "; Case 4 : Print "Ven "; Case 5 : Print "Sab "; Case 6 : Print "Dom "; End Select If Day < 10 Then ' Rappresenta giorno a due cifre Print "0"; End If Print Day ; "/" ; If Mon < 10 Then ' Rappresenta mese a due cifre Print "0"; End If Print Mon ; "/" ; If Yea < 10 Then ' Rappresenta anno a due cifre Print "0"; End If Print Yea ; End Sub ' Rappresenta ora formattata sulla console nel formato oo:mm:ss ' Ingresso: Scn,Mnu,Hou = orario attuale ' Uscita: Nulla Sub Shw_time() If Hou < 10 Then ' Rappresenta ore a due cifre Print "0"; End If Print Hou ; ":" ; ' Con separatore If Mnu < 10 Then ' Rappresenta minuti a due cifre Print "0"; End If Print Mnu ; ":" ; ' Con separatore If Scn < 10 Then ' Rappresenta secondi a due cifre Print "0"; End If Print Scn ; End Sub '******************* Fine procedure usate dal programma ************************