- Open the side4linux IDE and click on 'Project>Open Project' in the
Main Menue.
 
- Double click on the 'DEMOS'
Product Area,
- Double click on the 'SIDEdemos'
Product,
- In the file dialog double click the  'AVRA' folder, this takes you to
where 'AVR' assembler projects
are kept.
- Double click on 'Sample2',
this opens the 'Sample2'
project folder.
- Click on 'Open-TXT'
and open the file 'sample2.asm'.
 
Practical-1
The 'Interupts'
First section of the Debug Monitor is the 'Interupt Handler Locations'
starting at location 0002h this is after
the 'cold boot' point called 'Start'.
;================================== Start of main
===================================
.nolist
.include
"src/AvrMega128/m128def.inc"     ;Atmel part
definition file
.include
"src/Globals.inc"      
                  
  ;Global Defs & Sets
.list
.cseg
.org 0
Start:
    rjmp
    reStart
interuptVectors:                      
                 
  
;interupt handler routine vectors
Int_0:
   
nop       
                
             
                    
;int0, not in use
Int_1:
   
nop       
   
                          
                 
   ;int1, not in use
Int_2:
    nop
Int_3:
   
nop       
                
                   
              ;Timer2 counted
down to zero
   
rcall   
Error_02   
                                   
;failed interupt call
Practical-2
The 'Entry Point'
From 
'Start' at location 0000h
we relative jump to the 
'ReStart'
point
which is used as the 
'warm boot'
point. Here the stack and serial ports are
setup and we send the 
'sign on'
message stored in the 
'hello'
subroutine out on serial port zero. The program then settles into the
command decoder loop at the label 
'controlLoop'
awaiting an inputed
command string from the controlling Linux computer.
ReStart:
   
cli       
   
                                                
;kill interupts
   
ldi       
r16,high(StackTop)            
          ;init stack pointer
   
out       sph,r16   
 
   
ldi       
r16,low(StackTop)                       
;stack grows down
    out
      spl,r16
    rcall
   
RS232Out_initUart0                
   
;setup input uart
    nop
   
rcall   
hello                                           
 
;send sign on message to serial input
controlLoop:
   
rcall   
CmdLoop_cmdDecoder           
      ;holds monitor
command choices      
<----<<< entry point for
command
strings.
   
rjmp   
controlLoop            
                 
   
;program control loop
;------------------------------------
End of
Main------------------------------------
hello:      
         
                   
                 
     ;call writeString, put message after as .db "text",
followed by nop
   
rcall    RS232Out_writeString0
   
.db     "MC-1 Ver 7.0"
    nop
   
rcall   
RS232Out_writeln0                      
;sends  10h, line feed
    ret
;==================================
Include Files Next
==============================
.include "src/Includes.inc"
    nop
    nop
    nop
    nop
    nop
Practical-3
The 'Command Decoder'
Here is presented the 
'Primary
Command Decoder' from the file
'CmdLoop.inc'. It's job is to
read in the commands sent from the
controlling Linux computer, decode and execute them. This means that
the output is sent to the machine being controlled at a set rate if the
incomming command is a step command and at the full speed of the serial
transmission if it is any other command. Buffers are provided at the
incoming
and outgoing end to relieve the Linux computer of any real-time
performance requirement. Hence a standard Linux kernel can be used. The
command format is as follows,
 
;      CMD1    CMD2  
CMD3  n0     
n1     
n2      n3     
n4     n5          
; up to three letters per command line followed by ASCII
number digits.
;      CMD1 
 
n0         
n1       
n2      n3     
n4     
n5                         
 
; or at least one command character followed by ASCII number digits.
So commands can be one to three letters in length followed by
numbers
all in seven bit upper case hex ASCII format. ]
The serial transmission
Baud rate is 9600, no parity, eight data bits
and two stop bits. 
The first action is to get a command string of up to
a sixteen bytes from the Linux control computer terminated with a Line
Feed character at the label 'CmdLoop_cmdDecoder'. This means that
the
maximum command length is
fifteen. 
Notice
that through out the Monitor the exported/imported labels are prefixed
with the
filename and an underbar, since we are looking at code from the file 
'CmdLoop.inc'
the prefix is 
'CmdLoop_'. 
Debug commands start the
decode at 
'debugCmdDecoderEntry' by decoding the Debug 'Q'
and then branch out from there.
;cmdDecoder
;THIS ROUTINE ACCEPTS AS INPUT A
COMMAND LINE FORMED
;IN RAM called 'SioBuf0'
;END OF THE COMMAND LINE POINTED
TO BY r17.
;address of command string in
XH/XL
;destroys r16 & r17 & RX
pair
;
CmdLoop_cmdDecoder:  
   
rcall   
RS232In_readSerial0IntoBuffer     ;get command string
   
cpi       r17,0   
       
                                
;end if string
length is zero
   
breq    cmd_decoder_length_error
debugCmdDecoderEntry:   
 
   
ldi      
XL,low(SioBuf0Start)       
             ;get address
of command string
    ldi  
    XH,high(SioBuf0Start)
    ld  
     r16,X+   
       
                              
;get character
of command string
    cpi  
   r16,'M'   
                
                 
     ;a Misc
command?
   
breq   cmdMiscs
    cpi  
   r16,'T'   
                
                
       ;a Tool
command?
   
breq   cmdTools
    cpi  
   r16,'Q'   
       
                                
;a debug
command?  
<-------<<< Start Decode
of Debug
Commands HERE!
   
breq   cmdDecode
    cpi  
   r16,'%'   
       
                                
;Ignore this
one
   
breq   cmdIgnore
    cpi  
   r16,'@'   
                
                 
      ;Ignore this
one
   
breq   cmdIgnore
   
rcall  
ERROR_03   
   
                    
          
;Unknown Commandline Primary
Command
    ret
cmd_decoder_length_error:
   
rcall   
ERROR_00   
   
                    
         
;zero length command error
    ret
     
cmdMiscs:
   
rjmp    DecodeM_cmdM
cmdTools:   
       
                
                   
      ;send it as is to the Machine!
   
push    r17   
       
                                     
;save byte
counter register
    ldi  
    r17,16   
       
                                 
;set for full
length
   
rcall    RS232Out_WriteSio0Buffer
   
pop     r17   
       
                                     
;restore byte
counter register
    ret
cmdIgnore:
    ret
;-------------------------------------------------------------------------
;cmdDecode (debug)
;THIS ROUTINE ACCEPTS AS INPUT A
COMMAND LINE FORMED
;IN RAM called 'SioBuf0'
;END OF THE COMMAND LINE POINTED
TO BY r17.
;address of command string in
XH/XL
;destroys r16 & r17 & RX
pair
;
cmdDecode:  
    ld  
   r16,X+   
       
                                
;get next
character of command string
   
cpi    r16,'D'   
       
                                 
;IS IT Display
memory selected line?
    bre  
displayingDecode
   
cpi    r16,'F'   
       
                                  
;IS IT Fill
memory?
    bre  
memoryFilling
    rcal 
ERROR_06   
                
                  
;UNKNOWN Debug
select COMMAND
    ret
     
displayingDecode:
   
rjmp    Debug_DisplayDecode
memoryFilling:
   
rjmp    Debug_MemoryFill
    ret
     
;end of debug cmd primary
decoder     
;------------------------------------------------------------------------------------
;END OF PRIMARY COMMAND DECODERS
;------------------------------------------------------------------------------------
Practical-4
The 'Command Decoder Debug Commands'
 The
following Debug commands are available, please refer to the MANUAL
(Local) for
more detail.
  
    
      | Command 
 | Usage 
 | 
    
      | QDnnnn Display next sixteen bytes of data memory from
address nnnn. | QD01E3 
 | 
    
      | QFxxxxyyyyzz Fill data RAM memory from xxxx to yyyy
with data zz. | QF010012E4FF 
 | 
  
NOTE
 1/
All characters and hex letters are to be in upper case only.
2/
All numbers are in hex ascii.
Practical-5
Simulation
Click on 'Tools>AVRA>Avrsim'
to launch 'avrsim' the built
in graphical AVR simulator as seen in
figure-1 below,
 Fig-1 Avrsim
Fig-1 Avrsim
Now click on 'Restart'
on the
Main Menue of Avrsim and the code will show a red line as follows,
C:000000
c005          rjmp
    reStart
Click on 'Step' to go
to              
Line C:000006 94f8          cli   
                
                   
                   
   ;kill interupts
 
'Step' down
to                           
Line C:00000a bf0d          out
    spl,r16
Click on 'Jump' twice to land on Line C:00000c 
ef0f          ldi      
r16,0xff               
                   
         ;blink on step fudge
Click on 'Step' three times to    
Line C:00000f  d002         rcall   
hello
Click 
on 'Jump' to                     
Line C:000010 d1e3         rcall  
 CmdLoop_cmdDecoder                   
;holds monitor command choices  
We will provide other demos as
'side4linux' develops to
cover AVR programming and integration into a real world machine
controller.