Bare Metal Robots


34 posts   Page 2 of 2   1, 2
by DexOS » Tue May 22, 2012 12:24 pm
The idea for FBasic was started by a coder called "rCX " for dos, then
Dex (me)
Stephen
TonyMac

Worked on a ver for DexOS (it a OS)
most of the work for the dexos ver was done by Stephen, just for fun i knocked up a simple ver x86 32bit linux (less than half a hour).
FBasic_L.inc
Code: Select all
;============================================================
; FBasic is based on a idea by rCX, for a fasm macro basic.
; The esae of basic, with the power of ASM.
;
; Code input by:
;   Dex
;   rCX
;   Stephen
;   TonyMac
;
; This include is for 32BIT Linux terminal.
;
;============================================================

;=======================================================  ;
;  File header.                                           ;
;=======================================================  ;
format ELF executable                                     ;
entry  start                                              ;
                                                          ;
;=======================================================  ;
;  CLS.                                                   ;
;=======================================================  ;
macro CLS                                                 ;
{                                                         ;
local .Done                                               ;
local .a                                                  ;
local .b                                                  ;
                                                          ;
        mov     eax,4                                     ; Print function
        mov     ebx,1                                     ;
        mov     ecx,.a                                    ;
        mov     edx,.b                                    ;
        int     80h                                       ;
        jmp     .Done                                     ;
                                                          ;
.a db 1bh, "[2J",1bh, "[01;01H"                           ; clear screen.
.b = $-.a                                                 ;
.Done:                                                    ;
}                                                         ;
                                                          ;
;=======================================================  ;
;  PRINT.                                                 ;
;=======================================================  ;
macro PRINT String{                                       ;
local .Done                                               ;
local .a                                                  ;
local .b                                                  ;
                                                          ;
        mov     eax,4                                     ; Print function
        mov     ebx,1                                     ;
        mov     ecx,.a                                    ;
        mov     edx,.b                                    ;
        int     80h                                       ;
        jmp     .Done                                     ;
                                                          ;
.a db String,0xa                                          ;
.b = $-.a                                                 ;
.Done:                                                    ;
}                                                         ;
                                                          ;
;=======================================================  ;
;  LOCATE.                                                ;
;=======================================================  ;
macro LOCATE col,row                                      ;
{                                                         ;
local .Done                                               ;
local .CursorX                                            ;
local .CursorY                                            ;
local .ColumnRow                                          ;
local .ColumnRowSize                                      ;
        pushad                                            ;
        mov     dh, 10                                    ;
                                                          ;
        mov     ax, row                                   ; AX = character column
        and     ax, 0FFh                                  ;
        div     dh                                        ; divide by 10
        add     ax, "00"                                  ;
        mov     [.CursorX], ax                            ;
                                                          ;
        mov     ax, col                                   ; AX = character row
        and     ax, 0FFh                                  ;
        div     dh                                        ; divide by 10
        add     ax, "00"                                  ;
        mov     [.CursorY], ax                            ;
                                                          ;
        mov     eax,4                                     ; Print function
        mov     ebx,1                                     ;
        mov     ecx,.ColumnRow                            ;
        mov     edx,.ColumnRowSize                        ;
        int     80h                                       ;
        jmp     .Done                                     ;
                                                          ;
                                                          ;
.ColumnRow      db      1bh, "["                          ; cursor positioning sequence
.CursorX        dw      0                                 ;
                db      ";"                               ;
.CursorY        dw      0                                 ;
                db      "H"                               ;
.ColumnRowSize = $-.ColumnRow                             ;
.Done:                                                    ;
        popad                                             ;
}                                                         ;
                                                          ;
;=======================================================  ;
;  END.                                                   ;
;=======================================================  ;
macro COLOR NewColor                                      ;
{                                                         ;
local .Done                                               ;
local .Done1                                              ;
local .black                                              ;
local .red                                                ;
local .green                                              ;
local .yellow                                             ;
local .blue                                               ;
local .magenta                                            ;
local .cyan                                               ;
local .white                                              ;
local .Size1                                              ;
local .Size2                                              ;
                                                          ;
        mov     al,NewColor                               ;
        cmp     al,15                                     ;
        ja      .Done                                     ;
        cmp     al,15                                     ;
        jne     @f                                        ;
        mov     ecx,.white                                ;
        jmp     .Done1                                    ;
@@:                                                       ;
        cmp     al,0                                      ;
        jne     @f                                        ;
        mov     ecx,.black                                ;
        jmp     .Done1                                    ;
@@:                                                       ;
        cmp     al,11                                     ;
        jne     @f                                        ;
        mov     ecx,.cyan                                 ;
        jmp     .Done1                                    ;
@@:                                                       ;
        cmp     al,12                                     ;
        jne     @f                                        ;
        mov     ecx,.red                                  ;
        jmp     .Done1                                    ;
@@:                                                       ;
        cmp     al,14                                     ;
        jne     @f                                        ;
        mov     ecx,.yellow                               ;
        jmp     .Done1                                    ;
@@:                                                       ;
        cmp     al,10                                     ;
        jne     @f                                        ;
        mov     ecx,.green                                ;
        jmp     .Done1                                    ;
@@:                                                       ;
        cmp     al,13                                     ;
        jne     @f                                        ;
        mov     ecx,.magenta                              ;
        jmp     .Done1                                    ;
@@:                                                       ;
        cmp     al,9                                      ;
        jne     @f                                        ;
        mov     ecx,.blue                                 ;
        jmp     .Done1                                    ;
@@:                                                       ;
        jmp     .Done                                     ;
.Done1:                                                   ;
        mov     eax,4                                     ; Print function
        mov     ebx,1                                     ;
        mov     edx,.Size2                                ;
        int     80h                                       ;
        jmp     .Done                                     ;
                                                          ;
                                                          ;
.black    db 1bh, "[0;30;49m"                             ;
.red      db 1bh, "[0;31;49m"                             ;
.green    db 1bh, "[0;32;49m"                             ;
.yellow   db 1bh, "[0;33;49m"                             ;
.blue     db 1bh, "[0;34;49m"                             ;
.magenta  db 1bh, "[0;35;49m"                             ;
.cyan     db 1bh, "[0;36;49m"                             ;
.white    db 1bh, "[0;37;49m"                             ;
.Size1    db 1bh, "[0;39;49m"                             ;
.Size2 = $-.Size1                                         ;
.Done:                                                    ;
}                                                         ;
                                                          ;
;=======================================================  ;
;  GOTO.                                                  ;
;=======================================================  ;
Macro GOTO _op1                                           ;
{                                                         ;
        jmp     _op1                                      ;
}                                                         ;
                                                          ;
;=======================================================  ;
;  GOSUB.                                                 ;
;=======================================================  ;
Macro GOSUB _subname                                      ;
{                                                         ;
        call     _subname                                 ;
}                                                         ;
                                                          ;
;=======================================================  ;
;  RETURN.                                                ;
;=======================================================  ;
Macro RETURN                                              ;
{                                                         ;
        ret                                               ;
}                                                         ;
                                                          ;
;=======================================================  ;
;  SLEEP.                                                 ;
;=======================================================  ;
macro SLEEP                                               ;
{                                                         ;
        pushad                                            ;
        mov     eax,3                                     ;
        xor     ebx,ebx                                   ;
        mov     ecx,1                                     ;
        mov     edx,buffer                                ;
        int     80h                                       ;
        popad                                             ;
}                                                         ;
                                                          ;
;=======================================================  ;
;  END.                                                   ;
;=======================================================  ;
macro END                                                 ;
{                                                         ;
local .Done                                               ;
local .restore                                            ;
local .Size2                                              ;
        pushad                                            ;
        mov     ecx,.restore                              ;
        mov     eax,4                                     ; Print function
        mov     ebx,1                                     ;
        mov     edx,.Size2                                ;
        int     80h                                       ;
                                                          ;
        mov     eax,1                                     ; Exit function
        xor     ebx,ebx                                   ;
        int     80h                                       ;
        jmp     .Done                                     ;
                                                          ;
.restore db 1bh, "[0;39;49m"                              ;
.Size2 = $-.restore                                       ;
.Done:                                                    ;
        popad                                             ;
}                                                         ;
                                                          ;
;=======================================================  ;
;  START of Program.                                      ;
;=======================================================  ;
segment readable writeable executable                     ;
buffer rb 1                                               ;
start:                                                    ;                 

Its just a cut down ver of DexOS one, that Stephen work on, you can find him on the DexOS forum.

We add some commands from darkbasic for high res graphic modes
Image

If you want it to run bare metal or on the linux on the R-PI it would just need to be written in with FasmArm.
This is a basic example it could be done in a python like language.
Or even a raspberrypi language :lol:
Batteries not included, Some assembly required.
User avatar
Posts: 869
Joined: Wed May 16, 2012 6:32 pm
by Dave_G_2 » Tue May 22, 2012 6:06 pm
@DexOS

Thanks for posting FBasic_L.inc
In my spare time I will start porting it to ARM so by the time my Pi arrives I can test it.
I will also add some extra commands for example IN and OUT as __----__----__ mentioned earlier.
User avatar
Posts: 196
Joined: Sat Apr 14, 2012 7:04 pm
by pygmy_giant » Tue May 22, 2012 10:53 pm
Interesting posts - I am being tempted along the Mbasic/ASM bare metal route as I am hoping to build a balancing robot using the Pi and I2C modules (gyros and accelerometers etc..) so slick economical real time code is important to me.

As the Pi uses a reduced instruction set processor I am hoping that its assembly language is relatively easy to learn - can anyone point me to a good starting book relevant to the Pi's ARMv6 processor?

Something like Mbasic that could give me the best of both high and low programming languages would be great.

My only reservations are the possible need to write my own I2C driver for incorporation into the bare metal program that will be called by the firmware on boot.

Should I bother when other people have already got I2C drivers working on full linux? I'm thinking maybe go the full Linux route to test the concept/hardware and then upgrade to a more elegant bare metal solution via Mbasic/ASM.

A quick scan of other posts by other people interested in projects such as quad-copters where fast response time is crucial shows there is definately a demand for utilities to aid the acheivement of real time Pi control.
Ostendo ignarus addo scientia.
Posts: 1569
Joined: Sun Mar 04, 2012 12:49 am
by Dave_G_2 » Wed May 23, 2012 7:34 am
@pygmy_giant

Why not do both?

You would certainly get to know your assembler that way.
Then you can then decide which is better for your needs, Linux with the existing I2C driver
or going the realtime bare metal route.
I2C drivers are not that difficult to code on a bare metal system and you should find plenty of
example code on the net even if it's not ARM ASM, you can always learn from it.
A very good place for I2C code is the NXP datasheets for their I2C chips.
Depending on what you want to interface to the I2C, you could even just bit-bang.

As regards the ARMv6 processor, you can find info here:
http://infocenter.arm.com/help/index.jsp
To download any datasheets you will have to register but it's free and you can always setup
a yahoo mail account if you don't want to use your real email address.

You will also need:
http://www.raspberrypi.org/wp-content/u ... herals.pdf
and look here for errata:
http://elinux.org/BCM2835_datasheet_errata

As for an assembler, you can use GCC/AS but I find FasmARM easier and much friendlier.
FasmARM can produce flat binaries for a bare metal system or ELF binaries for Linux
so you can use it for either OS.
http://arm.flatassembler.net/
User avatar
Posts: 196
Joined: Sat Apr 14, 2012 7:04 pm
by pygmy_giant » Thu Jun 28, 2012 11:04 am
Hard to know where to start.

I've got a stepper motor and photo-detector working via BASH so am less scared of the GPIO now.

As I guess my RobotOS will 'only' be bitbanging to GPIO and performing mathematical operations on data, a good modest starting point would be a program that loads from boot and flashes an external LED via GPIO.

Guess I should learn ARM assembly language, read the Boardcom data sheet and try and adapt other peoples bootloader code?
Ostendo ignarus addo scientia.
Posts: 1569
Joined: Sun Mar 04, 2012 12:49 am
by DexOS » Fri Jun 29, 2012 12:12 pm
pygmy_giant wrote:Hard to know where to start.

I've got a stepper motor and photo-detector working via BASH so am less scared of the GPIO now.

As I guess my RobotOS will 'only' be bitbanging to GPIO and performing mathematical operations on data, a good modest starting point would be a program that loads from boot and flashes an external LED via GPIO.

Guess I should learn ARM assembly language, read the Boardcom data sheet and try and adapt other peoples bootloader code?

I like assembly, but you could do it just as well in C .
Batteries not included, Some assembly required.
User avatar
Posts: 869
Joined: Wed May 16, 2012 6:32 pm
by pygmy_giant » Fri Jun 29, 2012 7:52 pm
Cool - I won't bother learnig assembly then (although I would be interested in fBASIC). I'm frightened that I will slowly become a cold emotionless man-machine if I start to wrap my brain around the actual hardware :| . I guess all computing is essentually moving bits around from here to there. I will look for a peeky/pokey way of doing so from C that relates to the appropriate addresses publishes in the boardcom literature.
Ostendo ignarus addo scientia.
Posts: 1569
Joined: Sun Mar 04, 2012 12:49 am
by DexOS » Fri Jun 29, 2012 9:08 pm
pygmy_giant wrote:Cool - I won't bother learnig assembly then (although I would be interested in fBASIC).

I have already coded a sub set of FBasic into the kernel and every time i add new function i add a FBasic too.
So you will be OK there.
FBasic is the same commands as QBasic, plus Darkbasic commands for high res graphics stuff.
Batteries not included, Some assembly required.
User avatar
Posts: 869
Joined: Wed May 16, 2012 6:32 pm
by pygmy_giant » Mon Jul 02, 2012 11:42 pm
cool.

I guess Wiring Pi is another solution: https://projects.drogon.net/raspberry-p ... d-install/
Ostendo ignarus addo scientia.
Posts: 1569
Joined: Sun Mar 04, 2012 12:49 am