HCC Forth-gg
8 mei 2004

ByteForth


Willem Ouwerkerk
1. Wat is ByteForth 
2. ByteForth Macrocompiler, op ANS-Forth gebaseerd 
3. Bibliotheek met geteste voorbeelden 
4. Interactief testen (software simulator) 
5. De Flash programmer 
6. Optimaliserende compiler 
7. Programma voorbeeld 
8. ByteForth werkcyclus
9. De versies op een rijtje
10. ByteForth voor AVR-microcontroller 
11. ByteForth voor 8051-microcontroller 


 
 

ByteForth macrocompiler voor AVR en 8052

1. Wat is ByteForth

ByteForth is een 8-bits Forth compiler onder MS-DOS die code genereert voor een microcontroller zonder externe ROM en RAM. Het Forth systeem levert zelfstandig werkende machinecode af zonder de bekende Forth interpreter. ByteForth heeft een ingebouwde simulator, de gegenereerde code kan dus zo op de PC worden getest. Om de hardware te kunnen testen moet de code natuurlijk op de microcontroller draaien.

Maar ByteForth is meer.
Het is een compleet geĆÆntegreerd pakket met daarin: Optimaliserende compiler, Assembler, Disassembler, Simulator, Tracer, Flash programmer en een online hulpfunctie.
Er is een bibliotheek met een grote hoeveelheid geteste software voor bijvoorbeeld LCD-aansturing, rekenkundige routines, I2C, RS232, enz.
Verder zijn er vele volledig uitgewerkte toepassingen zoals de pincode deuropener, een I2C-temperatuurmeter, synchrone servobesturing, enz. En in het 'Egelwerkboek vind je een hele reeks applicaties voor ByteForth. De files daarvoor kun je ook zelf downloaden:

Meer over het 'Egelwerkboek


 
 

2. Macrocompiler voor ByteForth

  • Gebaseerd op ANS Forth
  • Stackbreedte: 8 bits, doubles 16 bits.
  • Arrays, zowel voor 8 als 16 bits getallen.
  • Instelbare geheugenindeling.
  • DefiniĆ«rende woorden:
    CONSTANT 2CONSTANT VARIABLE 2VARIABLE VALUE : CODE CREATE DOES>.
  • Niet standaard toevoegingen:
    BIT-SFR FLAG SFR CONSTANTS VARIABLES 2VARIABLES REGISTER.
  • Controlestructuren:
    IF ELSE THEN DO LOOP BEGIN UNTIL FOR NEXT etc.
  • Prefixen voor datawoorden:
    FROM TO +TO INCR DECR CLEAR etc.
  • Alle interrupts worden ondersteund.
  • Macro's kunnen als subroutine geimporteerd worden.
  • Complete 8051 of AVR assembler.
  • Optimalisator, simulator, tracer en (ISP)-programmer.
  • Speciale compiler directives voor het werken met strings: ." S" [CHAR] en LITERAL.
  • SETUP-BYTEFORTH om stack-initialiserende code te assembleren (het installeren van de Forth machine).
\ Voorbeeld van een macro
\ uit 8051 ByteForth:

$11 MACRO SWAP  ( x1 x2 -- x2 x1 )
    A: @R0 MOV,
    R0: INC,
    A: @R0 XCH,
    R0: DEC,
    @R0 A: MOV,
    RET,
END-CODE
\ Voorbeeld van een macro
\ uit AVR ByteForth:

 $02 MACRO SWAP  ( x1 x2 -- x2 x1 )
    R17 X+ LD,
    R16 X+ LD,
    -X R17 ST,
    -X R16 ST,
    RET,
 END-CODE

3. Bibliotheek met geteste voorbeelden

Er is een programmabibliotheek, die geleidelijk wordt uitgebreid, met code die onder verschillende omstandigheden van pas kan komen. Alle programma's zijn uiteraard getest. De bibliotheek bevat o.a. de volgende software:

  • RS232-I/O, MIDI-I/O
  • 4-bits LCD en grafisch-LCD besturing
  • Gebruik van de timer-interrupts voor een klok
  • RC5-decoder
  • Omzetten van een getal naar een string voor output. Foutopvang met CATCH en THROW.
  • Extra rekenkundige routines
  • Bamboe besturing
  • I2C-primitieven voor diverse chips
  • MS (Forthwoord voor milliseconde) aangepast aan verschillende kristalfrequenties
  • Eenvoudig muzieksoftware
  • Aansturing van een matrixtoetsenbord
  • Double number (16 en 32-bits) routines

4. Interactief testen (software simulator)

Als je nieuwe code gaat compileren, moet je beginnen met EMPTY (verwijder alle eventuele code uit de programmabuffer) en bijvoorbeeld 89C2051 (de naam van de betreffende microcontroller).
Met de ingebouwde simulator kun je de code testen, de hardware natuurlijk niet.

Voorbeeld:


 

1 DUP .S    \ Test de bibliotheekroutine DUP
            \ met het getal 1 op de stack
( 1 1 )     \ De reactie van Forth


 

De routine DUP blijkt te werken.
Alle zelf gemaakte woorden zijn op dezelfde manier te testen.


 

\ We maken zelf het woord NIP
: NIP  ( x y -- y )  SWAP DROP ;
1 2 NIP .S       \ We testen NIP
( 2 )            \ De reactie van Forth



 

5. Flash programmer

De beide versies van ByteForth bevatten een flash-programmer om het ontwikkelde programma in de geselecteerde microcontroller te kunnen zetten. De nieuwe 8051-versie heeft nu een programmer via RS232 voor o.a. de AT89C2051 en een ISP-programmer (In System Programmer) voor bijv. de AT89S8252. Op dit moment ben ik bezig de C2-interface toe te voegen voor de C8051F3xx. Als die af is komt er een nieuwe 8051 ByteForth uit.
De AVR-versie van ByteForth bevat een ISP-programmer die tientallen verschillende AVR microcontrollers kan programmeren, de ISP-hardware is gelijk aan die voor de 8051 versie. Ze zijn daarom uitwisselbaar.


 
 

6. Optimising compiler

Een prefix met datawoord assembleert zeer compacte code (TO-concept). 

Voorbeeld:

\ voor 8051
VARIABLE COUNTER

CLEAR COUNTER wordt
   adr 0 # MOV, [3 bytes]

INCR COUNTER
   adr INC, [2 bytes]


FROM COUNTER
   R0: DEC, @R0 adr MOV, [3 bytes]

\ voor AVR
VARIABLE COUNTER

CLEAR COUNTER wordt
   R16 0 LDI, Y+adr R16 STD, [4 bytes]

INCR COUNTER
   R16 Y+adr LDD, R16 INC,
   Y+adr R16 STD, [6 bytes]

FROM COUNTER
   R16 Y+adr LDD, -X R16 ST, [4 bytes]
\ voor 8051
FLAG END?

CLEAR END? wordt
   bitadr CLR, [2 bytes]

SET END?
   bitadr SETB, [2 bytes]

END?
   C: bitadr MOV, A: ACC: SUBB,
   R0: DEC, @R0 A: MOV, [6 bytes]
\ voor AVR
FLAG END?

CLEAR END? wordt
   CLT, bitadr BLD, [4 bytes]

SET END?
   SET, bitadr BLD, [4 bytes]

END?
   R16 CLR, bitadr SBRC, R16 $FF ORI, 
   -X R16 ST, [8 bytes]


 

EXIT maakt van de laatste call een jump indien mogelijk. Controlestructuren assembleren rechtstreeks machinecode.
Edge optimiser: alle woorden en macro's zijn gemerkt met een code waar hun stack-invoer en stack-uitvoer aan af te lezen is. De compiler kan hieruit afleiden hoe hij deze randen kan optimaliseren. Macro's kunnen hierdoor in elkaar geschoven worden. Enkele voorbeelden.

Zonder optimiser:

\ 8051

10 TO COUNTER
   R0: DEC, @R0 10 # MOV,
   adr @R0 MOV, R0: INC, [6 bytes]

BEGIN END? UNTIL
   C: bitadr MOV, A: ACC: SUBB,
   R0: DEC, @R0 A: MOV,
   A: @R0 MOV, R0: INC,
   codeadr JZ, [10 bytes]
\ AVR
10 TO COUNTER
   R16 10 LDI, -X R16 ST,
   R16 X+ LD, Y+adr STD, [8 bytes]

BEGIN END? UNTIL
   R16 CLR, bitadr SBRC, -X R16 ST,
   R16 X+ LD, R16 TST,
   codeadr BREQ, [12 bytes]
Met optimiser:
 10 TO COUNTER
    adr 10 # MOV, [3 bytes]


 BEGIN END? UNTIL
    bitadr codeadr JNB, [3 bytes] 
 10 TO COUNTER
    R16 10 LDI,
    Y+adr R16 STD, [4 bytes]       

 BEGIN END? UNTIL
    bitadr SBRS,
    adr RJMP, [4 bytes]


 
 

7. Voorbeeld van een compleet programma

Het volgende programma krijgt analoge input binnen die gedigitaliseerd wordt. Het resultaat komt als een binair getal op 8 leds te staan.


 
 

\ Analoog naar digitaal omzetting met de TLC549IP
\ Codelengte voor de AT89C2051=201 bytes, voor de AT90S2313=292 bytes).

89C2051  TARGET                    \ Compileer voor AT89C2051
$90 SFR LEDS                       \ Poort 1 met 8 leds
$B4 BIT-SFR ADC-KLOK               \ Klokpuls invoer P3.4
$B5 BIT-SFR ADC-DATA               \ Data uitvoer P3.5
$B7 BIT-SFR ADC-SELECTEER          \ Activeer invoer P3.7

: ADC               ( -- u )       \ Doe een AD-omzetting
    FALSE TO ADC-KLOK              \ Stop lezen van analoge invoer
    TRUE TO ADC-SELECTEER          \ Start AD-omzetting
    4 0 DO  LOOP                   \ Conversie duurt min. 17 us 
    FALSE TO ADC-SELECTEER         \ Start uitlezen
    ADC-DATA 1 AND                 \ Lees databit 7
    7 0 DO                         \ Lees resterende 7 databits
        TRUE TO ADC-KLOK
        FALSE TO ADC-KLOK          \ Schuif volgend bit naar buiten
        2 *  ADC-DATA  1 AND  OR   \ Schaal data in en lees volgend bit
    LOOP
    TRUE TO ADC-KLOK               \ Blijf analoge invoer lezen
    ;

: NAAR-LEDS     ( u -- )           \ Print data binair
    INVERT TO LEDS
    ;

: KNIPPER       ( -- )             \ Visualiseer opstarten
    -1 NAAR-LEDS  250 MS           \ Alle leds aan
    0 NAAR-LEDS   250 MS           \ Alle leds uit
    ;

: TOON-ADC      ( -- )             \ Toon omzetting op LEDS
    SETUP  KNIPPER
    BEGIN  ADC  NAAR-LEDS  AGAIN   \ Lees ADC, en toon uitkomst
    ;

' TOON-ADC   RESET-VEC  SET-VECTOR \ Installeer ADC omzetter

\ Einde


 
 

8. ByteForth werkcyclus


Laptop met dongle en Ushi
  • De Crosscompiler (her)starten.
  • Het programma compileren.
  • ISP-kabel aansluiten als die nog niet verbonden was.
  • Het Flash geheugen leeg maken: E.
  • Het Flash-geheugen programmeren: P.
  • Het Flash-geheugen verifieren: V.
  • Het programma beveiligen: Lock1 en Lock2.
  • ..... en het werkt.
  • Nog vragen?


 
 

De ByteForth versies op een rij


 
 

  • 8051 ByteForth 1.70 (voor ATS, zonder simulator)
  • 8051 ByteForth 1.70pc (voor de PC, met simulator)
  • 8051 ByteForth 2.00beta (voor de PC, met simulator)
  • AVR ByteForth 2.00 (voor de PC, met simulator)
De belangrijkste verbeteringen in versie 2.00 zijn:
  • De optimalisator en de tracer zijn verbeterd.
  • ByteForth gedraagt zich als een 'gewone' Forth interpreter, want het woord TEST is niet meer nodig.
De ATS-bord versie wordt niet langer doorontwikkeld.

Overzicht van de wijzigingen (2.00 t.o.v. 1.70):

  • .S EMIT KEY . U. DU. etc. zijn aan de debugger toegevoegd om de gewone manier van debuggen in Forth te ondersteunen.
  • :: is toegevoegd om CREATE DOES> nieuwe definierende woorden aan ByteForth toe te voegen.
  • STRUCTURE ccc laat het beginadres en lengte van de datastructuur ccc achter.
  • Een ISP-programmer is toegevoegd.
  • Het display van de tracer is verbeterd.
  • De Forthcommando's zijn in principe hetzelfde voor de 8051- en AVR-reeks. Alleen de benadering van de hardware is anders.
  • Het handboek is weer verder verbeterd en uitgebreid.
Voordelen van de 2.00 versie

Door al deze verbeteringen kan ByteForth nu nog compactere code genereren, ook wanneer het 16-bits getallen en variabelen betreft. Het debuggen is eenvoudiger door het goed leesbare resultaat van de disassembler. Er zijn bibliotheek en voorbeeld-files bijgekomen die het maken van eigen toepassingen vergemakkelijken.

  • Om spelenderwijs te leren is 'Ushi' een robotbouwpakket ontwikkeld.
  • Er zijn enkele nieuwe ontwikkel printen bij gekomen Alle programma's in het aanzienlijk uitgebreide en verbeterde 'Egelboek werken op deze versie. Het 'Egelwerkboek is verkrijgbaar bij de HCC Forth-gg.

 
 

ByteForth
voor AVR


 
Meer over AVR ByteForth
Meer over AVR microcontrollers
Tips & Truuks voor de AVR's

Programmavoorbeeld:
PulsBreedteModulatie

 
 

ByteForth
voor 8051


 
Meer over 8051 ByteForth
Meer over 8051 microcontrollers
Tips & Truuks voor de 8051's

Programmavoorbeelden:
Schemerschakelaar
Temperatuur datalogger
RF-datacommunicatie


 
 

egeltjetop