Modtronix SBC65EC Révision 3
Transcription
Modtronix SBC65EC Révision 3
Modtronix SBC65EC Révision 3 CPU: PIC18F6627 ; EEPROM 24LC512 Mise en service du module Connecter au PC – réglage Ethernet sur 10.1.0.2 test avec browser sur http://10.1.0.1 Les caractéristiques du module SBC65EC sont: – HW: V3.01 – BLN: V1.00 (bootloader) – SW: V3.10 - 2009 May 29 (software) Note: certaines explications se réfèrent à la version précédentes, V3.06. Les path sont modifiés en conséquence. Code source Téléchargé depuis : http://www.modtronix.com/product_info.php?products_id=196#apps Déballé dans : c:\Users\Yves\Documents\Pic\Soft\websrvr65\demo_webserver\src\ Structure: └───demo_webserver ├───doxygen │ └───html └───src ├───net └───webpages ├───compress ├───default ├───html_io ├───js_adc ├───js_io ├───pinstate └───webterm └───src Outils de chargement Modtronix Network Bootloader Installé, mais ne déamarre pas par le menu! Il faut le lancer par: "C:\Program Files\Modtronix Engineering\Netloader V107\bin\go_jre150_05.bat" Essais de modification: \src\webpages\pinstate\index.htm et le cgi. Résultat: plus de page visible par le browser! Affiche: Not found. Essais de recharger le tout \Pic\Soft\websrvr65\demo_webserver\src\out\websrvr65_mc_hw221.hex et c:\Users\Yves\Documents\Pic\Soft\websrvr65_v310\src\webpages\default.img c'est OK! Envoi d'images avec Total Commander par ftp Il n'y pas de possibilité de voir le répertoire (commande non reconnue). De plus, suite l'envoi du fichier, la déconnexion est automatique. Il faut parfois s'y prendre à 2 fois pour que la page s'affiche correctement. html_io.img js_adc.img js_io.img webterm.img Lance java (demande d'ancienne version) Travailler avec Network Bootloader L'image « pinstate.img » n'ayant pas fonctionné, je ré-essaie sa compilation, ce qui provoque une exception java! Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at com.modtronix.netloader.Mxfsee.createOutputFile(Mxfsee.java:86) at com.modtronix.netloader.PaneWebfiles.btnCompileActionPerformed(PaneWe bfiles.java:713) La solution est dans le fichier « filelist.mxweb », qui est une sorte de makefile. Or la pinstate.img fait référence à un dossier inexistant. Je le corrige ainsi: outfile = .\..\pinstate.img Soit le répertoire immédiatement supérieur; et tout fonctionne correctement. Adaptation du bootloader pour java 1.6 Batch, adapté de go_jre150_05.bat : "c:\Program Files\Java\jre1.6.0\bin\java.exe" -cp "../conf/;../patches/;../lib/jlfgr-1_0.jar;../lib/log4j.jar;../lib/dom4j1.6.1.jar;../lib/jaxen-1.1b8.jar;modtronix.jar" com.modtronix.netloader.Application Outil de développement intégré MPLAB Télécharger « MPLAB Integrated Development Environment » depuis le site de http://www.microchip.com/: Home Products Home Page Development Tools Main Page La version 8.30 pèse 95 Mb – zippé. Attention: à l'installation, il y a tentative de fermer les applications ouvertes!! Dont l'antivirus Avast, p. Exemple. Le Hitech C compiler est installé depuis l'Internet. Compilateurs HI-TECH PICC-18 et MPLAB C18 Télécharger sur le site (licence étudiant/hobby) http://www.microchip.com/stellent/idcplg? IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010014&part=SW006011 HCPIC18P-PRO-9.63PL1.exe • Installation dans: c:\Program Files\HI-TECH Software\PICC-18\PRO\9.63\ • Installation du MPLAB C18 C Compiler (Student version), lien sur le site de modtronix. Malgré les config par défaut, ouvrir un projet donne: Environnement – le projet On peut travailler de 2 manières: 1) par projet (.mcp) 2) par worspace (.mcw) Dans ce cas, plusieurs projets peuvent être chargés. On active le projet désiré. En plus de la version, on a : websrvr65_ht_hwXXX ou websrvr65_mc_hwXXX (les versions websrvr65_nobl_ht_hwXXX ne comportent pas le boot loader « no boot loader ») - A éviter pour le développement '_ht_ pour le HiTech; '_mc_ pour le MCC Par projet, il faut encore spécifier le compilateur (Project/Select langage toolsuite...) Quant à la version XXX, par exemple 211, il ne faut pas s'étonner qu'elle diffère de la version du hard, car Modtronix indique: All SBC65EC boards with HW version higher than HW2.11, use the HW2.11 projects. Copie de projet – udate Pour travailler sur une copie du projet, de manière à revenir à 100% sur une version fonctionnelle, passer par les étapes suivantes: 1) copier tout les répertoires dans un nouveau (ex. Projet_03) 2) renommer le .mcp; ex: projet_03.mcp 3) Dans l'IDE MPLAB, choisir Projet->Open et introduire le projet_xy.mcp désiré Le fichier .mcp conteint des path relatif. Test avec le compilateur HI-TECH Skipping file. There is no tool to process the file with the given suffix. L'erreur initiale vient du choix de compilateur à refaire; • \Pic\Soft\websrvr65_v306\src\projdefs.h:312:Error [1099] "Board type not defined!" Il faut définir BRD_SBC65EC et HAS_BOOTLOADER dans: les Options/Build options/Projet. Il reste les erreurs: Error Error "itoa" [984] .\net\helpers.h; 80.44 type redeclaré [1098] .\net\helpers.h; 80.44 conflit de déclaration pour la variable ... Sur le forum , Modtronix répond que le HI-Tech n'est plus supporté, car moins efficace que le MCC18, par ailleur gratuit en version « étudiant »... Tests avec MCC18 Il est installé dans c:\MCC18 Config Mais reste le pb, la config ne définit pas le compilateur , il faut l'indiquer dans Project/Select langage toolsuite: Options du projet Pour que le projet compile, il faut encore mettre à jour les options du projet: activer le Projet / Build option... / Projet (bas de la liste): Sans quoi des erreurs de définitions surviennent. Path source Suivant la longueur du Path, la compilation passerait, à un bémol près: Error - Source file 'C:\Users\Yves\Documents\Pic\Soft\websrvr65_v310\src\net\arptsk.c' name exceeds file format maximum of 62 characters. Solution Vista/Windows 7: créer un lien de type jonction dans la racine (ainsi, la sauvegarde des données de l'utilisateur fonctionne) C:\>mklink /j Pic c:\Users\Yves\Documents\Pic Jonction créée pour Pic <<===>> c:\Users\Yves\Documents\Pic Solution générale: déplacer le répertoire de manière à être plus proche de la racine. HEX final: c:\Pic\Soft\websrvr65_v310\out\websrvr65_mc_hw211.hex 180750 bytes Changer l'adresse IP par défaut à 10.1.1.1 Dans le fichier projdefs.h, au lieu de 10.1.0.1, on passe à 10.1.1.1: * Use these defines to define the default IP address of the device. */ #define MY_DEFAULT_IP_ADDR_BYTE1 (10) #define MY_DEFAULT_IP_ADDR_BYTE2 (1) #define MY_DEFAULT_IP_ADDR_BYTE3 (1) #if defined(DEMO_MODE) #define MY_DEFAULT_IP_ADDR_BYTE4 (50) #else #define MY_DEFAULT_IP_ADDR_BYTE4 (1) #endif Compréhension du système – part WEB Page html Le système WEB démarre sur index.htm, composé d'une table à 2 colonnes, dont celle de gauche comporte une série de liens qui s'adressent à une cellule du tableau de droite: home Menu 1 Menu 2 Menu 3 ... <td width="100%" height="100%" valign=top> <iframe width="100%" height="100%" name=main src="intro.htm" scrolling="auto" frameborder=0> </iframe> </td> Un menu comporte la référence sur un *.cgi, ainsi: <td class=menuBtn><a href="ioval.cgi" target=main>Etat des prises </a></td> Ici, un clic sur l'ancre définie sur « ioval.cgi » va le lancer. Le résultat du cgi sera affiché dans la cellule du tableau nommée « main » (ex. ci-dessus) Script CGI la page combinée (extension .cgi) contient un mixte de fonctions en javascript, de html contenant des tableaux dont les cellules sont complétées par un appel en javascript. Si le script commence par la lettre 'x', tel que x<nom>.cgi, une vérification d'autorisation est faite (sécurité, authentication required). Les scripts sont 'parsés' et les codes reconnus remplacés par une valeur. Par exemple, le fichier in_a2.cgi, verra la valeur de %a02 substituée par '0' ou '1' selon l'état 0V ou 5V de la pin du port A2 du CPU. fonctions en Javascript Les javascripts sont inclus dans le HTML par l'inclusion d'un fichier '*.js' : <script src="lib01.js"></script> -ou- écrit directement dans la page, tel: <script type="text/javascript"> if (%l03 == 0) sectags(); else { acfg(%k31,%k32 /*adcon1 and adcon2*/ ); } </script> Script Fonctions, commentaires Fichiers page cmdcfg65.js uccfg(cmdL,cmdH,cmdrL,cmdrH,fl) scfgSubmit() xccfg.cgi iocfg65.js drawCheckboxesRow(label,id, mask, value) iocfg(ta,tb,tc,tf,tg,pa,pb,pc,pf,pg) xiocfg.cgi lib01.js Sectags() *.cgi demomsg() toHex(dec) /* convert decimal value (0 - 255) to hexadecimal */ selOpt(sel, type, val)/* Select the option (in the given Select) with the given string value. Type is [s, i, x] for [str, int, hex] option */ getByte(val,def)/* Checks given value and returns a value from 0-255.*/ getCbxHex(id,inverted)/* * Returns the uppercase hex value of 8 checkboxes with id's = id0, id1 .... id7 * - id = id or each checkbox. 0 to 7 is appended to id string * - inverted */ getCbxByte(id,inverted)/* * Returns the decimal byte value of 8 checkboxes with id's = id0, id1 .... id7 * - id = id or each checkbox. 0 to 7 is appended to id string * - inverted */ netcfg01.js ncfg(i1,i2,i3,i4,g1,g2,g3,g4,s1,s2,s3,s4,m1,m2,m3,m4,m5,m6,net xncfg.cgi Flags,a,n)/* * Displays network configuration page * - i1 to i4 = IP address * - g1 to g4 = Gateway address * - s1 to s4 = Subnet Mask * - m1 to m6 = MAC address * - netFlags = Netflags * - a = AppConfig array * - n = NetBIOS name */ ncfgSubmit() pwmcfg65.js pwmcfg(mode, enable, freq) pcfgSubmit() XPCFG.CGI sercfg65.js ucfg(baud1) XUCFG.CGI syscfg65.js elePos(e) ttShow(evt)/* ToolTip Show */ function ttHide(evt)/* ToolTip Hide */ ttInit() scfg(user, stackVer, appVer, bootDly, serDly, sysFlags, hasBL) XSCFG.CGI XUSER.CGI webcfg65.js webcfg(fl,fl2,portL,portH) XWCFG.CGI Modification des javascripts Il n'est pas aisé de mettre au point, voir de modifier des javascripts. Les problèmes sont: – les fautes de codage – l'appel par page WEB – la mise en cache Pour les fautes de codage, il faut activer la console d'erreur de Firefox , menu Outils. Le plus simple est d'essayer au niveau fichier en utilisant une page html de test. On évite de devoir recompiler et charger le tout sur le module. La mise en cache des script est particulièrement énervant, car les modifications/corrections apportées n'ont pas d'effet sur la page... Les moyens sont: – de procéder par Shift – reload (page initiale); – d'ouvrir le résultat dans une nouvelle fenêtre; – de vider le cache par Outils -> Effacer mes traces PT32E : Commande du bloc LED par GET Le bloc LED sur le print PT32E (document pt24er1.doc) est commandé par un IC 74HC595. Les pattes du port c utilisées sont c0: data, c1: clock, c2: latch. La disposition des LEDs est la suivante: 2 4 6 8 1 3 5 7 Avec: 8: première valeur introduite dans le registre, 1 la dernière. Les valeurs sont introduite au moyen de commandes GET en série; c0, c1, c2 sont programmés en sortie. • Commande pour 'clocker' la valeur 1: c0=1&c1=1&c1=0 • Commande GET pour 'clocker' la valeur 0: c0=0&c1=1&c1=0 • Commande de latch – positione les LEDs: c2=1&c2=0 Le plus simple est de préparer la commande dans Notepad, sur plusieurs lignes (Firefox n'est pas sensible au retour ligne); et de copier-coller le tout dans la fenêtre URL du navigateur. Extinction de toutes LEDs: Chaque ligne modifie la variable et envoie deux coup de clock 1->0, 1->0. Au final, c2 copie le registre sur les sorties activant les LEDs (note: il n'est pas utile de répéter la mise à 0 de c0, mais c'est plus pratique pour comprendre ce que l'on fait et l'homogénéité des commandes préparées) http://10.1.1.1/? c0=0&c1=1&c1=0&c0=0&c1=1&c1=0& c0=0&c1=1&c1=0&c0=0&c1=1&c1=0& c0=0&c1=1&c1=0&c0=0&c1=1&c1=0& c0=0&c1=1&c1=0&c0=0&c1=1&c1=0& c2=1&c2=0 Allumage de toutes LEDs: http://10.1.1.1/? c0=1&c1=1&c1=0&c0=1&c1=1&c1=0& c0=1&c1=1&c1=0&c0=1&c1=1&c1=0& c0=1&c1=1&c1=0&c0=1&c1=1&c1=0& c0=1&c1=1&c1=0&c0=1&c1=1&c1=0& c2=1&c2=0 Allumage par paire: 11001100 Commande complète: http://10.1.1.1/? c0=1&c1=1&c1=0&c0=1&c1=1&c1=0&c0=0&c1=1&c1=0&c0=0&c1=1&c1=0&c0=1&c1=1&c1 =0&c0=1&c1=1&c1=0&c0=0&c1=1&c1=0&c0=0&c1=1&c1=0&c2=1&c2=0 Analyse du code interpréteur Code C impliqué Mxwebsrvr.c - Boucle principale main() La boucle principale main() est dans mxwebsrvr.c, par une boucle while(1) après les initialisations. – (343) la variable aliveCntrMain sert de watch-dog – (348) Elle fait clignoter le LED par B6 à 1 Hz – différentes tâches, via StackTask() – (379) HTTPServer(), puis FTPServer(), sont appelées – (387) DiscoveryTask() renseigne un broadcast en renvoyant l'adresse MAC dans announce.c – (395) ProcessIO() contient les applications spécifiques – tourne à 10 ms – (399) le code debug affiche le décompte et la nouvelle adresse IP si le DHCP a renouvelé l'adresse du board – Une nouvelle tâche hardware/software devrait être introduite dans ProcessIO(). Le soft ajouté doit être exécuté rapidement, ou, si la tâche est longue, elle doit être divisée en petit blocs. Ceci part d'un principe de multi-tâche coopératif. Httpexec.c – traitement des requêtes HTTP Le code de la fonction (188) execNameValueCmd() est placé dans cmd.c. – (82) Des constantes pour les réponses sont mises en ROM char texte[] = « valeur »; – (139) la fonction HTTPExecGetCmd() est un call-back du serveur HTTP. Elle traite de toutes les configurations: Port I/O, ADC, PWM, USART, LAN, etc. – (298) la fct HTTPGetVar() est un call-back du serveur HTTP. Elle est appelée lors de la substitution de variables (tags) dans la page à servir. Un mécanisme indique si c'est le 1er appel. La fct ne retourne qu'un chr à la fois; plusieurs appels sont nécessaires pour tout passer, avec un mécanisme de flags HTTP_START_OF_VAR / HTTP_END_OF_VAR que doit gérer l'application. – (395) l'utilisateur est testé: USER_ADMIN ou USER_GUEST – (257) fct HTTPGetVar(), lecture variables , mise en structure getTagInfo et appel de cmdGetTag(&getTagInfo) dans cmd.c Ce module doit être mis à jour et augmenté pour supporter des nouveaux formats et sortir des valeurs ou des états internes dans une page WEB, par la fonction HTTPGetVar() - détails ciaprès. La fontion HTTPGetVar() Cette fonction se charge de substituer les tags des script ou contenu dans l'HTML par la valeur d'une variable (ou de variables). Modèle: WORD HTTPGetVar(HTTP_INFO* httpInfo, BYTE* val) Fonctionnement La fonction principale HTTPServer() l'appelle dès qu'un tag est rencontré dans la page à servir. Par le paramètre 'val' on connait l'état du traitement, qui vaut HTTP_START_OF_VAR au départ. Il faut ensuite retourner les caractères un à un, lorsque c'est fini, faire pointer 'val' sur HTTP_END_OF_VAR. Ne rien retourner (terminé immédiatement) *val = '0'; return HTTP_END_OF_VAR; Renvoyer un string local La technique consiste à faire pointer 'val' sur le début de la chaîne préalablement établie, et lorsque ce pointeur est sur le '\0' final, retourner HTTP_END_OF_VAR. Entre-temps, 'val' nous sert de pointeur courant entre les appels. *val = strTmp[(BYTE)ref]; if ( strTmp[(BYTE)ref] == '\0' ) return HTTP_END_OF_VAR; (BYTE)ref++; return ref; Note: le \'0' final n'est pas vraiment utilisé, si ce n'est pour marquer la fin du string et renvoyer HTTP_END_OF_VAR. Comme 'ref' est un byte, il n'est pas possible d'envoyer plus de 255 caractères à la fois. Fonction annexes: static WORD cmdGetROMStringVar(BYTE ref, BYTE* val, ROM char* str) Rend une chaîne statique définie en ROM static WORD cmdGetEepromStringVar(BYTE ref, BYTE* val, WORD adr) Pointer avec 'adr' sur une chaîne fixe, en EEPROM. static WORD cmdGetWordVar(BYTE ref, BYTE* val, WORD w) Rend un mot w au format décimal, par itoa() static WORD cmdGetWordHexVar(BYTE ref, BYTE* val, WORD w) Rend la valeur d'un byte en hexa Cmd.c; cmd.h – traitement des commandes HTTP et GET l'analyse d'une requête GET ou UDP est décrite dans le fichier cmd.h. Les commandes actuelles sont: Code Usage Exemple a-j commandes des ports a à j sur ce module: ports a à g k Config bytes. Positionne les bytes (ou les bits) de configuration du CPU dans la plage 00..FF b=FF mets les 8 pins du port b à 1 (le HEX doit être en majuscules!) a0=0 : met la pin 0 du port a à 0 b1p=9: fait une pulse de 9 us sur b1 c2n=5: fait une pulse nég. De 5 us ac0=1: configure a0 en sortie ac0r=1:configure a0 en sortie, mais permanent (même après power-up) k2A=15: le registre TRIS du port F, à l'adresse 2A est positionné avec 00001111, soit 0xF k2A=H0F: idem, mais valeur en hexa k05b6=1: positionne le bit 6 du registre 0x05 k05b6=0: clear le bit 6 du registre 0x05 l Commande générale la lb ln la=user1: log l'utilisateur « user1 » lb=123xyz: indique le nouveau password « 123xyz » ln=modul09: indique le nouveau nom NetBIOS du module comme « modul09 » m Commande courte m=r: reset du module! m=l: le module va demander un login m=o: le module va dé-logguer l'utilisateur n Commandes sérielles Pas implémenté w Commande PWM W1=128: positionne la largeur d'impulsion à 50% sur le timer 1 Une machine d'états finis permet de suivre le traitement des commandes. (137) Elle est définie par une énumération SM_CMDX. Fonctions de traitement des commandes: – (142) fct cmdInit(): initialisation – (172) fct cmdTask(): appelée toute les 2 ms, traite les cmd UDP, TCP et en mode GET – (540) fct execNameValueCmd(): traite les paires nom=valeur selon le tableau ci-dessus Une nouvelle fonctionnalité devrait être intégrée à execNameValueCmd(), en créant un nouveau groupe de commandes. L'interprétation des paramètres, ainsi que la syntaxe est prise en charge ici. Il faut stocker les valeurs et les états indiqués par la nouvelle commande. PIN I/O à disposition Recommandation Modtronic Page: http://forum.modtronix.com/index.php?topic=491.0 – – – – – Ports A0 – A5 Ports B0 – B5 Ports C0, C1, C2, C5 Ports F0 – F7 Ports G0 - G3 (Marked as D0, D1, D6 and D7 on prototype daughter board) Avec les indications/restrictions suivantes: – – – – – A4 est Open Collecteur: ne pas utiliser en sortie B6, B7 sont utilisés pour la programmation (B6 pour la LED rouge) C6, C7 sont utilisés par l'USART 1 F7 pourra être utilisé pour le CS de la FRAM G1 et G2 sont utilisés par l'USART 2; G0, G2 par le CAN Bus du board SBC68EC Mémoire à disposition Infos de la page http://forum.modtronix.com/index.php?topic=491.0 Il y a 3 types de mémoires: EEPROM interne, Flash interne, EEPROM externe L'EEPROM interne – taille 1024 bytes Utilisation par le serveur: 256 bytes nécessaires pour le Stack. Il est envisagé de le pousser à 512 bytes; il faut donc n'utiliser que les 512 restant au maximum! Flash interne – taille 98K 2K sont WR protect, contiennent le bootloader 32K utilisées par le Stack 64K libres EEPROM Externe - taille 64K 64 bytes sont réservés par défaut pour le démarrage de l'application principale. Ecrire ces bytes va corrompre le démarrage du système! 32786 bytes pour le fichier « default.img », soit l'ensemble des pages WEB compressées. 32 K libres. Pour changer la réservation: il faut modifier "FSEE_RESERVE_BLOCK" défini dans le fichier « projdefs.h ». De plus, il faut écrire 128 bytes à la fois Ecrire les données dans l'EEPROM Interne convient, vu la faible quantité. Les fct pour lire/écrire existent: appcfgGetc() et appcfgPutc(). Horloge RTC DS 1307 Ajout du code issu de http://forum.modtronix.com/index.php?topic=688.0, soit : uSysClk.h, uSysClk.c, uDS1307.h, uDS1307.c; Modif de : – mxwebsrvr.c, fonction main(): – uDS1307.c, #include "user\uSysClk.h" – uSysClk.c, idem + supression #include Main.h – fct void FC_SystemClock(bool BOOL Clk10ms) //update ons and wave flags and DB_SystemClock.Alive FC_SystemClock(0); //Update date/time from RTC if (DB_SystemClock_RequestRTCUpdate) { DS1307_ReadSysDateTime(); } Configuration de Debug Câblage Installer une liaison sérielle entre l'ordinateur qui reçoit le « Modtronix embedded debugger », une fiche de conversion RS232 <--> USB fonctionne. La vitesse par défaut est 57600 Bd. Compilation « Debug » Le code du projet est compilé en mode DEBUG si la ligne contenant la définition: #define DEBUG_OFF est commentée, dans le fichier "projdefs.h" du projet à debugger. Dans son propre projet, on aura préalablement prévu en compilation conditionnelle des codes de DEBUG par des émissions de caractères du genre: #if (DEBUG_CMD >= LOG_WARN) debugPutMsg(1); //@mxd:1:Invalid offset for configuration byte = %s debugPutByte(name[1]); debugPutByte(name[2]); debugPutByte(0); //Null terminate string #endif Fichier de configuration mxdebug.xml Les codes émis doivent être interprétés par le Débugger. Une configuration est décrite dans le fichier mxdebug.xml Les code 127 à 255 représentent un message, mais seuls les codes de 0xD0 à 0xDF sont libres pour une extension « customisée ». Outil « Embedded Debugger » Ici, le débugger est connecté via le COM4 à 57600 Bd (en fait, virtuel par le driver USB du câble sériel). Vide au départ, la fenêtre affiche les onglets dès que le répertoire du projet est sélectionné. Ici: C:\users\Yves\Documents\Pic\Soft\websrvr65_v310\src, où se trouve mxdebug.xml. Attention: à l'enclenchement du PC, le module peut déjà envoyer des codes qui sont pris par Windows par une souris!! Le Debugger ne fonctionnera pas!