' ********************************************************************** ' * File: uk_BASAVR_048.BAS * ' * Version: 1.1 * ' * Date: 03.06.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 48 of BASCOM AVR course. ' The program reads and writes messages on Microwire EEPROM Microwire, Microchip ' 93LC46A. ' It performs the foundamental operations on the component by using a software ' Microwire 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: None. ' ' 03/06/11: uk_BASAVR_048.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 !!! ' ' 93LC46A GMM TST3 pin Z2 pin Signal Signal ' signal resource GMM TST3 GMM AM08 GMM AM08 uP ' CS CN4.1 32 26 PCO ADC0 PC0 ' SK CN4.4 31 25 PC1 ADC1 PC1 ' DI CN4.3 30 24 PB1 OC1A PB1 ' DO CN4.6 29 23 PB0 ICP PB0 ' 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. Pincs Alias Portc.0 ' Bit with output signal connected to CS of EE Pinsk Alias Portc.1 ' Bit with output signal connected to SK of EE Pindi Alias Portb.1 ' Bit with output signal connected to DI of EE Pindo Alias Pinb.0 ' Bit with input signal connected to DO of EE 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 ******************************* Const Max_msg_ee = 4 ' Maximum number of messages on EEPROM, starting from 0 Const Cod_msg_ee = &H5A ' Code that denote message saved on EEPROM '************************* Variables declaration ******************************* Dim Hlpb As Byte ' General purpose help byte variable Dim Choice As Byte ' Selected operation Dim Mwnbit As Byte ' Bits number to comunicate on Microwire interface Dim Mwout As Word ' Data to send with Microwire interface Dim Mwin As Word ' Data received from Microwire interface Dim Addmw As Word ' Address to send with Microwire interface Dim Datmw As Byte ' Data to communicate on Microwire interface Dim Msgstr As String * 20 ' String with message for EE Dim Lstr As Byte ' String with message length Dim Pstr As Byte ' Pointer to string with message Dim Chrstr As String * 1 ' Character of the message to generate Dim Nmsg As Byte ' Message number to read/write from/on EE Dim Msgsaved As Boolean ' Message saved on EE flag '************************ Subroutines declaration ****************************** Declare Sub Ini_mw() ' Initialize lines used for the software Microwire interface Declare Sub Com_mw(byval Mwout As Word , Mwin As Word , Byval Mwnbit As Byte ) ' Comunicate on software Microwire interface Declare Sub Read_mwee() ' Read a byte from Microwire EE Declare Sub Write_mwee() ' Write a byte son Microwire EE Declare Sub Enaew_mwee() ' Enable erase and write on Microwire EE Declare Sub Disew_mwee() ' Disable erase and write on Microwire EE Declare Sub Read_msg_mwee() ' Read a message from Microwire EE Declare Sub Write_msg_mwee() ' Write a message on Microwire EE Declare Sub Show_msg_mwee() ' Show the messages saved on Microwire EE '****************************** Main program *********************************** Main: Pinrx = 0 ' Initialize signals for serial communication Pintx = 0 ' as digital inputs Call Ini_mw() ' Initialize lines used for software Microwire interface Print ' Separate from previous visualization by showing 2 empty new line on console Print Print " Messages management on 93LC46A Microwire EE with GMM AM08 + GMM TST3" Print "Mount Mini Module on Z2 of GMM TST3, connect EE to CN4 as described in electric" Print " diagram." Print "The program save/acquire messages of maximum 20 characters on/from EEPROM, and" Print " it shows them on serial console: through a menu on PC it can be performed the" Print " selected operations." ' Please note that the variables dedicated to address and communication with ' Microwire device are declared with 16 bits Word type, in order to easily ' manage even EE with higher capacity Do ' Begin endless loop Print ' Shows menu with available operations Print "W -> Write message on EEPROM" Print "R -> Read message from EEPROM" 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 "W": ' Selected operation is write message on EE Call Show_msg_mwee() ' Show the messages saved on Microwire EE Input "Message number to save: " , Nmsg ' Ask and gest the message number to save Print "Insert message to save on EEPROM (20 characters max.): " Input Msgstr ' Get message to save on Microwire EE Call Enaew_mwee() ' Enable erase and write operations on Microwire EE Call Write_msg_mwee() ' Save message on Microwire EE Call Disew_mwee() ' Enable erase and write operations on Microwire EE Case "R": ' Selected operation is read message from Microwire EE Call Show_msg_mwee() ' Show the messages saved on Microwire EE Input "Message number to read: " , Nmsg ' Ask and gest the message number to read Call Read_msg_mwee() ' Read message from Microwire EE If Msgsaved = 1 Then ' If message saved on Microwire EE and read Print "Message available: " ; Msgstr ' Show indications and message Else ' Message not saved and not read Print "Message not available" ' Show proper indication End If 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 *************************** ' Initialize signals and variables used for the Microwire interface managed by ' software ' Input: None ' Output: None Sub Ini_mw() Ddrb.0 = 0 ' Initialize PB0=DO as digital input Pinsk = 0 ' Initialize PC1=SK as digital output at low level Ddrc.1 = 1 Pindi = 0 ' Initialize PB1=DI as digital output at low level Ddrb.1 = 1 Pincs = 0 ' Initialize PC0=CS as digital output at low level Ddrc.0 = 1 End Sub ' Communicate on Microwire interface managed by software by sending and receiving ' the passed number of bits, up to 16 maximum. ' Input: Mwout = Data to send ' Mwnbit = number of bits to communicate ' Output: Mwin = Received data Sub Com_mw(byval Mwout As Word , Mwin As Word , Byval Mwnbit As Byte ) If Mwnbit < 16 Then ' If not all the data bits must be sent Hlpb = 16 - Mwnbit ' Obtain number of bits not to send Shift Mwout , Left , Hlpb ' Discard bits not to send End If For Hlpb = 1 To Mwnbit ' Loop repeated for all the bits to communicate Shift Mwin , Left , 1 ' Update current bit of received data Pindi = Mwout.15 ' Set current bit status of data to send on DI signal Pinsk = 1 ' SK signal at high level Mwin.0 = Pindo ' Get current bit from DO signal and save it on received data Pinsk = 0 ' SK signal at high level Shift Mwout , Left , 1 ' Update current bit of data to send Next Hlpb End Sub ' Read a byte from 93LC46A Microwire EE. ' Input: Addmw = EE location address to read ' Output: Datmw = data read from EE Sub Read_mwee() Pincs = 1 ' CS signal at high level Call Com_mw(&H06 , Mwin , 3) ' Send 3 bits of READ command to Microwire EE Call Com_mw(addmw , Mwin , 7) ' Send 7 bits of address to Microwire EE Call Com_mw(&H00 , Mwin , 8) ' Get 8 bits of data to read from Microwire EE Datmw = Low(mwin) Pincs = 0 ' CS signal at low level End Sub ' Write a byte on 93LC46A Microwire EE. ' Input: Addmw = EE location address to write ' Datmw = data to write on EE ' Output: None Sub Write_mwee() Pincs = 1 ' CS signal at high level Call Com_mw(&H05 , Mwin , 3) ' Send 3 bits of WRITE command to Microwire EE Call Com_mw(addmw , Mwin , 7) ' Send 7 bits of address to Microwire EE Mwout = Datmw ' Cast data to write (8 bits) to parameter (16 bits) Call Com_mw(mwout , Mwin , 8) ' Send 8 bits of data to write to Microwire EE Pincs = 0 ' CS signal at low level Waitms 10 ' Wait end of write time for Microwire EE (6 msec on data sheet) End Sub ' Enable erase and write operations on 93LC46A Microwire EE ' Input: None ' Output: None Sub Enaew_mwee() Pincs = 1 ' CS signal at high level Call Com_mw(&H04 , Mwin , 3) ' Send 3 bits of EWEN command to Microwire EE Call Com_mw(&H60 , Mwin , 7) ' Complete command by sending 7 bits of address to Microwire EE Pincs = 0 ' CS signal at low level End Sub ' Disable erase and write operations on 93LC46A Microwire EE ' Input: None ' Output: None Sub Disew_mwee() Pincs = 1 ' CS signal at high level Call Com_mw(&H04 , Mwin , 3) ' Send 3 bits of EWEN command to Microwire EE Call Com_mw(&H00 , Mwin , 7) ' Complete command by sending 7 bits of address to Microwire EE Pincs = 0 ' CS signal at low level End Sub ' Each message occupies 22 bytes of Microwire EE: the first dedicated to a message ' saved indicator, the second dedicated to message length and the following ' 20 bytes dedicated to the maximum 20 characters of the message. ' ' Read a message from Microwire EE, by checking if it has been previously saved. ' Input: Nmsg = variable with message number to read ' Output: Msgstr = string variable with read message ' Msgsaved = flag for message saved and thus read Sub Read_msg_mwee() Addmw = Nmsg * 22 ' Calculate start address of message saved on Microwire EE Call Read_mwee() ' Get message saved indicator from Microwire EE If Datmw = Cod_msg_ee Then ' If message is already saved on Microwire EE Incr Addmw ' Increase the Microwire EE read address Call Read_mwee() ' Get message length from Microwire EE Lstr = Datmw Msgstr = Space(lstr) ' Arrange string long as message to read For Pstr = 1 To Lstr ' Cycle repeated for characters of message Incr Addmw ' Increase the Microwire EE read address Call Read_mwee() ' Get ASCII code of current character from Microwire EE Chrstr = Chr(datmw) ' Obtain character from ASCII code Mid(msgstr , Pstr , 1) = Chrstr ' Save current character of message Next Pstr Msgsaved = 1 ' Message was saved on Microwire EE and it has been read Else Msgsaved = 0 ' Message was not saved on Microwire EE and it hasn't been read End If End Sub ' Write a message from Microwire EE, by adding proper message saved indicator ' Input: Nmsg = variable with message number to write ' Msgstr = string variable with message to write ' Output: None Sub Write_msg_mwee() Addmw = Nmsg * 22 ' Calculate start address of message saved on Microwire EE Datmw = Cod_msg_ee ' Write message saved indicator on Microwire EE Call Write_mwee() Lstr = Len(msgstr) ' Obtain length of string with message Datmw = Lstr ' Write message length on Microwire EE Incr Addmw ' Increase Microwire EE write address Call Write_mwee() For Pstr = 1 To Lstr ' Cycle repeated for characters of message Chrstr = Mid(msgstr , Pstr , 1) ' Get current character of message Datmw = Asc(chrstr) ' Obtain ASCII code of current character Incr Addmw ' Increase Microwire EE write address Call Write_mwee() ' Write current character ASCII code on Microwire EE Next Pstr End Sub ' Show on serial console the list of message currently written=saved on Microwire EE ' Input: None ' Output: None Sub Show_msg_mwee() Print "Message currently saved on Microwire EE:" ' Show list head description For Nmsg = 0 To Max_msg_ee ' Loop that shows messages numbered from 0 Print Nmsg ; " = "; ' Show message number of the list Call Read_msg_mwee() ' Read current message of Microwire EE list If Msgsaved = 1 Then ' If message saved on Microwire EE and read Print Msgstr ' Show read message of the list Else ' Message not saved and not read Print ' Show empty message of the list End If Next Nmsg End Sub '******************* End of subroutines used by program ************************