' ********************************************************************** ' * File gmbiob.bas - Rel. 1.1 con Bascom 8051 DEMO IDE e LIB 2.0.11.0 * ' * GRIFO(R) via Dell'Artigiano 8/6 40016 S. Giorgio di Piano (BO) * ' * Scheda: GMB HR168 + GMM AC2 * ' * 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 24.02.04 * ' ********************************************************************** ' ' ' Questo Demo permette di utilizzare immediatamente sia le uscite che ' gli ingressi bufferati disponibili rispettivamente su CN1,CN2 e ' CN3,CN4. ' Tramite la console si puo' visualizzare lo stato dei sedici ingressi ' NPN/PNP oppure settare lo stato degli otto 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. ' ' ' ' !!!!!!!!!!!!!!!!!!!!! ATTENZIONE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ' Nel menu Options/Compiler/Misc impostare: ' - Byte End(hex) ad almeno A0 ' ' ' 24.02.04 - Rel 1.1 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 ************************** ' $regfile = "89c51ac2.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 ' ' '****************** Dichiarazione delle variabili ********************** ' ' Uso generico Dim V As Byte , S As Byte , T As Byte ' Byte di uso generico ' Contatore interrupts Dim Cntintr1 As Byte , Cntintr2 As Byte , Cntintt0 As Byte ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Init() ' Inizializzazione Declare Sub Set_relays_out(v As Byte) ' Imposta lo stato dei rele' Declare Sub Get_opto_in_a(v As Byte) ' Legge gli ingressi Opto A Declare Sub Get_opto_in_b(v As Byte) ' Legge gli ingressi Opto B Declare Sub Richiedi_tasto() Declare Sub Leggi_attesa() ' '************************* Programma main ****************************** ' Main: Call Init() ' Inzializza il modulo Do Do Print Chr(clrscr) print " Print "Esempio di utilizzo degli ingressi su CN1,CN2 e delle uscite su CN3,CN4" 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 CN1,CN2" Call Richiedi_tasto() Print Print "CN1 CN2" S = Adcf S.1 = 0 S.2 = 0 Adcf = S ' Setta P1.1 e P1.2 come I/O Do Do Call Get_opto_in_b(v) ' CN1 S = V Call Get_opto_in_a(v) ' CN2 Printhex S ; " " ; V ; Printbin Cret ; Call Leggi_attesa() Loop Until S <> 0 Print Print Print "Pin 3 di CN1 e' anche trigger di int0, pin 4 di int1." Print "Una transizione H-L attiva 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' contatore,IN 5 di CN1 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 Call Set_relays_out(0) Do Inputhex "Digitare cifra hex (00 esce): " , S Printhex S Call Set_relays_out(s) ' Imposta le uscite Loop Until S = 0 Call Set_relays_out(0) Print Print "I segnali su CN3 possono svolgere funzioni evolute derivate dai segnali PCA:" Print "temporizzatori,generazione PWM,ecc." Print "L'uscita A1 si attiva con frequenza 1 Hz e duty cicle del 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 Call Set_relays_out(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 uscite a rele' ' Se il Bit e' 1 il corrispondente rele' viene chiuso, altrimenti viene aperto ' V.0 comanda RL1 ' V.1 comanda RL2 ' V.2 comanda RL3 ' V.3 comanda RL4 ' V.4 comanda RL5 ' V.5 comanda RL6 ' V.6 comanda RL7 ' V.7 comanda RL8 Sub Set_relays_out(v As Byte) P1.4 = Not V.0 P1.5 = Not V.1 P1.6 = Not V.2 P1.7 = Not V.3 P4.0 = Not V.4 P4.1 = Not V.5 P2.2 = Not V.6 P1.3 = Not V.7 End Sub ' ' ' Legge gli ingressi optoisolati di CN2 ' Sub Get_opto_in_a(v As Byte) ' V.0 legge IN1A ' V.1 legge IN2A ' V.2 legge IN3A ' V.3 legge IN4A ' V.4 legge IN5A ' V.5 legge IN6A ' V.6 legge IN7A ' V.7 legge IN8A V.0 = P0.0 V.1 = P0.1 V.2 = P0.2 V.3 = P0.3 V.4 = P0.4 V.5 = P0.5 V.6 = P0.6 V.7 = P0.7 End Sub ' ' ' Legge gli ingressi optoisolati di CN1 ' Sub Get_opto_in_b(v As Byte) ' V.0 legge IN1B ' V.1 legge IN2B ' V.2 legge IN3B ' V.3 legge IN4B ' V.4 legge IN5B ' V.5 legge IN6B ' V.6 legge IN7B ' V.7 legge IN8B V.0 = P1.1 V.1 = P1.2 V.2 = P3.2 V.3 = P3.3 V.4 = P3.4 V.5 = P3.5 V.6 = P3.6 V.7 = P3.7 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 P0 = &HFF ' Setta port 3 in input S = P0 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