Home
Downloads
Licenses Contact

Basic Compiler Simulation Test Examples

During the software development, sometimes there is a need to write a basic test example that is very suitable for the simulation.
Having in mind that it could be very useful for some users to get new ideas how OshonSoft software packages could be used, some of those basic test examples will be published on this page.
Feel free to share some of your basic programs that simulate nicely to be published here...



atmega328p uart custom fifo buffer implementation

(screenshot)

- set simulation rate to ultimate
- change uart transmit/receive time to 50us
- start the simulation; wait around 100ms real time for the lcd to be initialized
- use send char command to send chars: a, b, c, d
- use send byte (dec) command to send byte value 10 and trigger buffer reading
- set simulation rate to extremely fast for easier uart interface events tracking
- use send char command to send chars: a, b, c, d, e, f; another buffer reading will be triggered

basic program:
'fifo buffer declarations
Dim fifobuff(10) As Byte
Const fifoN = 10
Dim fifobuff_readpoint As Byte
Dim fifobuff_writepoint As Byte
Dim fifobuff_size As Byte
Dim fifobuff_lastchar As Byte
fifobuff_readpoint = 0
fifobuff_writepoint = 0
fifobuff_size = 0
fifobuff_lastchar = 0

'device initialization
UART_Init 19200

'enable uart receive interrupt
Enable URXC
Enable

'user program
Dim mymessage As String
Lcdinit LcdCurBlink

'there are two variables available to check the buffer state
'fifobuff_size - number of bytes waiting to be read
'fifobuff_lastchar - ascii code of the last received char in the buffer
loop:

If fifobuff_size > 5 Then
Lcdcmdout LcdLine1Clear
Lcdout fifobuff_readstring()
Endif

If fifobuff_lastchar = 10 Then 'line feed (ascii 10) char received
mymessage = fifobuff_readstring()
mymessage = LeftStr(mymessage, Len(mymessage) - 1) 'remove line feed char
fifobuff_lastchar = 0
Lcdcmdout LcdLine1Clear
Lcdout mymessage
Endif

Goto loop
End

On Interrupt URXC
Dim arg1 As Byte
UART_Get arg1
Call fifobuff_write(arg1)
Resume

Proc fifobuff_write(ByVal arg1 As Byte)
If fifobuff_size = fifoN Then
Exit 'code for the buffer overrun
Endif
fifobuff(fifobuff_writepoint) = arg1
fifobuff_lastchar = arg1
fifobuff_writepoint = fifobuff_writepoint + 1
If fifobuff_writepoint = fifoN Then fifobuff_writepoint = 0
fifobuff_size = fifobuff_size + 1
End Proc

Function fifobuff_read() As Byte
If fifobuff_size = 0 Then
Exit 'code for the buffer underrun
Endif
fifobuff_read = fifobuff(fifobuff_readpoint)
fifobuff_readpoint = fifobuff_readpoint + 1
If fifobuff_readpoint = fifoN Then fifobuff_readpoint = 0
fifobuff_size = fifobuff_size - 1
End Function

Function fifobuff_readstring() As String
fifobuff_readstring = ""
While fifobuff_size > 0
fifobuff_readstring = fifobuff_readstring + Chr(fifobuff_read())
Wend
End Function



pic18 uart custom fifo buffer implementation

(screenshot)

- set simulation rate to ultimate
- change uart transmit/receive time to 50us

basic program:
'fifo buffer declarations
Dim fifobuff(10) As Byte
Const fifoN = 10
Dim fifobuff_readpoint As Byte
Dim fifobuff_writepoint As Byte
Dim fifobuff_size As Byte
Dim fifobuff_lastchar As Byte
fifobuff_readpoint = 0
fifobuff_writepoint = 0
fifobuff_size = 0
fifobuff_lastchar = 0

'device initialization
All_Digital
UART1_Init 19200

'enable uart receive interrupt
Enable High
PIE1.RC1IE = 1

'user program
Dim mymessage As String
Lcdinit LcdCurBlink

'there are two variables available to check the buffer state
'fifobuff_size - number of bytes waiting to be read
'fifobuff_lastchar - ascii code of the last received char in the buffer
loop:

If fifobuff_size > 5 Then
        Lcdcmdout LcdLine1Clear
        Lcdout fifobuff_readstring()
Endif

If fifobuff_lastchar = 10 Then 'line feed (ascii 10) char received
        mymessage = fifobuff_readstring()
        mymessage = LeftStr(mymessage, Len(mymessage) - 1) 'remove line feed char
        fifobuff_lastchar = 0
        Lcdcmdout LcdLine1Clear
        Lcdout mymessage
Endif

Goto loop
End

On High Interrupt
Save System
If PIR1.RC1IF = 1 Then
        Call fifobuff_write(RCREG1)
Endif
Resume

Proc fifobuff_write(ByVal arg1 As Byte)
If fifobuff_size = fifoN Then
        Exit 'code for the buffer overrun
Endif
fifobuff(fifobuff_writepoint) = arg1
fifobuff_lastchar = arg1
fifobuff_writepoint = fifobuff_writepoint + 1
If fifobuff_writepoint = fifoN Then fifobuff_writepoint = 0
fifobuff_size = fifobuff_size + 1
End Proc

Function fifobuff_read() As Byte
If fifobuff_size = 0 Then
        Exit 'code for the buffer underrun
Endif
fifobuff_read = fifobuff(fifobuff_readpoint)
fifobuff_readpoint = fifobuff_readpoint + 1
If fifobuff_readpoint = fifoN Then fifobuff_readpoint = 0
fifobuff_size = fifobuff_size - 1
End Function

Function fifobuff_readstring() As String
fifobuff_readstring = ""
While fifobuff_size > 0
        fifobuff_readstring = fifobuff_readstring + Chr(fifobuff_read())
Wend
End Function