' ********************************************************************** ' * File gmbiot.bas - Rel. 1.1 con Bascom 8051 DEMO IDE e LIB 2.0.11.0 * ' * Scheda: GMM 936 + GMB HR84 * ' * 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 * ' * by Graziano Gaiba del 01.06.05 * ' ********************************************************************** ' ' ' Questo Demo permette di utilizzare immediatamente le linee di I/O digitale TTL ' presenti su CN4. A seconda del Mini Modulo utilizzato, viene presentata ' la lista delle linee disponibili. Una volta selezionata quella d'interesse ' la si puo' gestire in input (rappresentando il suo stato sulla console) o ' in output (settandola alta o bassa). Qualora la linea scelta sia associata ' all'interrupt del Real Time Clock del Mini Modulo, la gestione avviene tramite ' questa periferica. ' ' 01.06.05 - Rel 1.1 By Graziano Gaiba ' ' '********************** Direttive del compilatore ****************************** 'N.B. Nella finestra Options | Compiler | Misc effettuare i seguenti ' settaggi: Register File = 89LPC936.DAT ' Byte End(Hex) = A0 $regfile "89lpc936.dat" $romstart = &H0 ' Ind. inizio codice in FLASH $ramstart = &H0 ' Ind. inizio area dati in XRAM $ramsize = &H200 ' Dimensioni area dati in XRAM $crystal = 11059200 ' Massima Fclock della scheda $baud = 19200 ' Velocità comunicazione seriale $large ' Dimensione codice > 2K $map ' Genera info per debug ' per ogni linea di codice ' ' ' '****************** 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 Rcint = 7372800 ' Frequenza clock da RC interno Const Qz11m = 11059200 ' Frequenza clock da quarzo esterno ' '****************** Dichiarazione delle variabili ********************** ' ' Variabili ad uso generico Dim I As Byte , V As Byte , S As Byte , T As Byte ' Byte di uso generico Dim S0 As Bit Dim Hlpb As Byte , M As Byte ' Byte ad uso generico Dim Hlpw As Word , Ind As Word ' Word ad uso generico Dim Hlpl As Long ' Long ad uso generico ' Variabili per gestione comunicazione seriale, clock e ritardi Dim St As Byte Dim Br As Long ' Buad Rate seriale Dim Cclk As Long ' Frequenza clock della CPU Dim R As Word , Rit1ms As Word , Rit As Word ' Gestione ritardi ' Variabili per gestione Port di I/O digitale Dim M1 As Byte , M2 As Byte , Dir As Byte ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Get_clk ' Acquisizione frequenza clock Declare Sub Init ' Inizializzazione generale Declare Sub Ritardo(rit As Word) ' Effettua ritardo calibrato Declare Sub Iniser(br As Long , St As Byte) ' Inizializzazione seriale Declare Sub Check ' Verifica periferiche Declare Sub Mostra_run ' Visualizza partenza programma ' Declare Sub Inidir(dir As Byte) ' Inizializza direzione segnali CN4 ' ' '************************* Programma main ****************************** ' Main: Call Init Call Get_clk ' Preleva frequenza della CPU Call Iniser(19200 , 1) ' Inizializza seriale x console ' ' ' Effettua un ritardo di circa 2 secondi in modo da assicurare la ' partenza del programma di emulazione terminale per console (es. ' HYPERTERMINAL) e contemporaneamente fa` lampeggiare il LED di ' attivita` DL1 della scheda. ' Usa la variabile generale i P0m1 = P0m1 Or &H40 ' Setta P0.6 in modo 3=OpenDrain P0m2 = P0m2 Or &H40 For I = 1 To 16 ' 16 cicli da 125 msec = 2 sec P0.6 = Not P0.6 ' Complementa LED attivita` Call Ritardo(125) ' Ritardo di circa 125 msec Next I Print Chr(clrscr) Print "Demo 1.1 per GMM936 ds300803+GMBHR84 ds220503" Call Check ' Controllo interno Print Print "I/O TTL su CN4" Do Print Print "1) Pin 8 (pull down da 4,7 Kohm sempre presente)" Print "2) Pin 6" Print "3) Pin 2" Print "4) Pin 3" Print "5) Pin 5" Print Print "Scelta: "; Do V = Inkey Loop Until V <> 0 Print Chr(v) Print Print "Input/Output (I/O)? "; Do T = Inkey() ' Attesa sospensiva di un tasto Loop Until T <> 0 Print Chr(t) T = T Or &H20 ' Converte in minuscolo If T = "i" Then ' Setta tutti i segnali di CN4 in quasi-bidirectional Call Inidir(0) Print "Premere tasto per uscire" Print "Stato pin:" Do If V = "1" Then S0 = P2.4 ' Pin 8 di CN4 End If If V = "2" Then S0 = P2.6 ' Pin 6 di CN4 End If If V = "3" Then S0 = P2.5 ' Pin 2 di CN4 End If If V = "4" Then S0 = P2.2 ' Pin 3 di CN4 End If If V = "5" Then S0 = P2.3 ' Pin 5 di CN4 End If Print S0 ; Chr(13); Waitms 200 S = Inkey Loop Until S <> 0 Else ' Setta tutti i segnali di CN4 in push pull Call Inidir(1) Do Print "Stato pin (0/1,2 esce): "; Do T = Inkey Loop Until T <> 0 Print Chr(t) T = T - 48 ' Converte da carattere numerico a valore If T = 0 Or T = 1 Then S0 = T.0 If V = "1" Then P2.4 = S0 ' Pin 8 di CN4 End If If V = "2" Then P2.6 = S0 ' Pin 6 di CN4 End If If V = "3" Then P2.5 = S0 ' Pin 2 di CN4 End If If V = "4" Then P2.2 = S0 ' Pin 3 di CN4 End If If V = "5" Then P2.3 = S0 ' Pin 5 di CN4 End If End If Loop Until T = 2 End If Loop ' '*************** Procedure di risposta agli interrupts ***************** ' End ' '************************ Fine del programma *************************** ' ' '**************************** Procedure ******************************** ' ' '*********************** Procedure gestione Port I/O *************************** ' ' ' ' ' Inizializza risorse, variabili e periferiche in modo da poter eseguire ' correttamente tutto il programma demo. Sub Init Disable Interrupts ' Disabilita gli interrupts P1m1 = 0 ' Necessario per la seriale RS232 ' IN1 <- P0.0 ' IN2 <- P0.1 ' IN3 <- P0.2 ' IN4 <- P1.4 ' IN5 <- P0.3 ' IN6 <- P0.4 ' IN7 <- P0.5 ' IN8 <- P0.7 ' ' OUT A1 -> P1.6 ' OUT A2 -> P1.7 ' OUT B1 -> P2.1 ' OUT B2 -> P2.7 Pt0ad = 0 ' P0.1-5 come I/O non c. analogico M1 = P0m1 ' Imposta P0.0-5 e P0.7 come solo input M2 = P0m2 M1 = M1 Or &HDF M2 = M2 And &H40 P0m1 = M1 P0m2 = M2 ' M1 = P1m1 ' Imposta P1.4 come solo input e M2 = P1m2 ' P1.6 e P1.7 come open drain output M1 = M1 Or &HD0 M2 = M2 Or &HC0 M2 = M2 And &HEF P1m1 = M1 P1m2 = M2 ' M1 = P2m1 ' Imposta P2.1 e P2.7 come M2 = P2m2 ' open drain output M1 = M1 Or &H82 M2 = M2 Or &H82 P2m1 = M1 P2m2 = M2 End Sub ' ' '*********************** Procedure gestione Port I/O *************************** ' Inizializza gli 8 pin della CPU collegati ai pin di CN4 sulla GMB HR84: ' pin 2 -> P2.5 pin 3 -> P2.2 pin 5 -> P2.3 pin 6 -> P2.6 pin 8 -> P2.4 ' nella modalita` di I/O passata nel parametro dir(0..3), lasciando ' inalterato lo stato di tutte le altre linee. ' I valori possibili per dir sono: ' 0 : Imposta i segnali come Quasi-bidirectional output ' 1 : Imposta i segnali come Push Pull ' 2 : Imposta i segnali come Solo Input (alta impedenza) ' 3 : Imposta i segnali come Open Drain Sub Inidir(dir As Byte) M1 = P2m1 M2 = P2m2 Select Case Dir ' Verifica modalita` passata Case 0 : ' Quasi-bidirectional output M1 = M1 And &H83 M2 = M2 And &H83 Case 1 : M1 = M1 And &H83 ' Push Pull M2 = M2 Or &H7C Case 2 : M1 = M1 Or &H7C ' Solo Input (alta impedenza) M2 = M2 And &H83 Case 3 : M1 = M1 Or &H7C ' Open Drain M2 = M2 Or &H7C End Select P2m1 = M1 P2m2 = M2 End Sub ' ' ' Effettua un ritardo del numero di millisecondi passato nel parametro rit, ' tenendo conto della frequenza di clock salvata nella variabile cclk senza ' usare le istruzioni BASCOM che usano un valore predefinito e costante di ' clock. Sub Ritardo(rit As Word) If Cclk = Rcint Then Rit1ms = 73 ' Valore sperimentale per 1 msec a 7 MHz Else Rit1ms = 110 ' Valore sperimentale per 1 msec a 11 MHz End If Do For R = 0 To Rit1ms ' Ciclo per ritardo di 1 msec Next R Rit = Rit - 1 Loop Until Rit = 0 End Sub ' ' ' Effettua un ritardo di circa 2 secondi in modo da assicurare la ' partenza del programma di emulazione terminale per console (es. ' HYPERTERMINAL) e contemporaneamente fa` lampeggiare il LED di ' attivita` DL1 della scheda. ' Usa la variabile generale i Sub Mostra_run P0m1 = P0m1 Or &H40 ' Setta P0.6 in modo 3=OpenDrain P0m2 = P0m2 Or &H40 For I = 1 To 16 ' 16 cicli da 125 msec = 2 sec P0.6 = Not P0.6 ' Complementa LED attivita` Call Ritardo(125) ' Ritardo di circa 125 msec Next I End Sub ' ' '************************* Procedure gestione seriale ************************** ' Inizializza la linea seriale con: ' Bit x chr = 8 ' Stop bit = 1 o 2 a seconda del parametro ST ' Parity = None ' Baud rate = valore nel parametro BR ' usando l'apposito baud rate generator del micro e la frequenza di clock salvata ' nella variabile globale cclk. ' Usa le variabili generali hlpw,hlpl Sub Iniser(br As Long , St As Byte) Pcon = Pcon And &HBF ' Azzera bit SMOD0 x settare modo If St = 1 Then Scon = &H52 ' Modo 1 (1 stop),No multiproc,Attiva rx Else Scon = &HDA ' Modo 3 (2 stop),No multiproc,Attiva rx End If Brgcon = &H02 ' Imposta baud rate passato Hlpl = Br * 16 ' Calcola divisore per baud Hlpl = Cclk - Hlpl Hlpl = Hlpl / Br Hlpw = Loww(hlpl) Brgr0 = Low(hlpw) Brgr1 = High(hlpw) Brgcon = &H03 End Sub ' ' ' '************************ Procedure di uso generale **************************** ' Legge il byte di configurazione UCFG1 in FLASH grazie alle procedure IAP del ' Boot Rom del P89LPC932. Restituisce la variabile globale cclk settata con la ' frequenza di clock della CPU, senza controllare gli eventuali errori. Sub Get_clk mov A,#&H03 ' Usa comando Misc. Read mov R7,#&H00 ' Legge registro UCFG1 lcall &HFF03 ' Chiama proc. IAP ad ind. PGM_MTP mov A,R7 ' Salva risultato anl A,#&H07 ' Mantiene bit con clock CPU Select Case Acc Case &H00 : Cclk = Qz11m ' Frequenza clock da quarzo esterno Case &H03 : Cclk = Rcint ' Frequenza clock da RC interno End Select End Sub ' ' ' Controllo correttezza periferiche interne con eventuali ritentativi ' Usa le variabili generali st,t,m,ind,hlpw Sub Check Deecon = &H01 T = Peek(&Hff) Deeadr = &HFF T = 1 Ind = &HF7 Do M = Peek(&H07) If M.7 = 1 Then M = M And &H03 Ind = M + &HF8 T = Peek(ind) Else T = 0 End If St = Deecon And &H80 Loop Until St <> 0 St = Deedat Do S = Peek(ind) Incr Ind If Ind = &HFF Then Ind = &HF9 Do M = S If St = 0 Then Incr T End If Loop Until St.0 = 0 Or T > M Loop Until St = 0 End Sub