' ********************************************************************** ' * File: Corso_BASCOMAVR_049.BAS * ' * Versione: 1.1 * ' * Data: 23.11.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 049 del corso BASCOM AVR. ' Programma di prova e gestione EEPROM SPI Microchip 25LC040 a byte, a basso ' livello, senza istruzioni del BASCOM. ' Esegue le operazioni fondamentali sul componente con un'interfaccia SPI ' software ed interagendo con l'utente tramite 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: Nessuna. ' ' 23/11/09: Corso_BASCOMAVR_049.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 | 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 ' 4) 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 ' 25LC040 GMM TST3 GMM TST3 GMM AM08 GMM AM08 usato ' /CS CN4.1 32 26 PCO ADC0 PC0 ' SCK CN4.4 31 25 PC1 ADC1 PC1 ' SI CN4.3 30 24 PB1 OC1A PB1 ' SO CN4.6 29 23 PB0 ICP PB0 ' ' 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. Pincs Alias Portc.0 ' Bit con segnale d'uscita collegato a /CS della EE Pinsck Alias Portc.1 ' Bit con segnale d'uscita collegato a SCK della EE Pinsi Alias Portb.1 ' Bit con segnale d'uscita collegato a SI della EE Pinso Alias Pinb.0 ' Bit con segnale d'ingresso collegato a SO della EE 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 ******************************* '************************ Dichiarazioni variabili ****************************** Dim Choice As Byte ' Operazione scelta Dim Spibyte As Byte ' Byte da comunicare con interfaccia SPI Dim Addspi As Word ' Indirizzo da inviare con interfaccia SPI Dim Datspi As Byte ' Dato da comunicare a dispositivo con interfaccia SPI Dim Hlpb As Byte ' Variabile di aiuto ad uso generico '************************ Dichiarazioni procedure ****************************** Declare Sub Ask_key() ' Richiede ed attende la pressione di un tasto da console Declare Sub Ini_spi() ' Inizializza linee usate per l'interfaccia SPI software Declare Sub Comin_spi() ' Preleva un byte da interfaccia SPI software Declare Sub Comout_spi(byval Spibyte As Byte) ' Invia un byte su interfaccia SPI software Declare Sub Read_spiee() ' Legge un byte dalla EEPROM SPI Declare Sub Write_spiee() ' Scrive byte sulla EEPROM SPI Declare Sub Enawr_spiee() ' Attiva scrittura sulla EEPROM SPI Declare Sub Diswr_spiee() ' Disattiva scrittura sulla EEPROM SPI '************************** Programma principale ******************************* Main: Pinrx = 0 ' Inizializza segnali per comunicazione seriale Pintx = 0 ' come ingressi digitali Call Ini_spi() ' Inizializza linee usate per l'interfaccia SPI software Print ' Separa precedenti rappresentazioni su console Print Print " Gestione EEPROM SPI 25LC040 con GMM AM08 + GMM TST3" Print "Montare Mini Modulo su Z2 della GMM TST3, collegare EEPROM a CN4 come da schema." Do ' Inizio ciclo infinito Print ' Presenta menù con le possibili operazioni Print "R -> Legge locazione" Print "W -> Scrive locazione" Print "A -> Attiva scrittura" Print "D -> Disattiva scrittura" Print "Effettuare la scelta premendo il tasto associato: "; Choice = Waitkey() ' Attende scelta operazione da eseguire Printbin Choice ' Rappresenta scelta effettuata Print If Choice >= "a" Then ' Se scelta minuscola Choice = Choice And &HDF ' La converte in in maiuscolo End If Print ' Distanzia menù da rappresentazioni seguenti Select Case Choice ' Controlla scelta convertita Case "R": ' Scelta operazione di scrittura locazione EE Input "Indirizzo locazione da leggere (0..511): " , Addspi Call Read_spiee() ' Legge byte dalla EEPROM SPI Print "Dato letto= " ; Datspi Call Ask_key() ' Richiede ed attende da console per consentire lettura risultati Case "W": ' Scelta operazione di impostazione velocità Input "Indirizzo locazione da scrivere (0..511): " , Addspi Input "Dato da scrivere (0..255): " , Datspi Call Write_spiee() ' Scrive byte sulla EEPROM SPI Print "Scrittura effettuata." Call Ask_key() ' Richiede ed attende da console per consentire lettura risultati Case "A": ' Scelta operazione di attivazione cancellazione e scrittura Call Enawr_spiee() ' Attiva scrittura sulla EEPROM SPI Print "Scrittura attivata." Call Ask_key() ' Richiede ed attende da console per consentire lettura risultati Case "D": ' Scelta operazione di disattivazione cancellazione e scrittura Call Diswr_spiee() ' Disattiva scrittura sulla EEPROM SPI Print "Scrittura disattivata." Call Ask_key() ' Richiede ed attende da console per consentire lettura risultati Case Else: ' Scelta non valida Printbin &H07 ' Emette un BEL di avviso sulla console End Select Loop ' Fine ciclo infinito End '************************ Fine programma principale **************************** '****************** Inizio procedure usate dal programma *********************** ' Richiede ed attende la pressione di un tasto da console ' Ingresso: Nulla ' Uscita: Nulla Sub Ask_key() Print "Premere un tasto per continuare..."; Hlpb = Waitkey() Print End Sub ' Inizializza segnali e variabili usati per l'interfaccia SPI gestita via ' software ' Ingresso: Nulla ' Uscita: Nulla Sub Ini_spi() ' Connessioni linee dell'interfaccia SPI software (vedere help in linea e ' precedente tabella per ulteriori informazioni) Ddrb.0 = 0 ' Inizializza PB0=SO come ingresso digitale Pinsck = 0 ' Inizializza PC1=SCK come uscita digitale bassa Ddrc.1 = 1 Pinsi = 0 ' Inizializza PB1=SI come uscita digitale bassa Ddrb.1 = 1 Pincs = 1 ' Inizializza PC0=/CS come uscita digitale alta Ddrc.0 = 1 End Sub ' Comunica sull'interfaccia SPI gestita via software provvedendo a prelevare ' un byte dal dispositivo collegato. Gli 8 bits del byte sono prelevati sul ' livello alto del segnale SCK, con MSB per primo. ' Ingresso: Nulla ' Uscita: Spibyte = Dato prelevato Sub Comin_spi() For Hlpb = 1 To 8 ' Ciclo ripetuto per gli 8 bits da comunicare Shift Spibyte , Left , 1 ' Aggiorna bit attuale del dato ricevuto Pinsck = 1 ' Alza segnale SCK Spibyte.0 = Pinso ' Preleva stato bit attuale da segnale SO nel dato ricevuto Pinsck = 0 ' Abassa segnale SCK Next Hlpb End Sub ' Comunica sull'interfaccia SPI gestita via software provvedendo ad inviare ' un byte dal dispositivo collegato. Gli 8 bits del byte sono settati sul ' livello basso del segnale SCK, con MSB per primo. ' Ingresso: Spibyte = Dato da inviare ' Uscita: Nulla Sub Comout_spi(byval Spibyte As Byte) For Hlpb = 1 To 8 ' Ciclo ripetuto per gli 8 bits da comunicare Pinsi = Spibyte.7 ' Setta stato bit attuale del dato da inviare su segnale SI Pinsck = 1 ' Alza segnale SCK Shift Spibyte , Left , 1 ' Aggiorna bit attuale del dato da inviare Pinsck = 0 ' Abassa segnale SCK Next Hlpb End Sub ' Legge un byte dalla EEPROM SPI 25LC040. ' Ingresso: Addspi = indirizzo locazione EEPROM da leggere ' Uscita: Datspi = dato letto da EEPROM Sub Read_spiee() Pincs = 0 ' Abbassa segnale /CS Spibyte = High(addspi) ' Ottiene byte alto dell'indirizzo EEPROM da leggere Shift Spibyte , Left , 3 Spibyte = Spibyte Or &H03 ' Aggiunge codice comando READ Call Comout_spi(spibyte) ' Invia ad EEPROM byte con parte alta indirizzo e comando Spibyte = Low(addspi) ' Ottiene byte basso dell'indirizzo EEPROM da leggere Call Comout_spi(spibyte) ' Invia ad EEPROM byte con parte bassa indirizzo Call Comin_spi() ' Preleva byte da EEPROM Datspi = Spibyte ' Restituisce byte prelevato Pincs = 1 ' Alza segnale /CS End Sub ' Scrive un byte sulla EEPROM SPI 25LC040. ' Ingresso: Addspi = indirizzo locazione EEPROM da scrivere ' Datspi = dato da scrivere ' Uscita: Nulla Sub Write_spiee() Pincs = 0 ' Abbassa segnale /CS Spibyte = High(addspi) ' Ottiene byte alto dell'indirizzo EEPROM da scrivere Shift Spibyte , Left , 3 Spibyte = Spibyte Or &H02 ' Aggiunge codice comando WRITE Call Comout_spi(spibyte) ' Invia ad EEPROM byte con parte alta indirizzo e comando Spibyte = Low(addspi) ' Ottiene byte basso dell'indirizzo EEPROM da scrivere Call Comout_spi(spibyte) ' Invia ad EEPROM byte con parte bassa indirizzo Spibyte = Datspi ' Dato da scrivere in byte da inviare Call Comout_spi(spibyte) ' Invia ad EEPROM byte da scrivere Pincs = 1 ' Alza segnale /CS Waitms 10 ' Attende tempo fine scrittura EEPROM SPI (5 msec da data sheet) End Sub ' Attiva cancellazione e scrittura sulla EEPROM SPI 25LC040 ' Ingresso: Nulla ' Uscita: Nulla Sub Enawr_spiee() Pincs = 0 ' Abbassa segnale /CS Spibyte = &H06 ' Codice comando WREN (enable write operation) Call Comout_spi(spibyte) ' Invia ad EEPROM byte con comando Pincs = 1 ' Alza segnale /CS End Sub ' Disattiva cancellazione e scrittura sulla EEPROM SPI 25LC040 ' Ingresso: Nulla ' Uscita: Nulla Sub Diswr_spiee() Pincs = 0 ' Abbassa segnale /CS Spibyte = &H04 ' Codice comando WRDI (disable write operation) Call Comout_spi(spibyte) ' Invia ad EEPROM byte con comando Pincs = 1 ' Alza segnale /CS End Sub '******************* Fine procedure usate dal programma ************************