' ********************************************************************** ' * File: gmbser.bas - Rel. 1.1 con Bascom AVR IDE e LIB 1.11.7.4 * ' * Schede: GMB HR168 + GMM AM128 * ' * 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 17.06.05 * ' ********************************************************************** ' ' 17.06.05 - Rel 1.1 By Graziano Gaiba ' Il demo e' un semplice esempio di comunicazione in grado di operare con tutti ' i protocolli elettrici disponibili su CN6 (RS 232, RS 422, RS 485, ' current loop o TTL). In dettaglio, tramite funzioni a basso livello, ' e' possibile programmare il baud rate da console, poi ogni carattere ricevuto ' dalla seriale viene ritrasmesso sulla stessa; la ricezione del carattere 'r' ' determina la gestione della direzione (segnale DIR) per RS 422 e RS 485. ' ' ' !!!!!!!!!!!!!!!!!!!!!!!!!!! IMPORTANTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ' Nel menu Options | Compiler | Chip, impostare: ' ' Chip: M128 ' HW Stack: almeno 64 ' Soft Stack: almeno 32 ' Framesize: almeno 64 ' ' '****************** Direttive del compilatore ************************** ' $regfile = "m128def.dat" $crystal = 7372800 $baud = 19200 ' '****************** 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 Ee_timeout = 50000 Const Attivo = 1 ' Valore per attivare il driver 422 o 485 Const Disattivo = 0 ' Valore per disattivare il driver 422 o 485 ' '****************** Dichiarazione delle variabili ********************** ' ' Uso generico Dim Dir_ser As Bit ' Stato driver trasmissione ' Per le procedure di basso livello Dim Char As Byte Dim Rate As Long ' Baud rate richiesto dall'utente Ri Alias Usr.rxc ' Ricezione completa Ti Alias Usr.txc ' Trasmissione completa ' '****************** Dichiarazione delle procedure ********************** ' Declare Sub Init() ' Inizializzazione Declare Sub Txa(byval C As Byte) ' Gestisce la trasmissione sulla seriale A Declare Function Rxa() As Byte ' Gestisce la ricezione sulla seriale A Declare Sub Check_ready() Declare Function Check_ready_2() As Byte ' '************************* Programma main ****************************** ' Main: Call Init() ' Inizializza il demo Portf.4 = 1 ' Spegne i relays Portf.5 = 1 Portf.6 = 1 Portf.7 = 1 Portb.3 = 1 Portb.2 = 1 Portb.1 = 1 Porte.2 = 1 Print Chr(clrscr); ' Pulisce lo schermo Print "Demo 1.1 per GMM AM128 + GMB HR168" Print Call Check_ready() ' Verifica scheda pronta ' Spiegazione sulla gestione dell'UART in RS 232 e TTL Print Print "Per RS 232: settare ON gli switch 2 e 3 e OFF gli switch 4 e 5 di DSW1." Print "La Gestione Software e' Bascom,Vedere Documentazione Per piu' informazioni" Print "Settando OFF gli switch 2 e 3 e ON gli switch 4 e 5,sullo zoccolo" Print "vanno i segnali TTL dell'UART." Print Print "Premere un tasto per continuare..." Char = Waitkey() Print Print "Collegare J10 in 1-2." ' La comunicazione e' a basso livello perche' ' BASCOM non gestisce la direzione ad alto livello Print Input "Baud rate:" , Rate ' UBRR = (7372800 / (16 * BaudRate)) - 1 Rotate Rate , Left , 4 Rate = 7372800 / Rate Decr Rate ' Prima di riprogrammare la seriale bisogna svuotare il buffer di trasmissione Waitms 10 ' Bit x chr = 8" ' Stop bit = 1" ' Parity = No" ' Handshake = No" ' Baud rate = 19200" ' Inizializza Seriale 8 Bit , 1 Stop , No Interrupt Ucsr0a.1 = 0 Ucsr0b.4 = 1 Ucsr0b.3 = 1 Ucsr0b.2 = 0 Ucsr0c.6 = 0 Ucsr0c.5 = 0 Ucsr0c.4 = 0 Ucsr0c.3 = 0 Ucsr0c.2 = 1 Ucsr0c.1 = 1 ' Setta Baud Rate A 19200 Ubrr1h = 0 Ubrr1l = Rate Print "Testare in RS232,poi configurare GMB per altro protocollo:" Print "togliere alimentazione,settare DSW1:" Print "2=3=OFF,4=5=ON,poi" Print Print "RS422:" Print "-montare SN75176 o MAX483 su IC10 e IC11" Print "-J5=2-3 J6,J7,J8=1-2 J10=1-2" Print Print "RS485:" Print "-montare SN75176 o MAX483 su IC10" Print "-J5=1-2 J6,J7,J8=1-2 J10=1-2" Print Print "Scheda a un capo rete->J3 e J4 chiusi" Print "R commuta trasmettitore" Dir_ser = Disattivo ' memorizzo lo stato Porte.3 = 0 Do Char = Rxa() ' ricevo dalla seriale A If Char <> 0 Then ' è presente un carattere nella seriale A Call Txa(char) ' Trasmetto il carattere sulla seriale A Char = Char Or &H20 ' Metti in minuscolo If Char = "r" Then If Dir_ser = Attivo Then ' se era disattivo Porte.3 = 1 ' attiva la trasmissione ' del driver 422 o 485 Dir_ser = Disattivo Else ' viceversa Porte.3 = 0 ' disattiva la trasmissione ' del driver 422 o 485 Dir_ser = Attivo End If End If End If Loop End Do Loop ' '************************ Fine del programma *************************** ' ' '****************************************************************************** '* Procedure di gestione specifiche del demo * '****************************************************************************** ' ' ' ' Inizializza il demo ' Sub Init() ' Inizializza la direzionalita' dei port che pilotano gli ingressi optoisolati ' e le uscite a rele': ' IN1-1 - Portb.7 ' IN2-1 - Portb.6 ' IN3-1 - Porte.4 ' IN4-1 - Porte.5 ' IN5-1 - Portd.7 ' IN6-1 - Porte.6 ' IN7-1 - Portb.4 ' IN8-1 - Portb.0 Ddrb.7 = 0 Ddrb.6 = 0 Ddre.4 = 0 Ddre.5 = 0 Ddrd.7 = 0 Ddre.6 = 0 Ddrb.4 = 0 Ddrb.0 = 0 ' IN1-2 - Portc.0 ' IN2-2 - Portc.1 ' IN3-2 - Portc.2 ' IN4-2 - Portc.3 ' IN5-2 - Portc.4 ' IN6-2 - Portc.5 ' IN7-2 - Portc.6 ' IN8-2 - Portc.7 Ddrc = 0 ' OUT A1 - Portf.4 ' OUT A2 - Portf.5 ' OUT B1 - Portf.6 ' OUT B2 - Portf.7 ' OUT C1 - Portb.3 ' OUT C2 - Portb.2 ' OUT D1 - Portb.1 ' OUT D2 - Porte.2 (di default, ovvero con J10 in 3-4) Ddrf.4 = 1 Ddrf.5 = 1 Ddrf.6 = 1 Ddrf.7 = 1 Ddrb.3 = 1 Ddrb.2 = 1 Ddrb.1 = 1 Ddre.2 = 1 Ddre.3 = 1 ' Segnale dir End Sub ' ' ************** Gestisce la trasmissione sulla seriale A ********************** ' * Questa procedura permette di trasmettere un carattere alla volta sulla * ' * seriale A, il carattere da trasmettere risiede nella variabile CHAR * ' ****************************************************************************** ' Sub Txa(byval C As Byte) ' Gestisce la trasmissione sulla seriale A Bitwait Ti , Set ' attendo che sia trasmesso il carattere ' precedente Ti = 1 Udr = C ' trasmetto il carattere End Sub ' ' ************** Gestisce la ricezione sulla seriale A ************************* ' * Questa procedura restituisce il carattere ricevuto sulla seriale A e lo * ' * mette nella variabile Valore, se non c'è nessun carattere, restituisce il * ' * CHAR= 0. * ' ****************************************************************************** ' Function Rxa() As Byte ' Gestisce la ricezione sulla seriale A If Ri = 1 Then Rxa = Udr ' leggo il carattere ricevuto Else Rxa = 0 ' nessun carattere ricevuto End If End Function ' '****************************************************************************** '* Procedure di uso generico * '****************************************************************************** ' ' ' ' Funzione di supporto della Check_ready(). ' Function Check_ready_2() As Byte Local Time_out As Word , I As Byte Time_out = 0 ' Contatore timeout Do Incr Time_out ' Incrementa contatore Loop Until Twcr.twint = 1 Or Time_out = Ee_timeout I = Twsr I = I And &HF8 Check_ready_2 = I End Function ' ' ' Controlla che la scheda sia pronta ' Sub Check_ready() Local Check As Byte , Test As Byte Do ' Ciclo attesa scheda pronta Twsr = Twsr And &HFC Check = Twdr Or &HF4 Test.4 = Not Check.3 Twbr = 72 Twcr = &HA4 Check = Check_ready_2() Test = Check Or Twcr If Check = &H09 Then Test = &H67 Else Test.1 = Not Test.1 End If Twdr = &HA0 Twcr = &H84 Check = Check_ready_2() Twcr = &H94 Waitms 27 Loop Until Check = &H18 Or Test <> 1 Twcr.twen = 0 End Sub