' ********************************************************************** ' * File gmbiob.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 12.05.03 * ' ********************************************************************** ' ' ' Questo Demo permette di utilizzare immediatamente sia le uscite che gli ' ingressi bufferati disponibili rispettivamente su CN1 e CN6. ' Tramite la console si puo' visualizzare lo stato degli otto ingressi NPN/PNP ' oppure settare lo stato dei quattro rele' di uscita. ' Inoltre vengono applicate le funzionalita' evolute offerte dal Mini Modulo, ' ad esempio: ingressi che generano interrupt, ingressi contati via hardware, ' uscite comandate da segnali periodici automatici, ecc. ' ' 09.04.03 - Rel 1.1 By Graziano Gaiba ' ' ' 12.05.03 - Rel 1.2 By Graziano Gaiba ' Ampliato per mostrare le complete potenzialita' degli ingressi e ' (counter e interrupt) e delle uscite (PWM) ' ' ' ' 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 On Int0 Risp_int0 Nosave On Int1 Risp_int1 Nosave On Timer0 Risp_int_t0 Nosave ' '****************** 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 ' Codice della scheda sulla quale gira il demo Const Can_gm1 = "1" Const Can_gm2 = "2" Const Gmm_5115 = "3" ' '****************** Dichiarazione delle variabili ********************** ' ' Scheda sulla quale gira il demo Dim Scheda As Byte ' Uso generico Dim V As Byte , S As Byte , T As Byte ' Byte di uso generico ' Ingressi optoisolati Dim In As Byte 'Uscite a rele' Dim Relays_out As Byte ' Contatore interrupts Dim Cntintr1 As Byte , Cntintr2 As Byte , Cntintt0 As Byte ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Init() ' Inizializzazione Declare Sub Get_inputs() ' Legge ingressi optoisolati Declare Sub Set_outputs(relays_out As Byte) ' Imposta uscite a rele' Declare Sub Richiedi_tasto() Declare Sub Leggi_attesa() ' '************************* Programma main ****************************** ' Main: Call Init() ' Inzializza il modulo Do Print Chr(clrscr); ' Pulisce lo schermo Print "Demo 1.2 per GMB HR84 ds 100203" Print Print "Specificare 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 Scheda = Inkey() ' Attesa sospensiva di un tasto Loop Until Scheda <> 0 Do Print Chr(clrscr) Print "Esempio di utilizzo degli ingressi su CN6 e delle uscite su CN1" Print Print "1) Input digitali" Print "2) Uscite a rele'" Print Print "SELEZIONE: "; Do V = Inkey Loop Until V <> 0 Print Chr(v) If V = "1" Then Print "Ingressi optoisolati su CN6" S = Adcf S.1 = 0 S.2 = 0 Adcf = S ' Setta P1.1 e P1.2 come I/O Do Call Richiedi_tasto() Do Call Get_inputs() Printhex In; Printbin Cret Call Leggi_attesa() Loop Until S <> 0 Print Print Print "Pin 3 di CN6 e' anche trigger di int0, pin 5 di int1." Print "Una transizione H-L attiva l'interrupt che incrementa il relativo contatore." Call Richiedi_tasto() Print "INT0 INT1" Tcon.0 = 1 ' Int0 scatta sul fronte calante Tcon.2 = 1 ' Int1 scatta sul fronte calante Enable Int0 ' Abilita int0 Enable Int1 ' Abilita int1 Enable Interrupts ' Abilita gli interrupts Cntintr1 = 0 ' Azzera contatori interrupts Cntintr2 = 0 Do Printhex Cntintr1 ; " " ; Cntintr2 ; 'Stampa contatori interrupts Printbin Cret ' Torna a inizio riga Call Leggi_attesa() Loop Until S <> 0 ' Esce alla pressione di un tasto Disable Interrupts ' Disabilita interrupts Disable Int0 ' Disabilita int0 Disable Int1 ' Disabilita int1 Loop Until S <> 0 Print Print Print "T0 e' configurato come contatore,pin 6 e' il suo trigger" Print "Ogni overflow genera un interrupt" Call Richiedi_tasto() Cntintt0 = 0 ' Bisogna SEMPRE fermare i timer prima di riconfigurarli Stop Timer0 ' Il BASCOM usa il timer 1 come generatore di baud rate. ' Se l'utente vuole usare Timer 1 deve gestire autonomamente la ' comunicazione seriale e non usare istruzioni come input, inkey o print ' Configura timer 0 come timer a 8 bit, trigger il pin T0, con autoreload Config Timer0 = Counter , Mode = 2 , Gate = Internal Tl0 = &HF0 ' Valore iniziale Th0 = &HE1 ' Valore di autoreload Enable Timer0 ' Abilita interrupt overflow timer 0 Enable Interrupts ' Abilita gli interrupt Start Timer0 Print "T0 N.INT" Do S = Counter0 Printhex S ; " " ; Cntintt0; 'Stampa contatore ' Leggere counter0 ferma automaticamente timer0, bisogna riattivarlo Start Timer0 Printbin Cret ' Torna a inizio riga Call Leggi_attesa() Loop Until S <> 0 ' Esce alla pressione di un tasto Disable Interrupts Disable Timer0 Stop Timer0 End If If V = "2" Then Print Chr(clrscr); Print "Demo uscite rele'" Print Do Print "Digitare cifra hex (0 esce): "; Do S = Inkey If S.6 = 1 Then S.5 = 0 ' Converte eventuale lettera in maiuscolo S = S - 48 ' Valore numerico If S > 9 Then S = S - 7 ' Aggiusta valore numerico Loop Until S >= 0 And S <= 15 Printhex S Call Set_outputs(s) ' Imposta le uscite Loop Until S = 0 Print Print "I segnali collegati alle uscite di CN1 possono svolgere funzioni evolute" Print "derivate dai segnali PCA, come temporizzatori, generazione PWM, ecc." Print "L'uscita A1 si attiva con una frequenza di circa 1 Hz e duty cicle del" Print "50%." Stop Timer0 ' Disattiva Timer Counter 0 ' Setta timer 0 come Timer a 13 bit (modo 0) Config Timer0 = Timer , Gate = Internal , Mode = 0 Counter0 = 0 ' Azzera valore attuale Start Timer0 ' Attiva Timer Counter 0 Cmod = &H04 ' Run In Idle , Tmr 0 Ovr , No Interrupt Ccon = &H40 ' Abilita PCA timer/counter Ccapm1 = &H42 ' Abilita PWM su modulo 1 PCA con duty cycle = 50% Ccap1h = &H80 Call Richiedi_tasto() Do Call Leggi_attesa() Loop Until S <> 0 Ccon = &H00 ' Disabilita Pca Timer / Counter Stop Timer0 ' Disattiva Timer Counter 0 End If Loop Loop Risp_int0: Incr Cntintr1 ' Incrementa contatore interrupt Return Risp_int1: Incr Cntintr2 ' Incrementa contatore interrupt Return Risp_int_t0: Incr Cntintt0 ' Incrementa contatore interrupt Return End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' ' Imposta le linee del port 2. ' P2.2, P2.3 e P2.4 sono disponibili per l'utente Sub Get_inputs() In = P3 ' I bit da 2 a 7 sono i pin da 3 a 8 In.0 = P1.1 ' Il bit 0 e' il pin 1 di CN6 In.1 = P1.2 ' Il bit 1 e' il pin 2 di CN6 End Sub ' Imposta uscite a rele' Sub Set_outputs(relays_out) P1.4 = Not Relays_out.0 ' Il bit 0 e' il pin 1 di CN1 P1.5 = Not Relays_out.1 ' Il bit 1 e' il pin 3 di CN1 P1.6 = Not Relays_out.2 ' Il bit 2 e' il pin 4 di CN1 P1.7 = Not Relays_out.3 ' Il bit 3 e' il pin 5 di CN1 ' Gli altri bit non hanno influenza End Sub ' Inizializza il demo Sub Init() 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 S = P3 End Sub Sub Richiedi_tasto() Print Print "Premere tasto per uscire" Print End Sub Sub Leggi_attesa() Waitms 200 S = Inkey End Sub