DECLARE SUB gentasm2 (a!(), ta!, pa!, NCA$) DECLARE SUB prtlh (a!(), t$) DECLARE SUB interpn (a!()) DECLARE SUB calcadeg (n!, adeg!, ast!, l!(), H!(), NCYL) 'Ci dessous le nom de ce programme, qui apparaitra … l'ecran '***************** PROGRAMME V$ = "OA200706" 'Version ' .bas ********************** 'Avec decalage de la courbe d'avance 'philippe.loutrel@laposte.net ' SAISIE- MODIFICATION-TELECHARGEMENT-RELECTURE D'UNE COURBE D'AVANCE A L'ALLUMAGE ' Pour boitier d'allumage programmable AEPL '^^^^^^^^^^^CONTRAINTES SOFT^^^^^^^^^^^^^^^^^^^^ 'Verifier l'existence d'un dossier C:\AEPL, sinon le creer 'Tout en unites de 8microsecondes. Donc,il FAUT avoir pr‚alablement 'programm‚ le Pic 16F88 avec un logiciel AEPL dont le nom ' est de type 88TCFxx.asm ''^^^^^^^^^^^CONTRAINTES HARD^^^^^^^^^^^^^^^^^^^^ 'Pic 16F88 indispensable(USART et memoire Flash inscriptible par logiciel) '4 fils sortent du Pic(Support en sandwich):+5V, masse, Tx,Rx 'vers un MAX232 qui convertit +5V en -7V, 0V en +7V 'Le MAX232 est relie au port COM1(par ex) du PC via un cable normal '(non croise). 'Prise RS232: Tx(pin 11 Pic) sur pin2,Rx(pin 8Pic) sur pin3,masse sur pin5 '********************************************************************** 'INDISPENSABLE pour le port COM sous Basic:relier DTRpin4 et DSRpin6 '********************************************************************** 'Multimoteurs:1,2,4,5,6 ou 8 cylindres,2 et 4 temps 'La courbe d'avance peut etre DECROISSANTE, si necessaire 'De 0 a 914 t/mn l'avance est fixee a 11 degrŠs (0 degrŠ possible ' voir le programme en assembleur) 'Un seul regime est obligatoire: 3750 t/mn. Regime maxi: 15000t/mn 'Si l'on veut effectuer un assemblage ulterieurement ' selectionner l'option "Enregistrer pour ASM" qui genere ' 8Ltab.txt et 8Htab.txt dans le repertoire C:\AEPL '^^^^^^^^^^^^^^DETAILS INTERNES^^^^^^^^^^^^^^^^^^^^^^^^ 'Le tableau Ntmn(N) contient les valeurs d'avance saisies, l'indice 'N etant le regime. 'La saisie et l'affichage se font en valeur MOTEUR, mais tout le 'traitement et le stockage se font en valeurs ALLUMEUR, donc /2. 'Une courbe = un fichier C:\AEPL\nom.AV. Chaque fichier contient: 'une EN-TETE (Nom, periode de ligne rouge, nb de cylindres, commentaire) 'et la TABLE Ntmn() des 1/10 de degrŠs d'avance … chaque r‚gime. 'On interpolle cette table lineaire AVANT de generer les 2 tables L et H 'qui sont en 1/n donc hyperboliques. 'L est pour 457 - 1875 t/mn (allumeur).L(2) et L(3) contiennent le SEUIL 'c'est a dire la periode mini (Tseuil)pour la ligne rouge, sur 16 bits, positive 'L(4) contient le nombre de cylindres et L(5-12) le nom de la courbe '*************VARIABLES ET CONSTANTES****************** DIM Ntmn!(7500) 'Tableau des degres en fonction des t/mn, 16 bits DIM l(256), H(256) 'Tableaux des delais, iront dans le Pic DIM SHARED ast, nmax 'variables globales mille5 = 0 'flag de saisie du point 1875t/mn ast = 22.5 'Avance statique en deg allumeur(c'est T/4) nmin = 457 'limite inf de saisie NCYL = 0 'nb de cylindres 4 temps Nred = 0 'ligne rouge nmax = 7500 'limite superieure de saisie degmax = 0 'limite sup des degres d'avance possible … nmax TC = .11 'temps de calcul incompressible sur le PIC, en ms ' ce temps impose une quantite maxi d'avance degmax = INT((ast - (TC * nmax * 90) / 15000) * 10)' voir saisie degres esc$ = CHR$(27) 'touche escape EF = 0 'escape flag pas = 250 'pour sub gruyere, efface Ntmn sauf 1 par 'pas' TseuilH = 0 'periode mini en 16 bits, positif TseuilL = 0 k8 = 1.25 'conversion en u de 8mus NCA$ = "" 'nom de la courbe d'avance 8 car max NCAlu$ = "" 'idem mais relu du disque. Inutile en realite pathca$ = "" 'path vers fichier sur disque d'une courbe d'avance CMT$ = "" '41 car de commentaire pour une courbe carpc = 0 'Decalage avance, car envoy‚ du PC au Pic, 48 … 55 decav = 0 'en 1/10 deg, decalage 14,28,56,112 debut: '*********************MAIN****************************** SCREEN 0 'Mode texte COLOR 14, 1 'Jaune sur fond bleu CLS PRINT PRINT " OPTI-AEPL "; V$ PRINT PRINT " SAISIE- MODIFICATION-TELECHARGEMENT D'UNE COURBE D'AVANCE A L'ALLUMAGE" PRINT PRINT " IMPORTANT: Pour un ecran plus grand : ALT+ENTREE" PRINT "Attention:valeurs 'MOTEUR' pour N en t/mn et angles d'avance en 1/10 degre " PRINT PRINT "Exemple: pour 5000t/mn moteur et 32 deg moteur, entrer 5000 et 320" PRINT "De 0 a 914 t/mn l'avance est fixee a 11 degrŠs (0 degrŠ possible" PRINT " voir le programme en assembleur)" PRINT "Un seul point est obligatoire: 3750 t/mn. Regime maxi: 15000t/mn" PRINT : PRINT PRINT "Saisir une courbe s" PRINT : PRINT "Afficher une courbe a" PRINT : PRINT "Lire la courbe en cours dans le boitier l" PRINT " (le boitier AEPL doit etre connecte au PC par une liaison Serie a 9600bps)" PRINT : PRINT "DOC, … lire une fois svp d " PRINT : PRINT "Fin du programme f philippe.loutrel@laposte.net" GOSUB getcar 'lire un car au clavier SELECT CASE a$ CASE "s": GOTO saisie 'Saisire une nelle courbe CASE "a": GOTO afca 'Afficher une courbe CASE "l": GOTO lirepic 'lire la courbe du Pic CASE "d": GOSUB doc: GOTO debut 'Affiche deux pages de doc CASE "f": END 'arret du programme CASE ELSE: GOTO debut 'erreur END SELECT saisie: 'Saisire une nouvelle courbe CLS GOSUB getnca 'lire nom de la CA au clavier IF EF = 1 THEN EF = 0: GOTO debut GOSUB getncyl 'lire nb de cylindres GOSUB getNred 'lire ligne rouge CMT$ = " " '40 espaces GOSUB getcmt GOSUB getnas 'lire des couples N, Avance CALL interpn(Ntmn()) 'interpoller les degres a partir des t/mn GOSUB wrcourbe 'sauver Ntmn GOTO show 'Ecran 2 afca: 'Afficher une courbe GOSUB getnca 'get nom de la courbe IF EF = 1 THEN EF = 0: GOTO debut GOSUB rdcourbe 'lire le fichier des N,A sur le disque GOTO show lirepic: 'lire courbe en cours ds le PIC GOSUB rdPIC IF L1 <> 0 THEN CLS : INPUT "Recommencer SVP ", fd: GOTO debut 'L(1) = "P", anormal GOSUB calcNred '… partir des valeurs T_h,T_l(hexa) relues du PIC GOSUB genNtmn 'genere Ntmn() … partir de L et H GOTO show '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ '^^^^^^^^^^^^^^^^^^^^2eme ECRAN ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ show: GOSUB afficCL 'afficher courbe, valeurs et menu GOSUB getcar SELECT CASE a$ CASE "a": GOTO tasm 'Generer tables assembleur CASE "s": GOTO sauversous 'Sauver la courbe sous tel nom CASE "m": GOTO modifier 'Modifier cette courbe CASE "d": GOTO decaler 'Decalage de la courbe CASE "c": GOTO chargepic 'charger ds le Pic CASE "k": GOTO comment 'Commentaire, ira ds Ltab(13-61) CASE "q": GOTO debut 'retour ecran de demarrage CASE ELSE: GOTO show END SELECT tasm: GOSUB genlh 'Genere L et H en RAM, puis sur disque ta = 1 'd'abord L CALL gentasm2(l(), ta, pa, NCA$) 'creer 8ltab.txt pour l'assembleur ta = 2 'puis H CALL gentasm2(H(), ta, pa, NCA$) 'creer 8htab.txt pour l'assembleur GOTO show 'afficher courbe, valeurs et menu sauversous: GOSUB modnca 'confirme le nom ou un nouveau IF EF = 1 THEN EF = 0: GOTO show GOSUB wrcourbe GOTO show modifier: GOSUB modifs 'aller faire les modifs GOSUB afficCL 'restaure l'ecran graphique GOTO sauversous 'demander un nom decaler: GOSUB decec1 'afficher aide decalage GOSUB getcar SELECT CASE a$ 'AVANCE CASE "a": carpc = 51: decav = 1.4: GOTO avplus 'h33, 1.4 degre CASE "z": carpc = 50: decav = 2.8: GOTO avplus 'h32, 2.8 degres CASE "e": carpc = 49: decav = 5.6: GOTO avplus 'h31, 5.6 degre CASE "r": carpc = 48: decav = 11.2: GOTO avplus 'h30, 11.2 degre 'RETARD CASE "q": carpc = 55: decav = 1.4: GOTO avmoins 'h37, 1.4 degre CASE "s": carpc = 54: decav = 2.8: GOTO avmoins 'h36, 2.8 degres CASE "d": carpc = 53: decav = 5.6: GOTO avmoins 'h35, 5.6 degres CASE "f": carpc = 52: decav = 11.2: GOTO avmoins 'h34, 11.2 degres CASE "ELSE": GOTO show 'erreur END SELECT avplus: CLS : LOCATE 10, 20: PRINT "PLUS d'avance": GOTO s45 avmoins: CLS : LOCATE 10, 20: PRINT "MOINS d'avance" s45: LOCATE 15, 10: PRINT "Degres "; decav LOCATE 20, 5: PRINT "Barre d'espace pour finir" GOSUB syncpic OUT 1016, carpc: CLOSE #1 'envoi du car au Pic GOSUB getcar 'attendre espace (ou autre) pour finir le decalage GOSUB syncpic OUT 1016, 32: CLOSE #1 'envoi du code espace, h20 GOTO show chargepic: GOSUB genlh 'genere L et H en RAM GOSUB wrpic 'puis les ecrire ds le PIC GOTO show comment: LOCATE 25, 1 FOR k = 25 TO 28 'effacer 4 lignes de texte PRINT " " NEXT LOCATE 25, 1 GOSUB getcmt 'Commentaire sur la courbe courante GOSUB wrcourbe 'et sauver l'ensemble de la courbe GOTO show '****************TOUTES LES SUBs******************************************** afficCL: 'SUB affiche courbe et valeurs SCREEN 0: CLS SCREEN 12, 1 'Ecran VGA 470X630, 1 pour utiliser COLOR COLOR 14 'texte jaune 'WINDOW fixe les echelles X et Y de la fenetre graphique mais ni sa taille ni sa position 'Ces echelles sont arbitraires. L'origine est en bas ŕ gauche (habituelle) 'VIEW fixe la POSITION, la taille et les couleurs de cette fenetre (ici 1=fond bleu, '7=entourage blanc) 'Les unites de VIEW sont celle de l'ecran, donc absolues et origine en haut ŕ gauche 'le premier couple est le coin sup gauche, le deuxičme le coin inf droit 'Valeurs moteur car interface avec utilisateur WINDOW (0, 0)-(8000, 400) 'x=15000t/mn maxi,y=400 1/10degres maxi 'optimise pour occuper tte le fenetre en N VIEW (15, 20)-(500, 380), 1, 7 'Maxi x=630, y=470 ,0,46mm/unite '500-15=485unites donne 225mm delarge '380-20=360 166mm de haut FOR k = 1000 TO 2 * 8000 STEP 1000'quadrillage horizontal LINE (k, 0)-(k, 400), 8 '8= grisatre NEXT FOR k = 50 TO 400 STEP 50'quadrillage vertical LINE (0, k)-(8000, k), 8'8= grisatre NEXT LOCATE 19, 1: PRINT "10"'echelle verticale avance en degrčs LOCATE 13, 1: PRINT "20" LOCATE 7, 1: PRINT "30" LOCATE 1, 1: PRINT "A deg" LOCATE 24, 10: PRINT "1"'echelle horizontale , N en 1000t/mn LOCATE 24, 25: PRINT "3" LOCATE 24, 40: PRINT "5" LOCATE 24, 56: PRINT "7" LOCATE 24, 64: PRINT "N x1000 t/mn" FOR n = 1 TO Nred 'trace de la courbe PSET (2 * n, 2 * Ntmn(n)) 'val moteur car affichage NEXT LOCATE 1, 30 PRINT " OPTI-AEPL "; V$ LOCATE 2, 10 'ecran texte 28lignes,80 colonnes PRINT "Courbe: "; NCA$; " "; PRINT NCYL; "cylindres"; " "; PRINT "Ligne rouge: "; Nred * 2 'restitue val moteur LOCATE 3, 3 PRINT "Commentaire: "; CMT$ LOCATE 25, 1 PRINT "Enregistrer pour assembleur a" PRINT "Enregistrer sous s"; PRINT " Decaler cette courbe d" PRINT "Modifier cette courbe m"; PRINT " Charger dans l'AEPL c" PRINT "Rediger un commentaire k"; PRINT " Quitter q" li = 1: co = 65 LOCATE li, co PRINT "N t/mn A deg*10" co = 66 FOR k = 500 TO Nred STEP 250 li = li + 1 LOCATE li, co PRINT 2 * k; INT(2 * Ntmn(k))' val moteur NEXT RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ calcNred: 'SUB calcul Nred … partir de Tu lu du Pic NCYL = l(4) Tu = l(2) * 256 + l(3) Nred = INT((1500000 * 4 / NCYL) * k8 / Tu) RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ decec1: 'SUB afiche l'ecran d'aide pour le decalage d'avance SCREEN 0: CLS : COLOR 14, 1: LOCATE 10, 10 PRINT "Decalage temporaire de la courbe active dans l'AEPL": PRINT PRINT " Degres 1.4 2.8 5.6 11.2 ": PRINT PRINT "PLUS d'avance taper a z e r ": PRINT PRINT "MOINS d'avance taper q s d f " RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ doc: 'SUB affiche doc CLS PRINT " SAISIE- MODIFICATION-TELECHARGEMENT D'UNE COURBE D'AVANCE A L'ALLUMAGE" PRINT " Pour boitier d'allumage programmable Aepl" PRINT "^^^^^^^^^^^CONTRAINTES SOFT^^^^^^^^^^^^^^^^^^^^" PRINT "Verifier l'existence d'un dossier C:\AEPL, sinon le creer" PRINT " Le Pic 16F88 DOIT avoir ‚t‚ programm‚ au prealable" PRINT "avec un logiciel de type 88NTCFxx.asm (unit‚s de 8ćs)" PRINT "'^^^^^^^^^^^CONTRAINTES HARD^^^^^^^^^^^^^^^^^^^^" PRINT "Pic 16F88 indispensable(USART et memoire Flash inscriptible par logiciel)" PRINT "4 fils sortent du Pic(Support en sandwich):+5V, masse, Tx,Rx" PRINT "vers un MAX232 qui convertit +5V en -7V, 0V en +7V" PRINT "Le MAX232 est relie au port COM1(par ex) du PC via un cable normal" PRINT "non croise)." PRINT " CONNEXIONS A ETABLIR" PRINT "PIC Max232 Prise RS232 Commentaires" PRINT "14 16 +5Volts " PRINT "11 11 Emission par Pic 0/5V " PRINT "8 12 Reception par Pic 0/5V " PRINT "5 15 5 Masse" PRINT " 13 3 Reception par Pic 7V/-7V" PRINT " 14 2 Emission par Pic 7V/-7V" PRINT " 4 et 6 reli‚s DTR/DSR necessaire pour Basic" PRINT "4 condensateurs de 1microFarad sur le MAX 232, avec le + connect‚ comme suit" PRINT "C1 1+,3 C2 4+,5 C3 2+,16 C4 15+,6" PRINT PRINT "Multimoteurs:1,2,4,5,6 ou 8 cylindres,2 et 4 temps" PRINT "la courbe d'avance peut etre DECROISSANTE, si necessaire" PRINT "De 0 a 914 t/mn l'avance est fixee a 11 degrŠs (0 degrŠ possible" PRINT " voir le programme en assembleur)" PRINT "Un seul regime est obligatoire: 3750 t/mn. Regime maxi: 15000t/mn" INPUT "Taper ENTREE", a$ CLS PRINT PRINT "^^^^^^^^^^^^^^DETAILS INTERNES^^^^^^^^^^^^^^^^^^^^^^^^" PRINT PRINT "Le tableau Ntmn(N) contient les valeurs d'avance saisies, l'indice" PRINT "N etant le regime." PRINT "La saisie et l'affichage se font en valeur MOTEUR, mais tout le" PRINT "traitement et le stockage se fait en valeurs ALLUMEUR, donc /2" PRINT PRINT "On interpolle la table N()lineaire AVANT de generer les 2 tables L et H" PRINT "qui sont en 1/n donc hyperboliques" PRINT "L est pour 457 - 1875 t/mn (allumeur).L(2) et L(3) contiennent le SEUIL" PRINT "c'est a dire la periode mini (Tseuil)pour la ligne rouge, sur 16 bits, positive" PRINT "L(4) contient le nombre de cylindres, L(5-12) le nom de la courbe" PRINT "L(13) … L(60) un commentaire (ou des espaces par d‚faut)." INPUT "Taper ENTREE", a$ CLS RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ genlh: 'SUB genere L et H en RAM FOR n = nmin TO nmax dd = Ntmn(n) 'extraire les degres,en 1/10, pour ce n d = dd / 10 'revenir aux degres t = (15000) / n 'periode a nrpm en ms 4 cylindres nt = t * 100 'periode en unites de 10 mus nt = nt * k8 'en u de 8us degmus = 10 ^ 6 / (6 * n) 'duree d'un deg pour n rpm degdelmus = (ast - d) * degmus 'le delai reel en mus du = degdelmus / 10 'soit en unites de 10 mus du = du * k8 'et en u de 8ćs 'Remplissage des tables H et L IF n > 1875 THEN H(INT(nt / 4)) = INT(du)'entre ds H par T/4 et delai a sa valeur ELSE l(INT(nt / 16)) = INT(du / 4)'ds L par T/16 et delai/4 END IF NEXT Tseuil = INT(1500000 / Nred) 'convertir ligne rouge en T unites de 10 mus ' pour 4 cylindres, moteur de reference Tseuil = Tseuil * k8 'en u de 8ćs TseuilH = INT(Tseuil / 256) ' sur 16 bits H TseuilL = INT(Tseuil - TseuilH * 256) '16 bits L l(1) = 0 l(2) = TseuilH 'sera converti en hexa par Gentasm l(3) = TseuilL l(4) = NCYL 'le nb de cylindres ds l(4) GOSUB storeNCA 'remplir de codes ASCII L(5-12) GOSUB storeCMT 'et L(13-61) l(256) = l(255) H(250) = 4 * l(62) '1875t/mn ,idem ds les deux tables FOR i = 251 TO 256 H(i) = H(250) 'blinder NEXT mini = INT((1500000 / nmax) / 4) ' No de ligne mini ds H H(mini) = 100 * TC + 2'garantir que le delai pour nmax 'est toujours sup … TC(en u de 10ćs) FOR i = 1 TO (mini + 1) 'blindage de H H(i) = H(mini) NEXT RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ genNtmn: 'SUB re-genere Ntmn() partant des tables de delais L et H FOR u = 1 TO nmin Ntmn(u) = 0 NEXT FOR n = nmin TO Nred CALL calcadeg(n, adeg, ast, l(), H(), NCYL) Ntmn(n) = adeg NEXT RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ getcar: 'SUB lect d'un caractŠre a$ = INKEY$ 'purge buffer de 1car de INKEY$ DO WHILE a$ = "": a$ = INKEY$: LOOP RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ getcmt: 'SUB lit un commentaire au clavier EF = 0 INPUT "Commentaire (40 car maxi): "; c$ IF c$ = esc$ OR c$ = "" THEN EF = 1: RETURN'erreur IF LEN(c$) >= 41 THEN EF = 1: RETURN 'trop long CMT$ = c$ RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ getnas: ' SUB lit des valeurs de N,A au clavier FOR i = 1 TO nmax: Ntmn(i) = 0: NEXT gtx: INPUT "Nombre de tours par minute SVP (0 pour finir la saisie)", n n = n / 2 'conversion imme diate en val allumeur IF n = 0 THEN r = 1 INPUT " Vraiment finir la saisie? (2 pour confirmer)", r IF r = 2 THEN GOTO finsa GOTO gtx ELSE END IF IF n < nmin OR n > Nred THEN PRINT "N hors limites " GOTO gtx ELSE INPUT "Avance en 1/10 de degre ", dd: dd = dd / 2'val allumeur 'conversion imme diate en val allumeur END IF IF n = 1875 THEN mille5 = 1 'flag de saisie de 1875t/mn t1degn = (15000 / n) / 90 'temps pour 1 deg … n t/mn degcn = TC / t1degn 'soit pour TC qq degrŠs degmaxn = INT((ast - degcn) * 10) 'deg maxi pour ce n IF dd > degmaxn THEN PRINT "Trop d'avance": GOTO gtx Ntmn(n) = dd 'ranger les deg (1/10) GOTO gtx finsa: IF mille5 = 0 THEN PRINT "Il faut saisire 3750t/mn": GOTO gtx Ntmn(0) = 0: Ntmn(nmax) = degmax 'bornes RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ getnca: 'SUB lecture de nom de la courbe clavier EF = 0 CLS INPUT " Entrer un nom de courbe, 8 car maxi, SVP ", NCA$ IF NCA$ = "" OR NCA$ = esc$ OR NCA$ = "0" THEN EF = 1: RETURN 'erreur IF LEN(NCA$) > 8 THEN EF = 1: RETURN 'trop long pathca$ = "C:\AEPL\" + NCA$ + ".av"' extension .av pour ttes les CA PRINT pathca$ RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ getncyl: 'SUB de lecture de NCYL au clavier PRINT PRINT "ATTENTION! Tout en valeurs MOTEUR (et non allumeur)" INPUT "Nombre de cylindres (multiplier par 2 si 2 temps): ", NCYL IF NCYL > 8 OR NCYL = 3 OR NCYL = 7 THEN GOTO getncyl PRINT RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ getNred: 'SUB de lecture de la ligne rouge au clavier INPUT "Coupure de l'allumage au dela de t/mn : ", Nred: Nred = Nred / 2 PRINT IF Nred < 1000 OR Nred > nmax THEN PRINT "ERREUR": GOTO getNred RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ gruyere: 'SUB qui "troue" Ntmn 'efface Ntmn sauf la valeur d'avance … chaque 'pas' 'indispensable pour une interpollation efficace FOR k = pas TO nmax - pas STEP pas'par ex pas =250,500.. FOR j = k + 1 TO k + pas - 1'pour pas=500, trous: (501-999),(1001-1499)... Ntmn(j) = 0 NEXT NEXT RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ modifs: 'SUB modif de courbe. On sort par N=0 LOCATE 26, 60 PRINT " " 'efface les zones LOCATE 27, 60 PRINT " " LOCATE 28, 60 PRINT " " LOCATE 26, 60 PRINT "0 pour finir" LOCATE 27, 60 INPUT "N t/mn= ", n: n = n / 2 IF n = 0 THEN SCREEN 0: CLS : RETURN IF n < nmin OR n > Nred THEN GOTO modifs ELSE LOCATE 28, 60 INPUT "A 1/10d ", dd 'get A dd = dd / 2 'val allumeur END IF t1degn = (15000 / n) / 90 'temps pour 1 deg a n t/mn degcn = TC / t1degn 'soit pour TC degmaxn = INT((ast - degcn) * 10)'deg maxi pour ce n IF dd > degmaxn THEN GOTO modifs'non valide, ignorer GOSUB gruyere Ntmn(n) = dd SCREEN 0: CLS CALL interpn(Ntmn()) 'remplir Ntmn() d'avances GOSUB afficCL 'afficher courbe et liste de valeurs GOTO modifs 'get prochain couple N,A RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ modnca: 'SUB modifier le nom EF = 0 LOCATE 25, 1 FOR k = 25 TO 28 'effacer 4 lignes de texte PRINT " " NEXT LOCATE 25, 1 PRINT "Courbe: "; NCA$; : INPUT " Taper un autre nom ou touche ENTREE pour le conserver ", c$ IF c$ = esc$ OR c$ = "0" THEN EF = 1: RETURN'erreur IF c$ = "" THEN c$ = NCA$ 'on change de nom NCA$ = c$ pathca$ = "C:\AEPL\" + NCA$ + ".av"' extension .av pour ttes les CA PRINT NCA$ RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ rdcourbe: 'SUB lecture d'une courbe depuis le disque 'EN-TETE et toutes les valeurs d'avances OPEN pathca$ FOR INPUT AS #1 INPUT #1, NCAlu$ 'Sera ignor‚ INPUT #1, NCYL INPUT #1, Nred INPUT #1, CMT$ 'commentaire <=48car FOR k = 5 TO nmax INPUT #1, Ntmn(k) NEXT CLOSE #1 RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ rdPIC: 'SUB lecture du Pic ,tables L et H, compris en-tete L1 = 0 'flag si pb avec L(1) ie ="P" au lieu de h82 GOSUB syncpic 'Attend le deuxiŠme "P" pour etre juste aprŠs une ‚tincelle OUT 1016, 82 'R(ead),mode etabli FOR k = 1 TO 256 'garnit L df31: IF LOC(1) = 0 THEN GOTO df31 a$ = INPUT$(1, #1) IF k = 1 AND ASC(a$) <> 130 THEN L1 = 1: CLOSE #1: RETURN 'Erreur l(k) = ASC(a$) NEXT FOR k = 1 TO 256 'garnit H dfa33: IF LOC(1) = 0 THEN GOTO dfa33 a$ = INPUT$(1, #1) H(k) = ASC(a$) NEXT CLOSE #1 NCA$ = "": FOR k = 5 TO 12: NCA$ = NCA$ + CHR$(l(k)): NEXT'Assemble le nom CMT$ = "": FOR k = 13 TO 52: CMT$ = CMT$ + CHR$(l(k)): NEXT'idem commentaire pathca$ = "C:\AEPL\" + NCA$ RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ storeCMT: 'SUB extrait les car du commentaire 'Remplit d'espaces avant de stocker 'les valeur ASCII ds L(13-61) FOR k = 13 TO 61 ' espaces l(k) = ASC(" ") NEXT d$ = UCASE$(CMT$) 'convertir en majuscules FOR k = 1 TO LEN(d$) 'LEN varie de 1 … 40 d1$ = MID$(d$, k, 1) 'prochain car de la chaine l(k + 12) = ASC(d1$) NEXT '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ storeNCA: 'SUB extrait les car du nom 'et stock la valeur ASCII ds L(5-12) 'complŠte … 8 avec des espaces FOR k = 5 TO 12 '8 espaces l(k) = ASC(" ") NEXT d$ = UCASE$(NCA$) 'convertir en majuscules FOR k = 1 TO LEN(d$) 'len varie de 1 … 8 d1$ = MID$(d$, k, 1) 'prochain car de la chaine l(k + 4) = ASC(d1$) NEXT RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ syncpic: 'Attend le deuxiŠme "P" 'On est sur d'etre juste aprŠs une ‚tincelle OPEN "COM1:9600,N,8,1,bin" FOR RANDOM AS #1 FOR z = 1 TO 2 df3: IF LOC(1) = 0 THEN GOTO df3 'attendre 1 car ds buffer a$ = INPUT$(1, #1) 'clear buffer NEXT FOR z = 1 TO 1000: NEXT RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ wrcourbe: 'SUB sauve une courbe sur disque,en-tete et avances OPEN pathca$ FOR OUTPUT AS #1 'EX:C:\AEPL\C1.av PRINT #1, NCA$ 'en-tete PRINT #1, NCYL PRINT #1, Nred PRINT #1, CMT$ FOR k = 5 TO nmax 'ttes les avances PRINT #1, Ntmn(k) NEXT CLOSE #1 RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ wrpic: 'SUB ecrit les tables L et T ds le PIC GOSUB syncpic OUT 1016, 87 'envoyerW(rite) FOR k = 1 TO 256 'ecrit L dfc: IF LOC(1) = 0 THEN GOTO dfc a$ = INPUT$(1, #1) 'clear buffer OUT 1016, l(k) 'port COM1=1016 NEXT FOR k = 1 TO 256 'ecrit H dfd: IF LOC(1) = 0 THEN GOTO dfd a$ = INPUT$(1, #1) 'clear buffer OUT 1016, H(k) NEXT CLOSE #1 RETURN '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ SUB calcadeg (n, adeg, ast, l(), H(), NCYL) '************************************ 'Pour un N fourni, calcul T puis extrait D de L et H,et calcul l'avance adeg IF n = 0 THEN PRINT "n=0=": STOP Tu = (1500000 / n) * (4 / NCYL) ' unites:10 microsecondes Tu = Tu * 1.25 'u de 8us IF n <= 457 THEN du = Tu / 4: GOTO ad IF n <= 1875 THEN du = l(Tu / 16) * 4: GOTO ad IF n > 1875 THEN du = H(Tu / 4): ' PRINT "n=", n; "tu=", tu; "du=", du ad: IF Tu = 0 THEN PRINT "n= tu= ", n, Tu: STOP adeg = INT(10 * (ast - 90 * (du / Tu))) END SUB '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ SUB gentasm2 (a(), ta, pa, NCA$) 'transforme L et H de valeur decimale en instructions PIC 'et les ecrit sur disque IF ta = 2 THEN OPEN "c:\aepl\8htab.txt" FOR OUTPUT AS #2 'on cree un fic pour l'assembleur IF ta = 1 THEN OPEN "c:\aepl\8ltab.txt" FOR OUTPUT AS #2 z$ = "34" 'opcode pour RETLW i = 1 FOR k = 1 TO 64 '64x4 sur une ligne 'si un seul car on met zero devant IF LEN(HEX$(a(i))) = 1 THEN a$ = "0" + HEX$(a(i)) ELSE a$ = HEX$(a(i)) IF LEN(HEX$(a(i + 1))) = 1 THEN b$ = "0" + HEX$(a(i + 1)) ELSE b$ = HEX$(a(i + 1)) IF LEN(HEX$(a(i + 2))) = 1 THEN c$ = "0" + HEX$(a(i + 2)) ELSE c$ = HEX$(a(i + 2)) IF LEN(HEX$(a(i + 3))) = 1 THEN d$ = "0" + HEX$(a(i + 3)) ELSE d$ = HEX$(a(i + 3)) 'on supprime le premier DW car en h200,300 ou 100 il y a l'instruction addwf PCL,f IF i = 1 THEN PRINT #2, " DW", " "; z$ + b$; ","; z$ + c$; ","; z$ + d$ IF pa = 1 THEN LPRINT " DW", " "; z$ + b$; ","; z$ + c$; ","; z$ + d$ ELSE PRINT #2, " DW", z$ + a$; ","; z$ + b$; ","; z$ + c$; ","; z$ + d$ IF pa = 1 THEN LPRINT " DW", z$ + a$; ","; z$ + b$; ","; z$ + c$; ","; z$ + d$ END IF i = i + 4 NEXT CLOSE #2 END SUB '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ SUB interpn (a()) ' interpolle les degr‚s ds Ntmn(nmax) nz = 0 'nb de zeros entre deux points ref1 = 0 'le premier point non zero FOR i = 0 TO nmax IF a(i) = 0 THEN nz = nz + 1: GOTO b 'on compte les zeros IF nz = 0 THEN 'le point precedent etait diff de zero c: ref1 = a(i) 'donc on prend le nouveau comme ref iref1 = i 'son numero de ligne GOTO b ELSE 'c'est la fin de la suite de zeros donc ref2 ref2 = a(i) delta = (ref2 - ref1) / (nz + 1) 'l'increment positif nul ou negatif FOR k = iref1 + 1 TO i - 1 ' premier zero au dernier zero a(k) = a(k - 1) + delta NEXT nz = 0 'raz du compteur de zeros END IF GOTO c b: NEXT END SUB