DECLARE SUB prtlh (a!(), t$) DECLARE SUB interpn (a!()) DECLARE SUB calcadeg (n!, adeg!, ast!, l!(), H!()) DECLARE SUB gentasm (a!(), ta!, pa!, t$) ' PROGRAMME GENPC1.bas 17/8/4,i pour interpr‚t‚,15000t/mn max 'pb trous ds tabd ' multimoteurs:1,2,4,5,6 ou 8 cylindres,2 et 4 temps 'k pour la version compilee. Seule difference , un REM page 3 'Il FAUT un repertoire c:\aepl sur C: 'G‚nŠre 3 tables c:\aepl\0ltab.txt , 0htab.txt qui seront 'utilisees par l'assembleur, directive:INCLUDE et 0tabd 'table des delais utilis‚e par un PC '0tabd est plus simple car pas de contrainte de 8 bits 'On INTERPOLLE la table ntmn()lineaire avant de generer les xtab 'qui sont en 1/n donc hyperboliques 'ltab est pour 367 - 1500 t/mn .ltab(3) contient le SEUIL 'Les deux htab pour 1500 - nmaxt/mn 'tabd est unique, pour tous les regimes 'La courbe d'avance peut etre DECROISSANTE, si necessaire 'La periode mini (Tseuil)pour la ligne rouge, sur 16 bits, positive 'Tableaux pour la pr‚paration *********MAIN**************** DIM l(256), H(256) 'tables des delais en u de 10ćs DIM tabd%(7500) 'idem,pour PC au lieu du Pic DIM tabd(7500) 'idem tabd% , pour sub interpn,anti zeros DIM ntmn(7500) 'Tableau des degrŠs en fonction des t/mn DIM SHARED fi, ast, nmax 'variables globales SCREEN 0 'Mode texte COLOR 14, 1 'Jaune sur fond bleu version$ = "Multi moteurs" 'version mille5 = 0 'flag de saisie du point 1500t/mn ast = 22.5 'Avance statique en deg allumeur(c'est T/4) nmin = 367 'limite inf de saisie 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 '… n donn‚, ce temps impose un degrŠ maxi d'avance degmax = INT((ast - (TC * nmax * 90) / 15000) * 10)' voir saisie degrŠs fi = 0 'flag pour impression TseuilH = 0 'periode mini en 16 bits, positif TseuilL = 0 CLS PRINT PRINT " ALLUMAGE CARTOGRAPHIQUE AEPL Version: " + version$ PRINT PRINT " Ph Loutrel" PRINT PRINT " PROGRAMME DE SAISIE D'UNE COURBE D'AVANCE A L'ALLUMAGE" PRINT PRINT " SUGGESTION pour ecran plus grand : ALT+ENTREE" PRINT PRINT "Attention:entrer des valeurs N ALLUMEUR (tours moteur/2) " PRINT "et angles de degres ALLUMEUR (degres moteur/2)en 1/10 degre" PRINT PRINT "Exemple: pour 5000t/mn moteur et 32 deg moteur" PRINT " entrer 2500 et 160 " PRINT PRINT "De 0 a 366 t/mn l'avance est deja fixee a 0 degre" PRINT PRINT "Un seul point est obligatoire: 1500 t/mn" PRINT INPUT "Nombre de cylindres (multiplier par 2 si 2 temps): ", NCYL PRINT seu: INPUT "Coupure de l'allumage au dela de t/mn : ", nred PRINT IF nred < 1000 OR nred > nmax THEN PRINT "ERREUR": GOTO seu INPUT "Voulez vous utiliser une imprimante ? (1 pour oui)", fi IF fi = 0 THEN pt = 0: pa = 0: GOTO lech 'les flags d'impression PRINT PRINT INPUT "Entrer une Reference pour cette courbe SVP: ", a$ PRINT INPUT "Entrer la date SVP: ", d$ r$ = a$ + " " + d$ LPRINT LPRINT LPRINT "Programme de saisie de courbe d'avance pour allumage AEPL" LPRINT LPRINT " VERSION : ", version$ LPRINT LPRINT " Ph Loutrel" LPRINT LPRINT "Tous les t/mn et degrŠs en valeur ALLUMEUR (valeur moteur/2)" LPRINT LPRINT LPRINT LPRINT LPRINT " Reference de la courbe, date :", r$ LPRINT LPRINT "Nombre de cylindres (multiplier par 2 si 2 temps): ", NCYL LPRINT LPRINT LPRINT "Coupure de l'allumage a t/mn: ", nred LPRINT LPRINT lech: INPUT "Nombre de tours par minute SVP (0 pour finir la saisie)", n IF n = 0 THEN r = 1 INPUT " Vraiment finir la saisie? (2 pour confirmer)", r IF r = 2 THEN GOTO finsaisie GOTO lech ELSE END IF IF n < nmin OR n > nred THEN PRINT "N hors limites " GOTO lech ELSE INPUT "Avance en 1/10 de degre ", dd END IF IF fi <> 0 THEN LPRINT " N t/mn ="; n, "Avance (1/10 de degres) = ", dd IF n = 1500 THEN mille5 = 1 'flag de saisie de 1500t/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 lech ntmn(n) = dd 'ranger les deg (1/10) GOTO lech finsaisie: IF mille5 = 0 THEN PRINT "Il faut saisire 1500t/mn": GOTO lech ntmn(0) = 0: ntmn(nmax) = degmax 'bornes CALL interpn(ntmn()) 'interpoller les degres a partir des TOURS/mn 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 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 'Remplissage des tables H et L IF n > 1500 THEN H(INT(nt / 4)) = INT(du)'entre ds H par T/4 et delai … sa valeur ELSE l(INT(nt / 16)) = INT(du / 4)'ds L par T/16 de delai/4 END IF ' Remplissage de la table pour PC tabd(INT(nt)) = INT(du) 'nt de 4096 … 20 NEXT CALL interpn(tabd()) FOR k = 1 TO 4096 tabd%(k) = tabd(k) NEXT Tseuil = INT(1500000 / nred) 'convertir ligne rouge en T unites de 10 mus 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) tabd%(1) = NCYL 'dans la table PC tabd%(2) = Tseuil disc$ = "C:" PRINT : PRINT : PRINT "La courbe va etre enregistr‚e sur C:\aepl" PRINT : PRINT : INPUT " Pour la mettre sur A:, taper A, sinon Entr‚e ", a$ IF a$ = "a" OR a$ = "A" THEN disc$ = "a:" PRINT : PRINT : PRINT "Nom de cette courbe, 8 caractŠres maxi" INPUT "L'extension .TXT sera ajout‚e automatiquement "; nom$ OPEN disc$ + "\aepl\" + nom$ + ".txt" FOR OUTPUT AS #1'la copier sur le disque FOR i = 1 TO 4096 PRINT #1, tabd%(i) NEXT PRINT : PRINT disc$ + "\aepl\" + nom$ + ".txt"; " enregistr‚e": PRINT : PRINT PRINT "Tabd%(1000) ", tabd%(1000) FOR i = 5 TO 61 l(i) = l(62) 'blinder la table NEXT l(256) = l(255) H(250) = 4 * l(62) '1500t/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 pt = 0 'Flag pour impression IF fi = 0 THEN GOTO np2 INPUT "Listing des tables de delais ? (1 pour oui) ", pt IF pt = 0 THEN GOTO np1 IF htab2 <> 0 THEN GOTO ta LPRINT CHR$(12) 'Nelle page t$ = "Table des delais N 367 - 1500t/mn " + r$ CALL prtlh(l(), t$) 'Imprimer l ta: t$ = "Table des delais N 1500 - nmax t/mn " + r$ CALL prtlh(H(), t$) 'imprimer h np1: pa = 0 t$ = "Tableau pour assembleur LTABLE N 367- 1500 t/mn " + r$ INPUT "Listing des tableaux ASSEMBLEUR LTABLE et HTABLE ? ( 1 pour oui) ", pa np2: IF htab2 <> 0 THEN ta = 3 t$ = "Tableau pour assembleur HTABLE2 N 1500-nmax t/mn " + r$ CALL gentasm(H(), ta, pa, t$)'noter tableau h GOTO visresult ELSE END IF ta = 1 'on genere d'abord LTABLE CALL gentasm(l(), ta, pa, t$) 'noter tableau l t$ = "Tableau pour assembleur HTABLE N 1500 - nmax t/mn " + r$ ta = 2 'au tour de HTABLE CALL gentasm(H(), ta, pa, t$) 'noter tableau h visresult: r = 0 REM Pour la version compilee, pas de courbe '***************Ligne au dessous en REM pour COMPILER******************* INPUT "Affichage de la courbe d'avance(par F4/F4/F5) ?(1 pour oui)", r IF r = 0 THEN GOTO noplot CLS SCREEN 12 'ecran graphique FOR n = 1 TO nmax STEP 10 CALL calcadeg(n, adeg, ast, l(), H()) PSET (INT(n / 10), 400 - INT(adeg * 2)) IF n = 1 OR n = 1001 OR n = 2001 OR n = 3001 OR n = 4001 OR n = 5001 OR n = 6001 OR n = 7001 OR n = nmax THEN PSET (INT(n / 10), 0) NEXT PRINT PRINT "t/mn 1000 2000 3000" PRINT "Taper touche F4 puis F5" STOP 'Pour voir la courbe, touche F4 'Pour continuer, touche F5 SCREEN 0: COLOR 14, 1: CLS 'retour a l'ecran texte noplot: r = 0 IF fi = 0 THEN GOTO fini PRINT PRINT PRINT INPUT "Listing des valeurs N en t/mn et Avance en 1/10 de degres?(1 pour oui)", r IF r = 0 THEN GOTO fini pab: pas = 100 INPUT "Pas = 100 t/mn. Si OK, taper '1' sinon tapez le pas", t IF t <> 1 THEN pas = t IF pas = 0 OR pas < 10 OR pas > 1000 THEN PRINT "Mauvais pas": GOTO pab LPRINT CHR$(12) 'nouvelle page LPRINT "N en t/mn Avance en 1/10 deg " + r$ FOR n = pas TO nmax STEP pas CALL calcadeg(n, adeg, ast, l(), H()) LPRINT n, adeg NEXT LPRINT CHR$(12) 'ejecter page fini: END SUB calcadeg (n, adeg, ast, l(), H()) '************************************ IF n = 0 THEN PRINT "n=0=:stop" tu = (15000 / n) * 100' unites:10 microsecondes IF n <= 366 THEN du = tu / 4: GOTO ad IF n <= 1500 THEN du = l(tu / 16) * 4: GOTO ad IF n > 1500 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 gentasm (a(), ta, pa, t$) '************************************************ EXIT SUB IF pa > 0 THEN LPRINT CHR$(12): LPRINT t$ IF ta = 2 THEN OPEN "c:\aepl\0htab.txt" FOR OUTPUT AS #2'on cree un fic pour l'assembleur IF ta = 1 THEN OPEN "c:\aepl\0ltab.txt" FOR OUTPUT AS #2 IF ta = 3 OR ta = b2 THEN OPEN "c:\aepl\0h2tab.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 t/mn ds ntmn(nmax) ' '************************************************************************** nz = 0 'nb de zeros entre deux points ref1 = 0 'le premier point non zero FOR i = 1 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 SUB prtlh (a(), t$) '******************************************************* 'imprime le tableau l ou h LPRINT t$ FOR l = 1 TO 256 STEP 8 'car 256 + 8 = 256 LPRINT l, a(l); a(l + 1); a(l + 2); a(l + 3); a(l + 4); a(l + 5); a(l + 6); a(l + 7) PRINT l; a(l); a(l + 1); a(l + 2); a(l + 3); a(l + 4); a(l + 5); a(l + 6); a(l + 7) NEXT END SUB