' ********************************************************************** ' * File: uk_BASAVR_051.BAS * ' * Version: 1.1 * ' * Date: 13.09.11 * ' * Development Tools: Bascom-AVR Demo Ver. 1.11.9.1 + * ' * + AVR bootloader grifo(r) Ver. 1.2 * ' * Cards: GMM AM08 + GMM TST3 * ' * Developed by: 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 * ' * Author: Gianluca Angelini * ' ********************************************************************** ' Example program 51 of BASCOM AVR course. ' Test and management program for I2C BUS EEPROM Atmel 24C08A, at byte ' high level, with BASCOM instructions. ' It performs the foundamental operations on the component by using a software ' I2C BUS interface and by interacting with user on a serial console provided of ' monitor and keyboard with a fixed physical protocol at 19200 Baud, 8 Bit ' x chr, 1 Stop bit, No parity. ' This console can be another system capable to support a serial RS 232 ' communication. In order to simplify the use it can be used a PC provided of ' one COMx line, that execute a terminal emulation program as HYPERTERMINAL or ' the homonym modality provided by BASCOM AVR (see IDE Configuration). ' The program works only when the GMM AM08 is mounted on Z2 socket of GMM TST3!! ' ' Added instructions: CONFIG SCL, CONFIG SDA, I2CINIT, I2CSTART, I2CWBYTE, ' I2CRBYTE, I2CSTOP. ' ' 13/09/11: uk_BASAVR_051.BAS - Ver 1.1 - By G.A. ' First version. ' ' '**************************** IDE Configurations ******************************* ' NOTE: in order to coorectly use this demo program, please execute the following ' steps: ' 1) Check the availability of M8DEF.DAT file into the directory where the ' BASCOM AVR is installed and copy it if not present. ' 2) Into the window "Options | Compiler | Chip" set: ' Chip: m8def.dat ' XRAM: None ' HW Stack: 64 ' Soft Stack: 32 ' Framesize: 64 ' XRAM waitstate: disabled ' External Access Enable: disabled ' 3) Into the window "Options | Communication" set: ' COM port = the PC line connected to GMM AM08, through GMM TST3 ' Baudrate = 19200 ' Parity = None ' Databits = 8 ' Stopbit = 1 ' Handshake = None ' Emulation = TTY ' Font = Terminal, Normal, 12 points, white colour ' Backcolor = Navy ' 4) At the end of compilation, after the code is programmed on GMM AM08, open ' the terminal emulation window of BASCOM AVR with the option: Tools | ' Terminal emulator (Ctrl+T) and then reset or powen on the Mini Module. '************************* Compiler directives ********************************* $regfile "M8DEF.DAT" ' Definitions file for used microcontroller $romstart = &H0 ' Code start address on FLASH $crystal = 7372800 ' Microcontroller crystal frequency $hwstack = 64 ' Hardware stack space $swstack = 32 ' Software stack space $framesize = 64 ' Frame space $map ' Generate debug information $baud = 19200 ' Serial communication speed: 19200 Baud ' Other parameters fixed to: 8 bit x chr ' 1 Stop bit ' No parity '******************************* Definitions *********************************** ' The resources used by program are connected as described in following table. ' !!! Note: On GMM TST3 the jumpers must be set in following positions: ' 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 !!! ' ' 24C08A GMM TST3 pin Z2 pin Signal Signal ' signal resource GMM TST3 GMM AM08 GMM AM08 uP ' SCL CN3.15 12 6 PC5 ADC5 SCL PC5 ' SDA CN3.16 13 7 PC4 ADC4 SDA PC4 ' Vcc CN4.18 34 28 +5 Vdc Vcc ' GND CN4.17 20 14 GND GND ' ' Signal pin COMx pin CN5 pin Z2 pin Signal Signal ' PC DB9 GMM TST3 GMM TST3 GMM AM08 GMM AM08 uP ' TX 3 3 9 3 RxD RS232 PD0 ' RX 2 2 10 4 TxD RS232 PD1 ' GND 5 5 20 14 GND - ' This table shows that the connection cable between PC COM line and CN5 of ' GMM TST3 is a normal pin to pin cable or direct. Grifo(r) can supply it by ' requesting the CCR 9+9E code. Pinrx Alias Ddrd.0 ' Bit with direction signal connected to GMM AM08 RxD Pintx Alias Ddrd.1 ' Bit with direction signal connected to GMM AM08 TxD '************************* Constants declaration ******************************* '************************* Variables declaration ******************************* Dim Hlpb As Byte ' General purpose help byte variable Dim Choice As Byte ' Selected operation Dim I2cbyte As Byte ' Byte to communicate with I2C BUS interface Dim Addi2c As Word ' Address to send with I2C BUS interface Dim Dati2c As Byte ' Data to communicate with device I2C BUS interface '************************ Subroutines declaration ****************************** Declare Sub Ask_key() ' Ask and wait a key pressure Declare Sub Ini_i2c() ' Initialize lines used for the software I2C BUS interface Declare Sub Read_i2cee() ' Read a byte from I2C BUS EE Declare Sub Write_i2cee() ' Write a byte on I2C BUS EE '****************************** Main program *********************************** Main: Pinrx = 0 ' Initialize signals for serial communication Pintx = 0 ' as digital inputs Call Ini_i2c() ' Initialize lines used for software I2C BUS interface Print ' Separate from previous visualization by showing 2 empty new line on console Print Print " 24C08A I2C BUS EEPROM management with GMM AM08 + GMM TST3" Print "Mount Mini Module on Z2 of GMM TST3, connect EEPROM to CN3 as described in" Print " electric diagram." Do ' Begin endless loop Print ' Shows menu with available operations Print "R -> Read location" Print "W -> Write location" Print "Perform the choice by pushing the associated key: "; Choice = Waitkey() ' Wait selection of operation to execute Printbin Choice ' Shows performed choice Print If Choice >= "a" Then ' If choice is lower case Choice = Choice And &HDF ' Convert it in upper case End If Print ' Separate menu from following visualizations Select Case Choice ' Check converted choice Case "R": ' Selected operation is read EE location Input "Addrress of location to read (0..1023): " , Addi2c Call Read_i2cee() ' Read byte from I2C BUS EEPROM Print "Read data= " ; Dati2c Call Ask_key() ' Ask and wait a key pressure on console to allow results reading Case "W": ' Selected operation is write EE location Input "Addrress of location to write (0..1023): " , Addi2c Input "Data to write (0..255): " , Dati2c Call Write_i2cee() ' Write byte on I2C BUS EEPROM Print "Write performed." Call Ask_key() ' Ask and wait a key pressure on console to allow results reading Case Else: ' Selected operation is not valid Printbin &H07 ' Generate an advise BEL on console End Select Loop ' End endless loop End '*************************** End of main program ******************************* '*********************** Subroutines used by program *************************** ' Require and wait a key pressure on console ' Input: None ' Output: None Sub Ask_key() Print "Press a key to continue..."; Hlpb = Waitkey() Print End Sub ' Initialize signals and variables used for the I2C BUS interface managed by ' software ' Input: None ' Output: None Sub Ini_i2c() ' This subroutine has been developed for compatibility reason with demo ' programs for EEPROM with other protocols at low level. For I2C BUS protocol ' are used the BASCOM high level instructions. ' Connection of software I2C BUS interface signals (see on line help and ' previous table for further information) Config Scl = Portc.5 ' Microcontroller signal used as SCL signal of I2C BUS Config Sda = Portc.4 ' Microcontroller signal used as SDA signal of I2C BUS I2cinit ' Initialize I2C BUS signals End Sub ' Read a byte from 24C08A I2C BUS EEPROM. ' Input: Addi2c = EEPROM location address to read ' Output: Dati2c = data read from EEPROM Sub Read_i2cee() I2cbyte = High(addi2c) ' Obtain high byte of EEPROM address to read I2cbyte = I2cbyte And &H07 ' Mantain meaning part for 24Cxx EEPROM Shift I2cbyte , Left , 1 ' Convert high byte of address into slave address I2cbyte = I2cbyte Or &HA8 ' Add write slave address I2cstart ' Send start I2cwbyte I2cbyte ' Send obtained slave address I2cbyte = Low(addi2c) ' Obtain address, that is low byte of EEPROM address I2cwbyte I2cbyte ' Send address to read I2cstart ' Send repeated start I2cbyte = High(addi2c) ' Obtain high byte of EEPROM address to read I2cbyte = I2cbyte And &H07 ' Mantain meaning part for 24Cxx EEPROM Shift I2cbyte , Left , 1 ' Convert high byte of address into slave address I2cbyte = I2cbyte Or &HA9 ' Add read slave address I2cwbyte I2cbyte ' Send obtained slave address I2crbyte Dati2c , Nack ' Read data and arrange end of reading I2cstop ' Send stop End Sub ' Write a byte to 24C08A I2C BUS EEPROM. ' Input: Addi2c = EEPROM location address to write ' Dati2c = data to write on EEPROM ' Output: None Sub Write_i2cee() I2cbyte = High(addi2c) ' Obtain high byte of EEPROM address to write I2cbyte = I2cbyte And &H07 ' Mantain meaning part for 24Cxx EEPROM Shift I2cbyte , Left , 1 ' Convert high byte of address into slave address I2cbyte = I2cbyte Or &HA8 ' Add write slave address I2cstart ' Send start I2cwbyte I2cbyte ' Send obtained slave address I2cbyte = Low(addi2c) ' Obtain address, that is low byte of EEPROM address I2cwbyte I2cbyte ' Send address to write I2cbyte = Dati2c ' Data to write I2cwbyte I2cbyte ' Send data to write I2cstop ' Send stop Waitms 10 ' Wait end of write time for SPI EEPROM (5 msec on data sheet) End Sub '******************* End of subroutines used by program ************************