'*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' ' ' Copyright (C) 2001 Xavier Fenard tout droits réservés. Autorisation ' est donnée pour utiliser, modifier ou distribuer ce logiciel tant qu'il ' n'est pas vendu ou exploité pécuniairement. ' CE LOGICIEL EST DONNE TEL QUEL ET SANS AUCUNE GARANTIE, NI EXPLICITE OU IMPLICITE ' ' ' Copyright (C) 2001 Xavier Fenard All rights reserved. Permission ' is granted to use, modify, or redistribute this software so long as it is ' not sold or exploited for profit. ' THIS SOFTWARE IS PROVIDED AS IS AND WITHOUT WARRANTY OF ANY KIND, EITHER ' EXPRESSED OR IMPLIED. ' '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Programme QBasic pour les modules FXRS485 'IHM venant du programme Reseau de Mr Dominique Pierre 'Pour eviter les erreurs 'CE PROGRAMME ne permet pas d'editer la memoire 'UTILISER MON485 pour cela 'PAS de MAINTENANCE sur CE PROGRAMME 'IL est fourni DANS l'ETAT 'IL permet d'illustrer le dialogue avec le module combochip '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' DECLARE FUNCTION TelHF% (Boitier%) DECLARE FUNCTION ReceivTim% () DECLARE FUNCTION SerXfrAS% () DECLARE SUB PingAdrs01 () DECLARE SUB Dump () DECLARE FUNCTION LecMemoire% (Adrs%) DECLARE FUNCTION AffCPU$ (Code%) DECLARE FUNCTION AffFonc$ (Code%) DECLARE FUNCTION BinBCD$ (Valeurs%) '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' DECLARE FUNCTION Valh% (Chaine$) DECLARE FUNCTION MyHex$ (var%) DECLARE SUB PrintHelpLine (help$) DECLARE SUB Initialisation () DECLARE SUB Center (row%, text$) DECLARE SUB MyCls (dots%, Background%) DECLARE SUB MenuSystem () DECLARE SUB Box (Row1%, Col1%, Row2%, Col2%) DECLARE FUNCTION Menu% (CurrChoiceX%, MaxChoice%, choice$(), ItemRow%(), ItemCol%(), help$(), BarMode%) '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' DEFINT A-Z CONST TRUE = -1 CONST FALSE = NOT TRUE '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' ' Interface utilisateur V0.0 TYPE TrameType Ads AS INTEGER Fct AS INTEGER Nbm AS INTEGER Adr AS INTEGER StationType AS INTEGER SerialLow AS INTEGER SerialHigh AS INTEGER VersionA AS INTEGER VersionM AS INTEGER Courant AS INTEGER END TYPE 'Variables globales DIM SHARED ColorPref 'Preference couleur DIM SHARED colors(0 TO 20, 1 TO 4) 'Differentes couleurs DIM SHARED IocbIn AS TrameType 'Bloc de controle In DIM SHARED IocbOut AS TrameType 'Bloc de controle Out DIM SHARED TrameIn(11) 'Tableau de donnees In DIM SHARED TrameOut(11) 'Tableau de donn‚es Out DIM SHARED TimeOut AS INTEGER 'Flag de time-out DIM SHARED Date(256) AS INTEGER 'Date de transfert DIM SHARED Station AS INTEGER 'Adresse de la station selectee '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Debut du programme ON ERROR GOTO ErrGestion Initialisation ON TIMER(2) GOSUB TimeOutTrame CLS Station%=01 'station par defaut MenuSystem 'Main program COLOR 7, 0 'Clear screen CLS CLOSE 1 SYSTEM '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' ErrGestion: PRINT "erreur numero ";ERR RESUME NEXT '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' TimeOutTrame: TimeOut = TRUE RETURN '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' 'Datas definissant les couleurs disponibles dans le menu. ' scrn dots bar back title shdow choice curs cursbk shdow DATA 0, 7, 15, 7, 0, 7, 0, 15, 0, 0 DATA 1, 9, 12, 3, 0, 1, 15, 0, 7, 0 DATA 3, 15, 13, 1, 14, 3, 15, 0, 7, 0 DATA 7, 12, 15, 4, 14, 0, 15, 15, 1, 0 '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ '********************INTERFACE HOMME MACHINE 'Box: Trace sur l'ecran une boite definie par les coordonnees. SUB Box (Row1, Col1, Row2, Col2) STATIC BoxWidth = Col2 - Col1 + 1 LOCATE Row1, Col1 PRINT "Ú"; STRING$(BoxWidth - 2, "Ä"); "¿"; FOR a = Row1 + 1 TO Row2 - 1 LOCATE a, Col1 PRINT "³"; SPACE$(BoxWidth - 2); "³"; NEXT a LOCATE Row2, Col1 PRINT "À"; STRING$(BoxWidth - 2, "Ä"); "Ù"; END SUB 'Center: Centre du texte sur la ligne donnee. SUB Center (row, text$) LOCATE row, 41 - LEN(text$) / 2 PRINT text$; END SUB 'Initialisation: Lecture des couleurs SUB Initialisation WIDTH , 25 VIEW PRINT FOR ColorSet = 1 TO 4 FOR x = 1 TO 10 READ colors(x, ColorSet) NEXT x NEXT ColorSet ColorPref = 2 '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Ouveture de la liaison s‚rie OPEN "COM2:9600,N,8,1,RS,CS0,DS0,CD0" FOR RANDOM AS 1 'OPEN "COM2:9600,N,8,2,RS,CS0,DS0,CD0" FOR RANDOM AS 1 END SUB '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' 'Menu: ' Gere un sous-menu ou une barre de menu ' currChoiceX : Numero du choix courant ' maxChoice : Nombre de choix dans la liste ' choice$() : Tableau des textes de choix ' itemRow() : Tableau des lignes de choix ' itemCol() : Tableau des colonnes des choix ' help$() : Tableau des lignes d'aide ' barMode : Boolean: TRUE = menu bar style, FALSE = drop down style ' FUNCTION Menu (CurrChoiceX, MaxChoice, choice$(), ItemRow(), ItemCol(), help$(), BarMode) currChoice = CurrChoiceX IF BarMode THEN COLOR colors(7, ColorPref), colors(4, ColorPref) LOCATE 1, 1 PRINT SPACE$(80); ELSE MyCls colors(2, ColorPref), colors(1, ColorPref) COLOR colors(7, ColorPref), colors(4, ColorPref) Box ItemRow(1) - 1, ItemCol(1) - 1, ItemRow(MaxChoice) + 1, ItemCol(1) + LEN(choice$(1)) + 1 COLOR colors(10, ColorPref), colors(6, ColorPref) FOR a = 1 TO MaxChoice + 1 LOCATE ItemRow(1) + a - 1, ItemCol(1) + LEN(choice$(1)) + 2 PRINT CHR$(178); CHR$(178); NEXT a LOCATE ItemRow(MaxChoice) + 2, ItemCol(MaxChoice) + 2 PRINT STRING$(LEN(choice$(MaxChoice)) + 2, 178); END IF 'print the choices COLOR colors(7, ColorPref), colors(4, ColorPref) FOR a = 1 TO MaxChoice LOCATE ItemRow(a), ItemCol(a) PRINT choice$(a); NEXT a finished = FALSE WHILE NOT finished GOSUB MenuShowCursor GOSUB MenuGetKey GOSUB MenuHideCursor SELECT CASE Kbd$ CASE CHR$(0) + "H": GOSUB MenuUp CASE CHR$(0) + "P": GOSUB MenuDown CASE CHR$(0) + "K": GOSUB MenuLeft CASE CHR$(0) + "M": GOSUB MenuRight CASE CHR$(13): GOSUB MenuEnter CASE CHR$(27): GOSUB MenuEscape CASE ELSE: BEEP END SELECT WEND Menu = currChoice EXIT FUNCTION MenuEnter: finished = TRUE RETURN MenuEscape: currChoice = 0 finished = TRUE RETURN MenuUp: IF BarMode THEN BEEP ELSE currChoice = (currChoice + MaxChoice - 2) MOD MaxChoice + 1 END IF RETURN MenuLeft: IF BarMode THEN currChoice = (currChoice + MaxChoice - 2) MOD MaxChoice + 1 ELSE currChoice = -2 finished = TRUE END IF RETURN MenuRight: IF BarMode THEN currChoice = (currChoice) MOD MaxChoice + 1 ELSE currChoice = -3 finished = TRUE END IF RETURN MenuDown: IF BarMode THEN finished = TRUE ELSE currChoice = (currChoice) MOD MaxChoice + 1 END IF RETURN MenuShowCursor: COLOR colors(8, ColorPref), colors(9, ColorPref) LOCATE ItemRow(currChoice), ItemCol(currChoice) PRINT choice$(currChoice); PrintHelpLine help$(currChoice) RETURN MenuGetKey: Kbd$ = "" WHILE Kbd$ = "" Kbd$ = INKEY$ WEND RETURN MenuHideCursor: COLOR colors(7, ColorPref), colors(4, ColorPref) LOCATE ItemRow(currChoice), ItemCol(currChoice) PRINT choice$(currChoice); RETURN END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' SUB MenuSystem DIM choice$(20), menuRow(20), menuCol(20), help$(20) LOCATE , , 0 choice = 1 finished = FALSE WHILE NOT finished GOSUB MenuSystemMain subchoice = -1 WHILE subchoice < 0 SELECT CASE choice CASE 1: GOSUB MenuExit CASE 2: GOSUB MenuLCD CASE 3: GOSUB Telecommande CASE 4: GOSUB MiseHeure CASE 5: GOSUB MenuCouleurs END SELECT MyCls colors(2, ColorPref), colors(1, ColorPref) SELECT CASE subchoice CASE -2: choice = (choice + 4) MOD 6 + 1 'MOD "nbchoix+1 CASE -3: choice = (choice) MOD 6 + 1 END SELECT WEND WEND EXIT SUB MenuSystemMain: MyCls colors(2, ColorPref), colors(1, ColorPref) COLOR colors(7, ColorPref), colors(4, ColorPref) Box 9, 14, 14, 66 Center 11, "Utilisez les flŠches pour naviguer dans les menus" Center 12, "Enter pour selectionner un ŠlŠment du menu" choice = 1 choice$(1) = " Syst‚me " choice$(2) = " Conf LCD " choice$(3) = " Telcom " choice$(4) = " Heure " choice$(5) = " Couleurs " menuRow(1) = 1: menuCol(1) = 1 menuRow(2) = 1: menuCol(2) = 12 menuRow(3) = 1: menuCol(3) = 21 menuRow(4) = 1: menuCol(4) = 32 '32 menuRow(5) = 1: menuCol(5) = 59 '32 help$(1) = "Configuration Systeme" help$(2) = "Configuration LCD" help$(3) = "Telecommande HF" help$(4) = "Mise a l'heure/date" help$(5) = "Configuration couleurs" DO NewChoice = Menu((choice), 5, choice$(), menuRow(), menuCol(), help$(), TRUE) LOOP WHILE NewChoice = 0 choice = NewChoice RETURN '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' MenuExit: choice$(1) = " Exit " choice$(2) = " Select COM1 " choice$(3) = " Select COM2 " choice$(4) = " Test Ping " 'XF choice$(5) = " Dump Memoire" 'XF choice$(6) = " Info Station" 'XF choice$(7) = " Nb Station " 'XF choice$(8) = " Message " 'XF choice$(9) = " Contr ON " 'XF choice$(10)= " Contr OFF " 'XF choice$(11)= " Detections " 'XF menuRow(1) = 3: menuCol(1) = 2 menuRow(2) = 4: menuCol(2) = 2 menuRow(3) = 5: menuCol(3) = 2 menuRow(4) = 6: menuCol(4) = 2 'XF menuRow(5) = 7: menuCol(5) = 2 'XF menuRow(6) = 8: menuCol(6) = 2 'XF menuRow(7) = 9: menuCol(7) = 2 'XF menuRow(8) = 10: menuCol(8) = 2 'XF menuRow(9) = 11: menuCol(9) = 2 menuRow(10) = 12: menuCol(10) = 2 menuRow(11) = 13: menuCol(11) = 2 help$(1) = "Retour au DOS" help$(2) = "Utilisation du port s‚rie Nø 1" help$(3) = "Utilisation du port s‚rie Nø 2" help$(4) = "Test Ping station 01" help$(5) = "Affichage memoire Station" help$(6) = "Info Station" help$(7) = "Change Station" help$(8) = "Envoi Message" help$(9) = "Station Somme controle ON" help$(10)= "Station Somme controle OFF" help$(11)= "Lecture boutons" subchoice = Menu(1, 11, choice$(), menuRow(), menuCol(), help$(), FALSE) SELECT CASE subchoice CASE 1: finished = TRUE CASE 2: CLOSE 1 'OPEN "COM1:9600,N,8,1,RS,CS0,DS0,CD0" FOR RANDOM AS 1 OPEN "COM1:9600,N,8,2,RS,CS0,DS0,CD0,RB16,OP0" FOR RANDOM AS 1 CASE 3: CLOSE 1 OPEN "COM2:9600,N,8,1,RS,CS0,DS0,CD0" FOR RANDOM AS 1 'OPEN "COM2:9600,N,8,2,RS,CS0,DS0,CD0" FOR RANDOM AS 1 CASE 4: PingAdrs01 CASE 5: Dump CASE 6: InfoStationPrn CASE 7: Box 10, 10, 12, 50 LOCATE 11, 12 LINE INPUT "Adresse de la Station(hex) (01..7F) -> ", Adresse$ Station% = Valh(Adresse$) CASE 8 MessageLCD CASE 9 Er%=MaskANDMemoire% (ConfigRAM, &H7F) CASE 10 Er%=MaskORMemoire% (ConfigRAM, &H80) CASE 11 Box 10, 10, 17, 50 LOCATE 11, 12 PRINT "lecture" FOR N= 0 TO 3 LOCATE 12+N, 13 Er%=LectBouton%(N) IF (Er%<>0) THEN PRINT "detection bouton ",N END IF NEXT N LOCATE 16, 13 LINE INPUT "CR ->Retour ", A$ CASE ELSE END SELECT RETURN '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' MenuLCD: choice$(1) = " Mode LM40 ON " 'XF choice$(2) = " Mode LM40 OFF " 'XF choice$(3) = " Mode 2 L ON " 'XF choice$(4) = " Mode 2 L OFF " 'XF choice$(5) = " Message " 'XF choice$(6)= " Effacement " 'XF menuRow(1) = 3: menuCol(1) = 12 menuRow(2) = 4: menuCol(2) = 12 menuRow(3) = 5: menuCol(3) = 12 menuRow(4) = 6: menuCol(4) = 12 menuRow(5) = 7: menuCol(5) = 12 menuRow(6) = 8: menuCol(6) = 12 help$(1) = "Afficheur 1*16 1 controleur (config RAM)" help$(2) = "Afficheur 1*16 2 controleurs (config RAM)" help$(3) = "Afficheur 2*16 (config RAM)" help$(4) = "Afficheur 1*16 (config RAM)" help$(5) = "Message" help$(6) = "Effacement" subchoice = 1 DO subchoice = Menu(subchoice, 6, choice$(), menuRow(), menuCol(), help$(), FALSE) SELECT CASE subchoice CASE 1 Er%=MaskANDMemoire%(ConfigRAM,&HFE) 'B0=0 CASE 2 Er%=MaskORMemoire%(ConfigRAM, &H01) 'B0=1 CASE 3 Er%=MaskORMemoire%(ConfigRAM, &H02) 'B0=1 CASE 4 Er%=MaskANDMemoire%(ConfigRAM,&HFD) 'B0=0 CASE 5 MessageLCD CASE 6 Er%= LCDData (&H0A,0,1) 'efface l'afficheur et inhibit affichage horloge Valeure%=MaskANDMemoire% (ConfigRAM, &HFB) 'fin inhibit affichage horloge CASE ELSE END SELECT LOOP WHILE subchoice > 0 RETURN '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' Telecommande: choice$(1) = " Start Marche " 'XF choice$(2) = " Star Arret " 'XF choice$(3) = " MM53200 1 " 'XF choice$(4) = " MM53200 2 " 'XF choice$(5) = " UM3758 1 " 'XF choice$(6)= " UM3758 2 " 'XF menuRow(1) = 3: menuCol(1) = 21 menuRow(2) = 4: menuCol(2) = 21 menuRow(3) = 5: menuCol(3) = 21 menuRow(4) = 6: menuCol(4) = 21 menuRow(5) = 7: menuCol(5) = 21 menuRow(6) = 8: menuCol(6) = 21 help$(1) = "Star On" help$(2) = "Star Off" help$(3) = "MM53200" help$(4) = "MM53200" help$(5) = "UM3758" help$(6) = "UM3758" subchoice = 1 DO subchoice = Menu(subchoice, 6, choice$(), menuRow(), menuCol(), help$(), FALSE) IF subchoice>0 THEN IF subchoice<3 THEN Er%=EcrMemoire% (AdHFBtL, &H21) 'vitesse mode star subchoice= TelHF% (((subchoice-1) *2)) ELSE IF subchoice<5 THEN Er%= EcrMemoire% (AdHFBtL, &H21+&H08) 'vitesse mode MM53200 100K 180pF 'Er%= EcrMemoire% (AdHFBtL, &H42+&H08) 'vitesse mode MM53200 100K 330pF subchoice= TelHF% ( ((subchoice-3)*2 +4)) ELSE Er%= EcrMemoire% (AdHFBtL, &H21+&H88) 'vitesse mode UM3758 100K 180pF 'Er%= EcrMemoire% (AdHFBtL, &H42+&H88) 'vitesse mode UM3758 100K 330pF subchoice= TelHF% ( ((subchoice-5)*3 +8)) END IF END IF END IF LOOP WHILE subchoice > 0 RETURN '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' MiseHeure: choice$(1) = " MaJ Station" choice$(2) = " MaJ Globale" choice$(3) = " Heure " choice$(4) = " Arret " choice$(5) = " Marche " choice$(6) = " Increment " choice$(7) = " Decrement " choice$(8) = " Date " choice$(9) = " Tim ON " choice$(10)= " Tim OFF " choice$(11)= " Chrono " menuRow(1) = 3: menuCol(1) = 32 menuRow(2) = 4: menuCol(2) = 32 menuRow(3) = 5: menuCol(3) = 32 menuRow(4) = 6: menuCol(4) = 32 menuRow(5) = 7: menuCol(5) = 32 menuRow(6) = 8: menuCol(6) = 32 menuRow(7) = 9: menuCol(7) = 32 menuRow(8) = 10: menuCol(8) = 32 menuRow(9) = 11: menuCol(9) = 32 menuRow(10) = 12: menuCol(10) = 32 menuRow(11) = 13: menuCol(11) = 32 help$(1) = "Mise a jour Station" help$(2) = "Mise a jour globale" help$(3) = "Mise a l'Heure" help$(4) = "Arret" help$(5) = "Marche" help$(6) = "Increment" help$(7) = "Decrement" help$(8) = "Mise a jour Date" help$(9) = "Timer ON" help$(10) = "Timer OFF" help$(11) = "Chrono Autonome" StaSave%=Station% subchoice = 1 DO subchoice = Menu(subchoice, 11, choice$(), menuRow(), menuCol(), help$(), FALSE) SELECT CASE subchoice CASE 1 Station%= StaSave% CASE 2 Station%=&H7F CASE 3 MiseALHeure CASE 4 HorlogeArret CASE 5 HorlogeMarche CASE 6 HorlogeIncrement CASE 7 HorlogeDecrement CASE 8 MiseALaDate CASE 9 Er%=MaskANDMemoire%(&H86, &HF7) 'PB3 out Er%=MaskORMemoire% (ConfigRAM, &H20) CASE 10 Er%=MaskANDMemoire% (ConfigRAM, &HDF) CASE 11 Er%=MaskANDMemoire% (ConfigRAM, &HF7) 'plus reception horloge Er%=MaskORMemoire% (HorloSAdSec, &H80) 'mode chrono autonome CASE ELSE END SELECT LOOP WHILE subchoice > 0 RETURN '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' MenuCouleurs: choice$(1) = " Monochrome " choice$(2) = " Cyan/Bleu " choice$(3) = " Bleu/Cyan " choice$(4) = " Rouge/Gris " menuRow(1) = 3: menuCol(1) = 60 '33 menuRow(2) = 4: menuCol(2) = 60 menuRow(3) = 5: menuCol(3) = 60 menuRow(4) = 6: menuCol(4) = 60 help$(1) = "Configuration pour ecrans monochrome ou LCD" help$(2) = "Configuration cyan" help$(3) = "Configuration bleue" help$(4) = "Configuration rouge" subchoice = Menu(1, 4, choice$(), menuRow(), menuCol(), help$(), FALSE) SELECT CASE subchoice CASE 1 TO 4 ColorPref = subchoice CASE ELSE END SELECT RETURN END SUB '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' 'MyCls: ' Efface l'‚cran avec la bonne couleur. SUB MyCls (dots, Background) VIEW PRINT 2 TO 24 COLOR dots, Background CLS 2 VIEW PRINT END SUB 'PrintHelpLine: ' Prints help text on the bottom row in the proper color SUB PrintHelpLine (help$) COLOR colors(5, ColorPref), colors(4, ColorPref) LOCATE 25, 1 PRINT SPACE$(80); LOCATE 25, 1 'XF PRINT "Station ";Station%; 'XF Center 25, help$ COLOR colors(7, ColorPref), colors(4, ColorPref) LOCATE 25, 65 'XF PRINT "Ver2002/03/01"; 'XF END SUB '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ FUNCTION MyHex$ (var%) 'formatte le HEX sur 2 chiffres IF var < 16 THEN hx$ = "0" ELSE hx$ = "" END IF MyHex$ = hx$ + HEX$(var%) END FUNCTION FUNCTION Valh% (Chaine$) 'indique une valeur hex Chaine$ = "&h" + Chaine$ Valh% = VAL(Chaine$) END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'FONCTIONS RESEAU FX485AS '; Station '; 1XXX XXXX adresse station '; 1111 1111 Message general '; '; les codes '; R FFF FF DD '; 0 000 00 xx code SPECIAL "zero" :NV1Dat2-> NV1AdrR adresse Reponse '; R FFF EW 00 W1=ecriture,E: EEPROM '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' CONST ConfigRAM = &H14 'adresse de l'heure CONST HorloSAdSec = &H17 'adresse seconde CONST HorloSAdMin = HorloSAdSec+1 'adresse minute CONST HorloSAdHeu = HorloSAdMin+1 'adresse heure 'bit 7 de Minute: marche/arret 'bit 7 de Heure: compte/decompte 'adresse telecomandeHF CONST AdHFBtL = &H1A 'vitesse de trame CONST AdHFCmd = &H1B 'ordre B7=1,B6 On/off, 'bouton CONST AdBouton1 =&H22 CONST AdBouton2 =&H23 CONST AdBouton3 =&H24 CONST AdBouton4 =&H25 'adresse de la date recu DCF CONST DateAdDat = &H32 'date 1...31 CONST DateAdJou = DateAdDat+1 'jour lundi...samedi CONST DateAdMoi = DateAdJou+1 'mois 1..12 CONST DateAdAnn = DateAdMoi+1 'annee 0..99 'Code erreur CONST FXErrEcho = 10 CONST FXErrEcho1 = 11 CONST FXErrTimeout = &H100 'erreur timeout CONST FXErrRecep1 = &H200 'erreur timeout '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' SUB InfoStationPrn DIM JourSem$(8) JourSem$(7)="Dimanche" JourSem$(1)="Lundi" JourSem$(2)="Mardi" JourSem$(3)="Mercredi" JourSem$(4)="Jeudi" JourSem$(5)="Vendredi" JourSem$(6)="Samedi" JourSem$(0)="Jour?" InfoStation 'lecture info Box 4, 4, 15, 45 'R C 'PRINT AffCPU$ (Code%) 'type de CPU LOCATE 6,5 'R C PRINT AffFonc$ (IocbIn.StationType) LOCATE 7,5 'R C PRINT "Numero de serie/ Lot ";((IocbIn.SerialHigh)*256)+IocbIn.SerialLow LOCATE 8,5 'R C PRINT "Version logiciel 20"; PRINT BinBCD$ (IocbIn.VersionA); PRINT "/"; PRINT BinBCD$ (IocbIn.VersionM) LOCATE 9,5 'R C PRINT "Courant disponible ";IocbIn.Courant; "mA" LOCATE 12,5 'R C PRINT "Heure sur l'horloge: "; PRINT BinBCD$ ((LecMemoire%(HorloSAdHeu)AND &H7F));":";BinBCD$ ((LecMemoire%(HorloSAdMin)AND &H7F));".";BinBCD$ ((LecMemoire%(HorloSAdSec)AND &H7F)) LOCATE 13,5 'R C PRINT "Date DCF: "; PRINT BinBCD$ (LecMemoire%(DateAdDat));"/";BinBCD$ (LecMemoire%(DateAdMoi));"/20";BinBCD$ (LecMemoire%(DateAdAnn)) LOCATE 14,5 'R C PRINT JourSem$( LecMemoire%(DateAdJou)AND 7) WHILE INKEY$ = "" WEND END SUB '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Mise a l'heure des horloges SUB MiseALHeure Box 10, 10, 12, 50 LOCATE 11, 12 INPUT "Heure? ", Heures% Heures%=BCDBin% (Heures%) LOCATE 11, 12 INPUT "Minutes ", Minutes% Minutes%=BCDBin% (Minutes%) Valeure%=EcrMemoire% (HorloSAdSec, 0) Valeure%=EcrMemoire% (HorloSAdHeu, Heures%) Valeure%=EcrMemoire% (HorloSAdMin, Minutes%) END SUB SUB MiseALaDate Box 10, 10, 12, 50 LOCATE 11, 12 INPUT "Jour du mois?", Heures% Heures%=BCDBin% (Heures%) LOCATE 11, 12 INPUT "mois de l'année", Minutes% Minutes%=BCDBin% (Minutes%) LOCATE 11, 12 INPUT "Jour de la semaine (0=dimanche)", JourS% JourS%=BCDBin% (JourS%) Valeure%=EcrMemoire% (DateAdDat, Heures%) Valeure%=EcrMemoire% (DateAdMoi, Minutes%) Valeure%=EcrMemoire% (DateAdJou, JourS%) END SUB SUB HorlogeArret Valeure%=MaskORMemoire% (HorloSAdMin, &H80) END SUB SUB HorlogeMarche Valeure%=MaskANDMemoire% (HorloSAdMin, &H7F) END SUB SUB HorlogeIncrement Valeure%=MaskANDMemoire% (HorloSAdHeu, &H7F) END SUB SUB HorlogeDecrement Valeure%=MaskORMemoire% (HorloSAdHeu, &H80) END SUB '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Envoi d'un message SUB MessageLCD1 'version 1 caractere a la fois Box 10, 10, 12, 50 LOCATE 11, 12 Er%= LCDData (&H0A,0,1) 'efface l'afficheur et inhibit affichage horloge 'Er%= LCDData (&H0D,0) 'retour au debut INPUT "Message: ", Message$ FOR T%=1 TO len(Message$) A%=ASC(MID$(Message$,T%,1)) Er%= LCDData ( A%,0,0) NEXT T LOCATE 11, 12 INPUT "Fin retour", Message$ Valeure%=MaskANDMemoire% (ConfigRAM, &HFB) 'fin inhibit affichage horloge END SUB SUB MessageLCD 'version 2 caracteres a la fois Box 10, 10, 12, 50 LOCATE 11, 12 'Valeure%=MaskORMemoire% (ConfigRAM, &H4) 'inhibit affichage horloge 'Er%= LCDData (&H0D,0,1) 'retour au debut 'Er%= LCDData (&H0A,0,1) 'efface l'afficheur et inhibit affichage horloge INPUT "Message: ", Message$ 'en raison d'une section critique il vaut mieux faire inhibit... Valeure%=MaskORMemoire% (ConfigRAM, &H4) 'inhibit affichage horloge Er%= LCDData (&H0A,0,1) 'efface l'afficheur et inhibit affichage horloge FOR T%=1 TO (len(Message$)AND &HFE)/2 A%=ASC(MID$(Message$,(T%-1)*2+1,1)) B%=ASC(MID$(Message$,T%*2,1)) Er%= LCDData ( A%,B%,1) 'avec aquitement 'Er%= LCDData ( A%,B%,0) 'sans NEXT T IF (len(Message$)AND &H1) THEN 'longueur impair A%=ASC(MID$(Message$,len(Message$),1)) Er%= LCDData ( A%,0,0) END IF LOCATE 11, 12 INPUT "Fin retour", Message$ Valeure%=MaskANDMemoire% (ConfigRAM, &HFB) 'fin inhibit affichage horloge END SUB '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Information Station SUB InfoStation IocbIn.StationType= LecMemoire% (01+&HC0) IocbIn.SerialLow= LecMemoire% (02+&HC0) IocbIn.SerialHigh= LecMemoire% (03+&HC0) IocbIn.VersionA= LecMemoire% (04+&HC0) 'version (2001) 01 IocbIn.VersionM= LecMemoire% (05+&HC0) 'version (mois) IocbIn.Courant= LecMemoire% (06+&HC0) 'Courant disponible pour le reseau (41mA) END SUB '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Dump memoire SUB Dump Box 4, 4, 22, 75 'R C DIM A%(16) LOCATE 5, 5 'R C PRINT " 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F" FOR N=0 TO 15 LOCATE N+6, 5 'R C PRINT MyHex$(N*16);" "; FOR P=0 TO 15 A%(P)=LecMemoire% (N*16+P) PRINT MyHex$(A%(P));" "; NEXT P PRINT" "; FOR Q=0 TO 15 A%(Q)=A%(Q)AND &H7F IF (A%(Q)<&H30) THEN A%(Q)= ASC(".") ENDIF PRINT CHR$(A%(Q)); NEXT Q NEXT N WHILE INKEY$ = "" WEND END SUB '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Lecture Bouton FUNCTION LectBouton% (BoutonNb%) Valeur=LecMemoire% (AdBouton1+BoutonNb%) IF (Valeur AND &H80)<>0 THEN Eer%=EcrMemoire% (AdBouton1+BoutonNb%, 5) 'RAZ LectBouton%=1 ELSE LectBouton%=0 END IF END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Telecomande% HF FUNCTION TelHF% (Boitier% ) TelHF%=EcrMemoire% (AdHFCmd, &H80+Boitier%) END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Fonctions LCD FUNCTION LCDData (Data1%, Data2%, Repons%) Eer%=0 IocbOut.Ads=&H80+Station% IocbOut.Fct=&H18 IF Repons% THEN IocbOut.Fct=IocbOut.Fct+&H80 'avec reponse END IF TrameOut(1)=Data2% TrameOut(2)=Data1% Eer%=SerXfrAS% 'envoie IF Eer% THEN PRINT "Erreur ";Eer END IF END FUNCTION FUNCTION LCDOrdre (Data1%, Data2%) Eer%=0 IocbOut.Ads=&H80+Station% IocbOut.Fct=&H1C TrameOut(1)=Data2% TrameOut(2)=Data1% Eer%=SerXfrAS% 'envoie IF Eer% THEN PRINT "Erreur ";Eer END IF END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Mask memoire FUNCTION MaskANDMemoire% (Adrs%, Datas%) Eer%=0 IocbOut.Ads=&H80+Station% IocbOut.Fct=&H10 '0 001 00xx AND TrameOut(1)=Datas% TrameOut(2)=Adrs% IF Adrs%>&HBF THEN 'translation ecriture EEPROM IocbOut.Fct=&H0C TrameOut(2)=Adrs%-&HC0 END IF Eer%=SerXfrAS% 'envoie IF Eer% THEN PRINT "Erreur ";Eer END IF END FUNCTION FUNCTION MaskORMemoire% (Adrs%, Datas%) Eer%=0 IocbOut.Ads=&H80+Station% IocbOut.Fct=&H14 '0 001 01xx AND TrameOut(1)=Datas% TrameOut(2)=Adrs% IF Adrs%>&HBF THEN 'translation ecriture EEPROM IocbOut.Fct=&H0C TrameOut(2)=Adrs%-&HC0 END IF Eer%=SerXfrAS% 'envoie IF Eer% THEN PRINT "Erreur ";Eer END IF END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Ecriture memoire avec Reponse, pour etre sur que l'operation est faite FUNCTION EcrMemoireR% (Adrs%, Datas%) Eer%=0 IocbOut.Ads=&H80+Station% IocbOut.Fct=&H84 TrameOut(1)=Datas% TrameOut(2)=Adrs% IF Adrs%>&HBF THEN 'translation ecriture EEPROM IocbOut.Fct=&H8C TrameOut(2)=Adrs%-&HC0 END IF Eer%=SerXfrAS% 'envoie IF Eer% THEN PRINT "Erreur ";Eer END IF EcrMemoireR%= TrameIn(1) END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Ecriture memoire FUNCTION EcrMemoire% (Adrs%, Datas%) Eer%=0 IocbOut.Ads=&H80+Station% IocbOut.Fct=&H04 TrameOut(1)=Datas% TrameOut(2)=Adrs% IF Adrs%>&HBF THEN 'translation ecriture EEPROM IocbOut.Fct=&H0C TrameOut(2)=Adrs%-&HC0 END IF Eer%=SerXfrAS% 'envoie IF Eer% THEN PRINT "Erreur ";Eer INPUT "frapper sur une CR",A$ END IF END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Lecture memoire FUNCTION LecMemoire% (Adrs%) Eer%=0 IocbOut.Ads=&H80+Station% IocbOut.Fct=&H80 TrameOut(1)=&HAA TrameOut(2)=Adrs% IF Adrs%>&HBF THEN 'translation lecture EEPROM IocbOut.Fct=&H88 TrameOut(2)=Adrs%-&HC0 END IF Eer%=SerXfrAS% 'envoie IF Eer% THEN PRINT "Erreur ";Eer END IF LecMemoire%= TrameIn(1) END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Test Ping adresse 1 SUB PingAdrs01 Eer%=0 IocbOut.Ads=&H80+Station% IocbOut.Fct=&H80 TrameOut(1)=&HAA TrameOut(2)=&H00 Eer%=SerXfrAS% 'envoie IF Eer% THEN PRINT "Erreur ";Eer ELSE PRINT "Ping OK" WHILE INKEY$ = "" WEND END IF 'PingAdrs01%=Eer% END SUB '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'les CPU FUNCTION AffCPU$ (Code%) SELECT CASE Code% 'CPU Type CASE &H01 Err$ = ">>Microchip 12C05<<" CASE &H04 Err$ = ">>Microchip 16C84<<" CASE &H05 Err$ = ">>Microchip 16F84<<" CASE &H05 Err$ = ">>Microchip 12C628<<" CASE &H11 Err$ = ">>Motorola 68705K1<<" CASE &H13 Err$ = ">>Motorola 68705P3<<" CASE &H15 Err$ = ">>Motorola 68705C8<<" CASE &H20 Err$ = ">>Intel 8051<<" CASE ELSE Err$ = ">>??<<" END SELECT AffCPU$ = Err$ END FUNCTION 'les Fonctions FUNCTION AffFonc$ (Code%) SELECT CASE Code% 'CPU Type CASE &H10 Err$ = ">>ComboHorloge<<" CASE &H04 Err$ = ">>Fonction Horloge<<" CASE &H05 Err$ = ">>Fonction Horloge Radio pilotee<<" CASE ELSE Err$ = ">>??<<" END SELECT AffFonc$ = Err$ END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Transforme du bin en BCD FUNCTION BCDBin% (Valeurs%) BCDH%=0 WHILE (Valeurs>9) BCDH%=BCDH%+1 Valeurs%=Valeurs%-10 WEND BCDH%=BCDH%*16+Valeurs% BCDBin%=BCDH% END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ ' FUNCTION BinBCD$ (Valeurs%) Out$= CHR$( ((Valeurs%AND &HF0)/16)+&H30) Out$=Out$+CHR$((Valeurs% AND &H0F)+&H30) BinBCD$=Out$ END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Envoie d'un caractere binaire avec reception echo FUNCTION SendASCIIBin% (Valeur%) Eer%= SendASCII% (HEX$(((Valeur%AND &HF0)/16)AND &H0F)) IF Eer%=0 THEN Eer%= SendASCII% ( HEX$(Valeur% AND &H0F)) END IF SendASCIIBin%=Eer% END FUNCTION 'Envoie d'un caractere ASCII avec reception echo FUNCTION SendASCII% (Valeur$) Eer%=0 PRINT #1, Valeur$; 'Envoi du caractere In%=ReceivTim% IF In% <>asc(Valeur$) THEN Eer%=FXErrEcho1 END IF 'erreur echo SendASCII%=Eer% END FUNCTION FUNCTION ReceivNyBl% () Valeurs%=ReceivTim% IF (Valeur%<256) THEN Valeurs%=Valeurs%-&H30 IF (Valeurs%>10)THEN Valeurs%=Valeurs%-7 END IF END IF ReceivNyBl%=Valeurs% END FUNCTION FUNCTION ReceivHEX% () Valeurs%=ReceivNyBl% IF (Valeur%<256) THEN Valeurs%=Valeurs%*16 Valeurs1%=ReceivNyBl% IF (Valeur1%<256) THEN Valeurs%=Valeurs1%+Valeurs% END IF END IF ReceivHEX%=Valeurs% END FUNCTION FUNCTION ReceivTim% () 'reception avec timeout Eer%=0 Valeurs%=0 TimeOut = FALSE TIMER ON WHILE ((EOF(1)) AND (TimeOut = FALSE)) WEND TIMER OFF IF TimeOut = TRUE THEN Eer%=FXErrTimeout END IF IF Eer%=0 THEN Valeurs%=ASC(INPUT$(1, 1)) 'lecture END IF ReceivTim%=Valeurs%+Eer% END FUNCTION FUNCTION FlushBuffer% () 'Flush buffer reception WHILE ReceivTim%<>FXErrTimeout WEND END FUNCTION 'envoi d'une chaine, puis reception echo FUNCTION SendASCIIStr% (Valeur$) Eer%=0 PRINT #1, Valeur$; 'Envoi du caractere Ret$=INPUT$(len(Valeur$), #1) SendASCIIStr=0 END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ 'Envoi de la trame FX485AS FUNCTION SerXfrAS% Er% = 0 'Er%= SendASCII%(CHR$(&H0D)) Er%= SendASCII%("$") IF Er% = 0 THEN Er%= SendASCIIBin%(IocbOut.Ads) 'adresse destination Station% END IF IF Er% = 0 THEN 'commande Er%= SendASCIIBin%(IocbOut.Fct) END IF IF Er% = 0 THEN 'Data 1 Er%= SendASCIIBin%(TrameOut(1)) END IF IF Er% = 0 THEN 'Data 2 Er%= SendASCIIBin%(TrameOut(2)) END IF IF Er% = 0 THEN 'Somme Er%= SendASCIIBin%((IocbOut.Ads+IocbOut.Fct+TrameOut(1)+TrameOut(2))AND &HFF) END IF IF (Er% = 0) AND ((IocbOut.Fct AND &H80)<>0) THEN 'avec reponse Valeur% = ReceivTim% 'le $ IF (Valeur%>255) OR (Valeur%<> ASC("$")) THEN Er%=FXErrRecep1 ENDIF IF Er% = 0 THEN IocbIn.Ads = ReceivHEX% Er%= IocbIn.Ads AND&HFF00 IocbIn.Ads=IocbIn.Ads AND &HFF ENDIF IF Er% = 0 THEN IocbIn.Fct = ReceivHEX% Er%= IocbIn.Fct AND&HFF00 IocbIn.Fct=IocbIn.Fct AND &HFF ENDIF IF Er% = 0 THEN TrameIn(1) = ReceivHEX% Er%= TrameIn(1) AND&HFF00 TrameIn(1)=TrameIn(1) AND &HFF ENDIF IF Er% = 0 THEN TrameIn(2) = ReceivHEX% Er%= TrameIn(2) AND&HFF00 TrameIn(2)=TrameIn(2) AND &HFF ENDIF IF Er% = 0 THEN Ichk = ReceivHEX% Er%= Ichk AND&HFF00 Ichk=Ichk AND &HFF ENDIF 'lecture somme...sans controle ENDIF IF Er% <> 0 THEN valeur% =FlushBuffer% 'flush du buffer ENDIF SerXfrAS = Er% END FUNCTION '*---------------------------------------------------------------------------*/ '* */ '* */ '*---------------------------------------------------------------------------*/ '