dimanche 7 juin 2020

eForth sur STM8

En partant du travail de C.H. Ting qui a créer un eForth pour la carte STM8-DISCOVERY. J'ai adapté ce travail pour la carte NUCLEO-8S208RB pour ensuite étendre les fonctionnalités. Le numéro de version du fichier original indiquait 2.1 mais avec toutes les modifications que j'ai fait il s'agit d'une révision majeure. J'ai donc fait passer le numéro de version à 3.0

La version originale compilait dans la mémoire RAM et il n'y avait aucun support pour la programmation de la mémoire flash. J'ai ajouter le vocabulaire pour la programmation de la mémoire FLASH, EEPROM et OPTION. Dans la version 3.0 les définitions sont compilées en mémoire RAM mais immédiatement transférées dans la mémoire FLASH pour les rendre permanentes.

J'ai aussi ajouter le vocabulaire nécessaire pour supporter la création de routines d'interruptions.

D'autres mots d'usage général ont aussi étés ajoutés.

Le dépôt de ce projet se trouve à https://github.com/Picatout/stm8_eForth

dimanche 19 janvier 2020

Tiny BASIC pour stm8, #2

Je continue mon travail sur Tiny BASIC sur STM8 Depuis une semaine environ j'ai travaillé sur l'amélioration des performances de l'interpréteur et j'ai multiplié celle-ci par 4,7. 12 millisecondes pour effectuer 1000 boucles FOR...NEXT vide alors que dans la version précédente il fallait 56 millisecondes.

Dans cette nouvelle version l'analyse lexicale est faite une seule fois et l'interpréteur fait la lecture d'une liste d'unités lexicales plutôt que du texte source. Il serait bien sur possible d'améliorer encore plus la performance en compilant le code source en byte code à exécuter par une machine virtuelle comme le fait MicroPython. Mais alors il serait très complexe de retrouver le texte original. Le problème est le suivant. Il n'y a que 5741 octets de RAM disponible pour les programmes BASIC. Il n'est pas possible de conserver une copie du programme source. Donc pour retravailler le code source il faut le rendre disponible sous forme texte.

Avec la méthode que j'utilise il est relativement simple de reconstruire l'équivalent du code source à partir de la liste des unités lexicales. Il est donc possible à tout moment d'examiner le programme sous forme texte et de modifier le programme comme s'il était conservé dans sa forme originale. Comme s'il s'agissait d'un éditeur de texte.

Je ne veux pas utiliser la mémoire flash car l'édition d'un code source requiert de fréquentes modifications. Hors la mémoire flash n'est garantie que pour 10 000 cycle d'effacement/écriture. Ce n'est donc pas recommandé de l'utiliser comme tampon pour l'édition d'un texte.

Rappel des objectifs

Il s'agit de concevoir un interpréteur Tiny BASIC résident sur le microcontrôleur et qui utilise un émulateur de terminal sur le PC pour l'interface utilisateur. Les programmes sont exécutés à partir de la mémoire RAM mais peuvent-être sauvegardés sous forme de fichiers dans la mémoire étendue du microcontrôleur. Cette mémoire étendue est de 96Ko sur le STM8S208RB.

Il s'agit donc d'un système REPL Read,Execute,Print,Loop comme MicroPython. Ce système rappel les premier ordinateurs personnel des années 1970s, comme le TRS-80 I, le Appel II, etc, sauf ici qu'il s'agit de programmer un microcontrôleur et non d'un ordinateur d'usage général.

Une fois le système installé sur la carte il suffit de relier celle-ci à un PC avec un câble USB pour l'alimente. L'interface USB de la carte NUCLEO a un canal de classe ACM pour la communication par port sériel. Sur le PC un émulateur de terminal comme pTTY, TeraTerm, GtkTerm ou autre permet d'interagir avec la carte. Sous Linux ce périphérique sériel se présente comme /dev/ttyACMnn est un nombre qui différencie les différents périphérique de ce type.


picatout$: ls /dev/ttyACM*
/dev/ttyACM0 
picatout$: minicom -D/dev/ttyACM0 -b115200

Exemple de programme

Voici un exemple de programme extrait du manuel de l'utilisateur. Ce programme contrôle l'intensité de la LED LD2 qui est sur la carte à partir du terminal. La touche u augmente l'inensité. la touche d la diminue et la touche q termine le programme. La valeur de l'intensité est affichée sur le terminal à position fixe et mise à jour à chaque changement.


    5 'Software PWM, controle LD2 sur carte
    7 PRINT # 6,
   10 R = 511 :PRINT R ,
   20 K = 0 
   30 IF R :BSET GPIO ( 2 ,ODR ), 32 
   40 FOR A = 0 TO R :NEXT A 
   50 BRES GPIO ( 2 ,ODR ), 32 
   60 FOR A =A TO  1023 :NEXT A 
   70 IF QKEY :K =KEY 
   80 IF K =ASC (\u):GOTO  200 
   90 IF K =ASC (\d):GOTO  400 
  100 IF K =ASC (\q):STOP 
  110 GOTO  20 
  200 IF R < 1023 :R =R + 1 :GOTO  600 
  210 GOTO  20 
  400 IF R > 0 :R =R - 1 :GOTO  600 
  410 GOTO  20 
  600 PRINT "\b\b\b\b\b",R ,
  610 GOTO  20 

Documentation

jeudi 9 janvier 2020

Tiny BASIC sur STM8

Depuis la mi-décembre me je travail sur un nouveau projet pour la carte NECLEO-8S208RB. Il s'agit d'un interpréteur Tiny BASIC installé sur le microcontrôleur permettant la programmation en interactif. Le projet est sur https://github.com/pictatout/stm8_tbi. Pour plus d'information suivez le lien et lisez le readme qui s'affiche à l'ouverture de la page.