' ********************************************************************** ' * File: Corso_BASCOMAVR_057.BAS * ' * Versione: 1.1 * ' * Data: 29.12.09 * ' * 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 057 del corso BASCOM AVR. ' Acquisizione temperatura da sensore DS18S20 tramite BUS 1-WIRE. ' Ogni secondo il programma preleva e rappresenta la temperatura del sensore ' usando un'interfaccia 1-WIRE a tre fili (DQ, GND, Vdd). La temperatura è ' rappresentata sulla console con la risoluzione del mezzo grado, nel range ' da -55 a +125 °C, caratteristica del sensore. ' Nel caso sul BUS 1-WIRE siano collegati diversi dispositivi, il programma ' cerca e gestisce solo il primo sensore DS18S20, senza interferire con gli ' altri. ' Il programma si presenta ed usa una console seriale dotata di monitor e ' tastiera, con un protocollo fisico costante a 19200 Baud, 8 Bit x chr, ' 1 Stop bit, Nessuna parità. ' Questa console può coincidere con un sistema in grado di gestire una ' comunicazione seriale in RS 232. Al fine di semplificarne l'uso si può ' usare un PC dotato di una linea COMx, che esegue un programma di emulazione ' terminale come HYPERTERMINAL o l'omonima modalità offerta dal BASCOM AVR ' (vedere Configurazioni IDE). ' Il programma funziona solo se la GMM AM08 è montata sullo zoccolo Z2 della ' GMM TST3!! ' ' Aggiunte: 1WVERIFY; 1WWRITE; 1WREAD; CRC8. ' ' 29/12/09: Corso_BASCOMAVR_057.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 = indifferente ' SDA port = indifferente ' 1Wire ' 1wire = PORTD.3 ' 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 '******************************* 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 Risorsa pin Z2 pin Segnale Segnale uP ' 1-WIRE GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' DQ CN4.16 24 18 PD3 INT1 PD3 ' Vdd CN4.18 34 28 +5 Vdc - ' GND CN4.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 '************************ Dichiarazioni costanti ******************************* Const Cret = 13 ' Codice ASCII di ritorno di carrello '************************ Dichiarazioni variabili ****************************** Dim Ndev_ow As Word ' Numero dispositivi su BUS 1-WIRE Dim Romcode_ow(8) As Byte ' Vettore per 8 bytes del ROM code 1-WIRE Dim Scrpad_ow(9) As Byte ' Vettore per 9 bytes della Scratchpad area sensore DS18S20 Dim Err_ow As Byte ' Copia errori avvenuti su comunicazione 1-WIRE Dim Crc_ow As Byte ' CRC calcolato su comunicazione 1-WIRE Dim Tint_ow As Integer ' Temperatura intera (in 0,5 °C), acquisita da sensore DS18S20 Dim Tdec_ow As Single ' Temperatura decimale (in °C), acquisita da sensore DS18S20 Dim Gstr As String * 6 ' Stringa per visualizzazione temperatura formattata Dim Hlpw As Word ' Variabile di aiuto word ad uso generico Dim Key As Byte ' Tasto premuto su console '************************ Dichiarazioni procedure ****************************** Declare Sub Gettemp_ow() ' Acquisisce temperatura attuale del sensore 1-WIRE DS16S20 '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Print ' Separa precedenti rappresentazioni su console Print Print " Acquisizione sensore temperatura 1-WIRE DS18S20 con GMM AM08 + GMM TST3" Print "Montare Mini Modulo su Z2 della GMM TST3, collegare linea 1-WIRE a sensore come" Print "da schema." Print "Il programma verifica la presenza del sensore e poi ogni secondo, rappresenta" Print "la temperatura acquisita, sulla console." Print Config 1wire = Portd.3 ' Inizializza interfaccia 1-WIRE ' Determina presenza dispositivi sul BUS 1-WIRE ed in caso affermativo preleva ' i ROM code da questi fino a quando trova un sensore DS18S20, ovvero un ROM ' code con "family code" = 10H. Ndev_ow = 1wirecount() ' Determina numero dispostivi 1-WIRE collegati If Ndev_ow > 0 Then ' Se almeno un dispositivo 1-WIRE collegato Hlpw = 0 ' Inizializza contatore dispositivi 1-WIRE Do ' Ciclo che verifica presenza sensore DS18S20 Incr Hlpw ' Incrementa contatore dispositivi 1-WIRE If Hlpw = 1 Then Romcode_ow(1) = 1wsearchfirst() ' Determina ROM code primo dispositivo 1-WIRE Else Romcode_ow(1) = 1wsearchnext() ' Determina ROM code altri dispositivi 1-WIRE End If Loop Until Romcode_ow(1) = &H10 Or Hlpw = Ndev_ow ' Ripete fino a DS18S20 trovato od ultimo dispositivo Else Romcode_ow(1) = 0 ' Forza condizione per DS18S20 non trovato End If If Romcode_ow(1) = &H10 Then ' Se DS18S20 trovato Print "Sensore DS18S20 trovato." Print "Temperatura acquisita in gradi centigradi" Err_ow = 0 ' Azzera errori avvenuti su comunicazione 1-WIRE Do ' Inizio ciclo infinito Call Gettemp_ow() ' Acquisisce temperatura del sensore 1-WIRE DS16S20 (dura 1 secondo) If Err_ow = 0 Then ' Se nessun errore avvenuto Gstr = Fusing(tdec_ow , "000.#") ' Formatta temperatura con tre cifre intere ed una decimale Print " " ; Gstr ; " "; ' Rappresenta temperatura valida acquisita e formattata Else Print "Errori: " ; Err_ow; ' Rappresenta errori avvenuti su comunicazione 1-WIRE Err_ow = 0 ' Azzera errori avvenuti su comunicazione 1-WIRE End If Printbin Cret ' Mantiene rappresentazione su stessa riga Loop ' Fine ciclo infinito Else Print "Sensore DS18S20 non trovato!" Print "Controllare collegamenti e rieseguire il programma." End If End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Gestione acquisizione temperatura attuale del sensore 1-WIRE DS16S20. ' La procedura prima invia il comando di conversione e poi quello di lettura ' risultato dell'ultima conversione (Scratchpad area), in un tempo di circa 1 ' secondo. Il risultato letto viene anche verificato in termini di validità ' tramite l'apposito CRC presente nella Scratchpad area. ' Ingresso: Romcode_ow() = Vettore per 8 bytes del ROM code 1-WIRE ' Err_ow = Errori avvenuti su comunicazione 1-WIRE ' Uscita: Tdec_ow = Temperatura decimale (in °C) acquisita da sensore ' Err_ow = Errori avvenuti su comunicazione 1-WIRE aggiornati Sub Gettemp_ow() 1wverify Romcode_ow(1) ' Invia ROM command "Match ROM" a sensore DS18S20 trovato Err_ow = Err_ow Or Err ' Aggiorna errori avvenuti su comunicazione 1-WIRE 1wwrite &H44 ' Invia function command "Convert T" a sensore DS18S20 Wait 1 ' Ritardo di 1 secondo in cui il sensore converte la temperatura 1wverify Romcode_ow(1) ' Invia ROM command "Match ROM" a sensore DS18S20 trovato Err_ow = Err_ow Or Err ' Aggiorna errori avvenuti su comunicazione 1-WIRE 1wwrite &HBE ' Invia function command "Read Scratchpad" a sensore DS18S20 Scrpad_ow(1) = 1wread(9) ' Legge 9 bytes della Scratchpad area da sensore DS18S20 Crc_ow = Crc8(scrpad_ow(1) , 8) ' Calcola CRC polinomiale base 8 su 8 bytes con dati della Scratchpad area If Crc_ow <> Scrpad_ow(9) Then ' Se CRC calcolato e ricevuto (su nono byte della Scratchpad area) non coincidono Err_ow = Err_ow Or &H02 ' Aggiunge errore di CRC avvenuto su comunicazione 1-WIRE End If ' Ottiene temperatura intera (in 0,5 °C) dai due byte della Scratchpad area Tint_ow = Scrpad_ow(2) ' Preleva MSB Shift Tint_ow , Left , 8 ' Sposta MSB Tint_ow = Tint_ow Or Scrpad_ow(1) ' Aggiunge LSB ' Trasforma temperatura intera (in o,5 °C) in decimale (in °C) Tdec_ow = Tint_ow ' Salva temperatura intera ottenuta su variabile single Tdec_ow = Tdec_ow / 2.0 ' Ottiene temperatura in °C End Sub '******************* Fine procedure usate dal programma ************************