'PIPC3.bas ******************Pour Allumage programmable AEPL**************** 'Possibilit‚ d'alterner deux courbes d'avance '22/10/4 philippe.loutrel@laposte.net en collaboration avec Ludomini 'Programme permettant de substituer un PC au Pic d'origine 'pendant les phases d'optimisation de la courbe d'avance 'Pour augmenter la precision, mettre nmaxx=1000(nb de periodes test‚es) ' ecran noir ou bleu, memes mesuresde temps, donc on garde bleu ' Exemples: Fuji/Siemens(Pentium M 1.4GHz) :tb=1.1æs, k1ms=15500,TC=1 '18.7 fois plus rapide que le P75 du 'TOSHIBA, pour lequel k1ms=950,TC=3,TC2=40(stock‚ ds x\aepl\0pccar.txt) 'Pentium 3, 800Mhz, tb=1.05æs, TC=6æs,K1ms=10030, TC2=170æs '***************UTILISATION******************* 'Pour etalonner un PC et commander l'allumage AEPL suivant une (ou 2) courbe d'avance 'saisie au prealable via GENPCxx. 'Pouur changer de courbe d'avance 'Pour enregistrer un "run" c'est … dire jusqu'… une minute de periodes 'd'allumage ' POUR L'ETALONNAGE 'On injecte un signal rectangulaire de p‚riode pr‚cise T en æs 'T typique 5 ou 10ms 'Fonctionnement sous DOS indispensable 'Booter le PC avec une disquette, (ou redemarrer en mode Dos 'pour la pr‚cision) 'Dans sa phase d'etalonnage, 'ce programme capture N ondes d'un oscillateur carr‚ 'Alimenter l'ensemble par une pile de 9V, mais pas d'alim branch‚e sur 220V svp 'Connexion au port // ' **11********1 11 est le 3‚me trou en partant de la gauche ' 25******** 25 est le premier trou en partant de la gauche 'L'oscillateur est reli‚ … la pin 11 par une simple diode 'en s‚rie, ANODE vers PC: l'oscillateur met … la masse la pin 11 'Brancher la masse de l'oscillateur sur la pin 25 '********************* POUR L'UTILISATION AVEC AEPL**************** 'Enlever le Pic de l'AEPL 'Deconnecter l'oscillateur;souder la cathode de la diode … la pin 3 du 555(sortie) 'Connecter son anode la pin 11 du port // du PC : c'est l'ENTREE 'dans le PC 'La SORTIE du PC est la pin 1 du port //, 1 est le premier trou en partant 'de la droite(schema ci dessus). Connecter par un simple fil rigidedans la broche '17 du support de Pic DECLARE SUB etalpc () DECLARE SUB mesper () DECLARE SUB mescode () DECLARE SUB mes1ms () DECLARE SUB AEPC () DECLARE SUB mestc2 () DECLARE SUB comptetours () DEFINT A-Z nmaxx = 100 'Pour l'etalonnage uniquement:nb de periodes,ds T(), 'consecutives de l'oscillateur utilis‚es pour tb etc 'Tabd recoit les delais D de la courbe d'avance active '**************VARIABLES GLOBALES************* DIM SHARED tb!, per!, pp, t(nmaxx), nmax, k1ms&, TC, tc2, FTC2, TABD(4096), TABD2(4096), disc$, pin1, pin11 '*********************************************** nmax = nmaxx 'contrainte du Basic pour DIM SHARED:il faut un autre nom de variable! 'Tout en entiers 16 bit(+/-32k) SAUF 'x& entier 32 bit (+/- 2M), 'x! reel simple precision(+/-10**38) tb! = 0: per! = 0 'tb temps de boucle de test du port //, per= T de l'oscillateur disc$ = "C:" 'par defaut, C: L… o— sont stock‚es les courbes et 'le fichier 0pccar.txt des 4 nombres caracteristiques du PC pp = &H379 'adresse du port parallŠle en entr‚e, port 1(Data en &h378) pin11 = &H379 'port // ,entr‚e venant du 555, via une diode 'pin 11 est le bit b7(Busy) de &h379,Status word du port 1 pin1 = &H37A 'port //, sortie vers un transistor et IGBT 'pin 1 est le bit b0(Strobe) de &h37A,Control word du port 1 FOR i = 1 TO nmax: t(i) = 0: NEXT'RAZ du tableau de stockage SCREEN 0 'mode texte COLOR 14, 1 'jaune sur fond bleu CLS sdeb: 'ECRAN PRINCIPAL PRINT : PRINT : PRINT " Le disque pour les courbes d'avance est "; disc$: PRINT " Pour le changer , taper 4": PRINT : PRINT PRINT : PRINT : PRINT "Pour etalonner ce PC taper 1" PRINT : PRINT : PRINT "Pour revenir au DOS taper 3" PRINT " Si ce PC a d‚j… ‚t‚ etalonn‚:" PRINT : PRINT : PRINT "Pour lancer l'allumage taper Entr‚e" PRINT : PRINT : PRINT "Pour d'autres fonctions taper 2" PRINT : PRINT : PRINT "Pour generer des etincelles sans signal d'entr‚e taper 5" GOSUB getcar SELECT CASE A$ CASE CHR$(13): CLS 'pour generer l'allumage CALL AEPC CLS GOTO sdeb CASE "1" GOSUB dialog 'etalonnage CALL etalpc 'calcul tb CALL mescode 'mesure TC CALL mes1ms 'mesure k1ms, boucle de 1ms CALL mestc2 'mesure TC2 GOTO sdeb CASE "3": STOP 'retour au DOS CASE "4" 'Changement de disque CLS : PRINT : PRINT "Entrer la lettre, par exemple A " GOSUB getcar disc$ = A$ + ":": PRINT : PRINT "Le disque est maintenant "; Disk$ CLS : GOTO sdeb CASE "5" 'genŠre des etincelles en continu GOSUB salve GOTO sdeb END SELECT CLS 'donc a=2 , ce sont les outils "Autres fonctions" aldeb: PRINT : PRINT PRINT "Le temps de boucle de ce PC (lecture du port //) est" PRINT PRINT " tb æS= "; tb! PRINT PRINT "Taper 1 pour etalonner le PC (calcul de tb)" PRINT " 2 pour mesurer la periode de l'oscillateur externe" PRINT " 3 pour mesurer la dur‚e du code ins‚r‚ dans la Sub MESCODE" PRINT " 4 pour calculer la boucle de 1ms " PRINT " 5 pour le comptetours avec oscillateur externe" PRINT " 6 pour sortir" GOSUB getcar PRINT : PRINT SELECT CASE A$ CASE "1": CALL etalpc 'etalonnage CASE "2": CALL mesper 'mesure de la periode CASE "3": CALL mescode 'mesure du code: TC CASE "4": CALL mes1ms 'mesure de k1ms, boucle de 1ms CASE "5": CALL comptetours CASE "6": CLS : GOTO sdeb 'sortie END SELECT GOTO sdeb dialog: 'SUB en debut d'etalonnage CLS : PRINT PRINT "Brancher un oscillateur de periode connue T surle port //": PRINT PRINT "Pin 25 : masse de l'oscillateur, pin 11 entr‚e de l'oscillateur": PRINT PRINT "Une diode, anode cot‚ PC, en s‚rie ave la pin 11": PRINT PRINT "Oscillateur aliment‚ par pile.": PRINT PRINT "Quand tout est pret , taper 1": PRINT GOSUB getcar ' RETURN GOTO aldeb getcar: 'SUB lect d'un caractŠre A$ = INKEY$ 'purge buffer de 1car de INKEY$ DO WHILE A$ = "": A$ = INKEY$: LOOP RETURN salve: 'SUB G‚nŠre des etincelles sans signal d'entr‚e CLS : PRINT "Pour arreter taper Entr‚e" OPEN disc$ + "\AEPL\0PCCAR.txt" FOR INPUT AS #1' Ce fichier, INPUT #1, tb! 'caracteristiques du PC, a ‚t‚ INPUT #1, k1ms& 'g‚n‚r‚ par la SUB mes1ms, sous DOS, INPUT #1, TC 'avec un oscillateur externe INPUT #1, tc2 CLOSE #1 b$ = INKEY$ 'purger buffer clavier DO WHILE b$ = "" b$ = INKEY$ ket& = 3 * k1ms& 'Onde carr‚e de T=6ms, 5000t/mn vilo OUT (pin1), 1 'sortie basse FOR k& = 1 TO ket&: NEXT OUT (pin1), 0 'sortie haute FOR k& = 1 TO ket&: NEXT LOOP CLS RETURN 'un caract a ‚t‚ entr‚, fin des salves END DEFSNG A-Z SUB AEPC 'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS 'Commande les etincelles via l'AEPL 'Il faut aussi avoir saisi la (ou les) courbe d'avance avec 'le logiciel GENPCxx.bas qui g‚n‚re"X":\AEPL\"nom de la courbe(8car maxi)" 'Cette SUB attend les fronts montants (dur‚e 1ms haut)du 555 'sur l'entr‚e pin11 du port// 'Elle mesure la periode T entre deux front (de 0.64s … 4ms) 'typique:10ms … 3000t/mn moteur, 5ms … 6000t/mn 'En fonction de T, elle extrait du tableau TABD,la valeur 'D du delai … appliquer(en u de 10æs)avant de lever la sortie 'pin1, ce qui coupe le courant bobine, d'o— ‚tincelle 'pin1 est maintenue haute pendant 2ms, puis elle va attendre 'le nouveau front 'Si T>64000u, le moteur est arr‚t‚ 'Si T >4096u, N<732 t/mn,D est calcul‚=T/4 (0ø avance) ou 3T/16 'pour une avance de 11ø2 (1600S) ' VARIABLES DEFINT A-Z 'tout en entiers 16 bits sauf sp‚cifi‚ 'tb! reel,dur‚e de boucle de test pin11,en æs 'sur le PC utilis‚ 'par exemple sur un Pentium 75, 3.5æs 'k1ms&, entier 32 bits,pour delai de 1ms 'sur le PC utilis‚ ds la boucle: ' FOR k=1 to k1ms&:NEXT 'Ces deux valeurs viennent de l'etalonnage 'et sont ds le fichier X:\AEPL\0pccar nlog = 500 '****************MODIFIABLE ********************* DIM trec&(nlog) 'stock un run de nlog periodes t& = 0 'Periode en entr‚e, u de 10æs Ti = 1500 'Valeur de depart pour le polling premiere T 'Pour la premiŠre T, Ti=150ms(‚vite retour moteur) D = 0 'Delai th‚orique pour ‚tincelle DP = 0 'Delai pratique nb& = 0 'Nombre de boucle de test de pin11,32 bits Trl = 0 'Periode mini autoris‚e, ie red line ' TC en u de 10æs,temps de calcul de A … B ci dessous 'TC2 = 0 idem de C … D ki$ = "" 'chaine vide,stock Inkey$ CC = 1 'Courbe courante, 1 ou 2 RunF = 0 'Flag run en cours iR = 0 'index maxi de run dans trec() irmax = nlog 'taille de trec() lck = 0 'Si 1, interdit le logging des T dans trec(), car un Run y est stock‚ NRunF = 0 'Si 1, saisie de nom de Run (ou logging) en cours 'MAIN IF FTC2 = 1 THEN 'on veut mesurer TC2 'on garnit TABD de delai quelconque FOR i = 1 TO 4096: TABD(i) = 100: NEXT tc2 = 0 GOTO gh END IF CLS : 'initialisation ,lit 0pccar et courbe OPEN disc$ + "\AEPL\0PCCAR.txt" FOR INPUT AS #1' Ce fichier, INPUT #1, tb! 'caracteristiques du PC, a ‚t‚ INPUT #1, k1ms& 'g‚n‚r‚ par la SUB mes1ms, sous DOS, INPUT #1, TC 'avec un oscillateur externe INPUT #1, tc2 CLOSE #1 getcourbe: 'lecture d'une (ou 2)courbe d'avance CLS : INPUT "Entrer le nom d'une courbe d'avance, sans extension SVP ", df$ OPEN disc$ + "\AEPL\" + df$ + ".txt" FOR INPUT AS #1 FOR i = 1 TO 4096 INPUT #1, TABD(i) 'lit la courbe d'avance NEXT CLOSE #1 Trl = TABD(2) 'Ligne rouge PRINT : PRINT : INPUT "Entrer le nom d'une deuxiŠme courbe d'avance, sinon Entr‚e ", df2$ IF df2$ = "" THEN df2$ = df$ 'recopie la premi‚re courbe OPEN disc$ + "\AEPL\" + df2$ + ".txt" FOR INPUT AS #1 FOR i = 1 TO 4096 INPUT #1, TABD2(i) 'lit la courbe d'avance NEXT CLOSE #1 ecrstd: CLS IF CC = 1 THEN PRINT "COURBE EN COURS: "; df$ ELSE PRINT "COURBE EN COURS: "; df2$ END IF PRINT : PRINT : 'PRINT "Pour AFFICHER/EFFACER l'ecran, taper 'Escape'": PRINT PRINT "Pour changer de courbe , taper !": PRINT PRINT "Pour demarrer ou arreter un run, barre d'espace": PRINT PRINT "Pour enregistrer les derniŠres secondes d'allumage, taper Entr‚e": PRINT PRINT "Pour sortir, taper 8" gh: ' CONSTANTES nbmax& = 1000000 'nb de tests maxi au niveau haut pour mot arr‚t‚ Tstop& = 64000 'u de 10æS:si T>Tstop, le moteur est arr‚t‚ (N<47t/mn) Tmax = 4096 'u de 10æs :entre Tstop et Tmax on calcul D=3T/16=0.1875*T 'pour avance de 11ø2 (ou D=0.25*T pour zero degrŠs) ku! = k1ms& / 100 'r‚el,pour boucle de une u, soit 10æs Etin = 2 'Dur‚e etincelle en ms Etinu = Etin * 100 'idem en u de 10æs ketin& = Etin * k1ms& 'Pour boucle FOR de Etin ms, entier 32 bits ' SUITE MAIN esdeb: 'attente premier front seulement OUT (pin1), 0 'niveau haut, coupe I bobine AttFrt: nb& = nb& + 1 'compteur de boucles , attente de tous les fronts IF INP(pin11) > 128 THEN GOTO Att ' pin11 … 0V 'pin 11 … 4.8V IF nb& > nbmax& THEN GOTO Mart 'Moteur arr‚t‚, lire un carac GOTO AttFrt 'pin 11 … 4.8V Att: nb& = nb& + 1 IF INP(pin11) > 128 THEN GOTO Att ' pin11 … 0 volt t& = INT((nb& * tb!) / 10) + Ti 'Front arriv‚ Pt AAAAAAAA 'pin 11 passe … haut(4.5V) 'T& est le temps pass‚ ds la boucle ' augment‚ de la valeur initiale IF t& > Tstop& THEN nb! = 0: GOTO Mart 'moteur arr‚t‚ IF t& > Tmax THEN 'N trop faible, pas de TABD ,on calcul D D = .1875 * t& 'N<732t/mn, avance 11ø2(ou zero) ELSE D = TABD(t&) 'Extraire le delai D de la table IF CC = 2 THEN D = TABD2(t&) 'deuxiŠme courbe END IF DP = D - TC 'Delai pratique,TC temps de calcul kD& = INT(ku! * DP) 'Pour attente de DPu de 10æs Pt BBBBBBBB FOR k& = 1 TO kD&: NEXT 'Attente pr‚cise, avant etincelle 'Pt CCCC ' IF t& < Trl THEN GOTO nospark 'Si trop vite, pas d'etincelle OUT (pin1), 0 'etincelle,pin1 … 4.5V, coupe I bobine 'Pt DDDDDDDD nospark: FOR k& = 1 TO ketin&: NEXT 'Attente de Etin ms 'Pt EEEEEEEE OUT (pin1), 1 'pin1 … OV, retablit I ds bobine GOSUB rpm 'affiche N et Avance Mart: nb& = 0 'RAZ compteur de boucles Ti = D + Etinu + tc2 'Depuis le dernier front, en u de 10æs ki$ = INKEY$ 'lit le car du clavier et RAZ de ce buffer IF ki$ <> "" THEN IF NRunF = 0 THEN GOTO choix '1 caract a ‚t‚ tap‚, pas de nom de Run en cours IF ki$ = CHR$(13) THEN NRunF = 0: GOTO nomready 'fin de saisie IF ki$ = CHR$(27) OR ki$ = CHR$(8) THEN CLS : GOTO NameRun'Esc ou backspace nomrun$ = nomrun$ + ki$ CLS : PRINT "Nom "; nomrun$ GOTO esdeb ' un carac de + ds le nom END IF IF lck = 1 THEN GOTO nolog 'Run ds trec(), pas de logging IF iR < irmax THEN 'log T iR = iR + 1 trec&(iR) = t& nolog: GOTO AttFrt 'logging de T END IF ' 'PT FFFFFFFFFFFFFFFFFFFFF IF RunF = 0 THEN iR = 1 trec&(iR) = t& GOTO tsttc2 'Reset logging END IF GOTO espace 'run termin‚ par trec() full, idem espace choix: SELECT CASE ki$ CASE " ": GOTO espace 'deb ou fin de Run CASE "!": GOTO swc 'changer de courbe CASE "2": GOTO NameRun 'nommer le run termin‚ CASE CHR$(13): GOTO logging 'Entr‚e,mettre sur disque les iRmax derniŠres periodes CASE "7": GOTO free 'liberer trec() pour logging CASE "8": CLS : EXIT SUB 'sortir END SELECT GOTO AttFrt NameRun: NRunF = 1 'on attend un nom pour le Run nomrun$ = "" 'vide pour commencer CLS : PRINT : PRINT : PRINT "Entrer un nom de 8 caractŠres maxi, sans extension" GOTO esdeb 'get car nomready: 'Apr‚s Entr‚e, le nom est pret CLS : PRINT : PRINT : OPEN disc$ + "\AEPL\" + nomrun$ + ".txt" FOR OUTPUT AS #1 IF CC = 1 THEN PRINT #1, df$ 'stocker le nom de la courbe d'avance ELSE PRINT #1, df2$ END IF FOR i = 1 TO iFin PRINT #1, trec&(i) NEXT CLOSE 1 free: RunF = 0 'RAZ du flag de run lck = 0 'liberer trec() pour le logging CLS GOTO ecrstd 'ecran standard espace: IF RunF = 0 THEN iR = 0 RunF = 1 CLS : PRINT "Run en cours" GOTO esdeb END IF iFin = iR: lck = 1: 'Fin de Run, noter le pointeur max vers terec() GOSUB analrun GOTO esdeb analrun: CLS : PRINT " Run termin‚" PRINT : PRINT : PRINT "Donn‚es sur ce Run:": PRINT : PRINT IF CC = 1 THEN PRINT "Courbe d'avance: "; df$ ELSE PRINT "Courbe d'avance: "; df2$ END IF PRINT : PRINT PRINT "De N1= "; INT(3000000 / trec&(3)): PRINT : PRINT " … N2= "; INT(3000000 / trec&(iFin)), "t/mnn vilo" PRINT : PRINT : PRINT "Nombre de periodes enregistr‚es: "; iFin tt! = 0 FOR i = 1 TO iFin tt! = tt! + trec&(i) 'Calcul de la dur‚e du Run NEXT PRINT : PRINT : PRINT "Dur‚e du Run en secondes: "; tt! / 100000 PRINT : PRINT : PRINT " Taper 2 pour le nommer, 7 pour l'annuler" RETURN tsttc2: IF FTC2 = 0 THEN GOTO AttFrt'TC2 d‚j… connu tsum! = 0 OPEN disc$ + "\aepl\ttc2.txt" FOR OUTPUT AS #1 ' FOR j = 1 TO irmax PRINT #1, trec&(j) NEXT CLOSE #1 xctr = irmax reft& = trec&(2) FOR i = 1 TO irmax IF ABS(reft& - trec&(i)) > 2 THEN xctr = xctr - 1: trec&(i) = 0 tsum! = tsum! + trec&(i) 'somme des periodes NEXT tmoyen! = tsum! / xctr 'periode moyenne mesur‚e qd TC2=0 'on connait per! de l'oscillateur tc2 = per! / 10 - tmoyen! ' d'o— la bonne valeur de TC2 CLS EXIT SUB logging: CLS : PRINT "Pour enregistrer les "; irmax; "derniŠres periodes" ' INPUT "Entrer un nom de fichier sur 8 lettres maxi, sans extension, sinon taper Entr‚e", D$ iFin = iR 'simule une fin de Run lck = 1 GOTO NameRun rpm: 'Affiche N et l'avance LOCATE 1, 55 PRINT "t/mn: "; INT(3000000 / t&); "DegrŠs "; INT(45 - 180 * (D / t&)) RETURN swc: 'switch curve IF CC = 1 THEN CC = 2: GOTO ecrstd IF CC = 2 THEN CC = 1: GOTO ecrstd END SUB DEFSNG A-Z SUB comptetours 'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS DEFINT A-Z CLS 'initialisation ,lit 0pccar et courbe OPEN disc$ + "\AEPL\0PCCAR.txt" FOR INPUT AS #1' Ce fichier, INPUT #1, tb! 'caracteristiques du PC, a ‚t‚ INPUT #1, k1ms& 'g‚n‚r‚ par la SUB mes1ms, sous DOS, INPUT #1, TC 'avec un oscillateur externe INPUT #1, tc2 CLOSE #1 dcor = 40 PRINT "Pour arreter taper Entr‚e" b$ = INKEY$ DO WHILE b$ = "" b$ = INKEY$ dnb& = 0 dAttFrt: dnb& = dnb& + 1 'compteur de boucles , attente de tous les fronts IF INP(pin11) < 128 THEN GOTO dAttFrt ' pin11 … 4.5 volt dAtt: dnb& = dnb& + 1 IF INP(pin11) > 128 THEN GOTO dAtt ' pin11 … 0 volt dT = INT((dnb& * tb!) / 10) + dcor 'Front arriv‚ LOCATE 1, 65 PRINT "t/mn: "; INT(3000000 / dT) 'affichage des t/mn LOOP CLS 'un caract a ‚t‚ entr‚ END SUB DEFSNG A-Z SUB etalpc 'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS 'On lui fournit T, elle va compter le nb de boucles durant T 'et en deduira tb!, la dur‚e d'une boucle en æs DEFINT A-Z debb: INPUT "Periode de l'oscillateur externe SVP, en æs= ", per! CLS : PRINT "Mesure de tb en cours": i = 0 deb: l! = 0 w1: l! = l! + 1 IF INP(pp) > 128 THEN GOTO w2 'pin 11 … 0 volt, environ IF l! > 1000000 THEN CLS : PRINT : PRINT PRINT " PAS DE SIGNAL!!! relancer le programme" A$ = INKEY$: DO WHILE INKEY$ = "": LOOP: STOP END IF GOTO w1 'Pin11 tj … 4.5V environ w2: IF INP(pp) > 128 THEN GOTO w2 'pin 11 … 0 volt np: tt = 0: i = i + 1 'debut de p‚riode w3: tt = tt + 1 IF INP(pp) < 128 THEN GOTO w3 'partie haute du signal w4: tt = tt + 1 IF INP(pp) > 128 THEN GOTO w4 'partie basse du signal t(i) = tt 'fin de la periode IF i < nmax THEN GOTO deb sigte! = 0 OPEN "A:\nb.txt" FOR OUTPUT AS #1 ' FOR j = 1 TO nmax PRINT #1, t(j) NEXT ctr = nmax ref = t(2) ' on espŠre pas aberrant FOR i = 1 TO nmax IF ABS(ref - t(i)) > 2 THEN ctr = ctr - 1: t(i) = 0 'ignorercette valeur sigte! = sigte! + t(i) 'calcul de la periode etalon moyenne NEXT tem! = sigte! / ctr 'nb de boucles (test pin11) pendant T tb! = per! / tem! PRINT #1, tem! CLOSE #1 CLS : PRINT PRINT PRINT tem!; " cycles de lecture du port (test pin11) pendant Tæs= "; per! PRINT PRINT "Soit une dur‚e de cycle de tb æs="; tb!: PRINT : PRINT OPEN disc$ + "\aepl\Ti.txt" FOR OUTPUT AS #1 'sauver les 4 carac. du PC FOR h = 1 TO nmax PRINT #1, INT(t(h)) NEXT CLOSE #1 PRINT "T() sauv‚ dans Ti.txt": PRINT : PRINT INPUT "Taper Entr‚e pour continuer", A: : CLS END SUB DEFSNG A-Z SUB mes1ms 'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS DEFINT A-Z 'recherche de k1ms& qui donne 1ms=1000æs ds boucle FOR CLS : PRINT "Mesure de k1ms pour la boucle FOR de 1ms en cours" PRINT : PRINT : PRINT "Patience..." kdep& = 700 km& = kdep& sav = nmax: nmax = 2 'mesure de tfor sur une ou 2 periodes GOSUB mesurefor km& = km& * tfor / 1000 ' on approche km avec une rŠgle de 3 GOSUB mesurefor km& = km& * tfor / 1000 'encore GOSUB mesurefor km& = km& * tfor / 1000 'encore del = 10 DO WHILE tfor < 998 OR tfor > 1002 ' km& = km& + del GOSUB mesurefor IF tfor > 1000 THEN del = -10 IF tfor < 1000 THEN del = 10 PRINT km&; tfor LOOP nmax = sav 'restituer nmax k1ms& = km& PRINT "Avec k1ms& = "; k1ms&; "La boucle FOR(1ms) =æs "; tfor: PRINT : PRINT PRINT PRINT INPUT "Taper Entr‚e pour continuer", D EXIT SUB mesurefor: ' Sub interne de mesure de tfor 'entr‚e km&, sortie tfor en æs i = 0 xww1: 'compteur de boucles IF INP(pp) < 128 THEN GOTO xww1 'pin 11 … 4.8 volt, environ xww2: IF INP(pp) > 128 THEN GOTO xww2 'pin 11 … 0 volt xwnp: nb = 0: i = i + 1 'debut de p‚riode '************* inserer ici le code … mesurer AAA FOR k& = 1 TO km&: NEXT '************fin du codeBBBB xww3: nb = nb + 1 'APRES le code, on compte les boucles IF INP(pp) < 128 THEN GOTO xww3 'partie haute du signal ' Transition haute/basse xww4: nb = nb + 1 IF INP(pp) > 128 THEN GOTO xww4 'partie basse du signal t(i) = nb IF i < nmax THEN GOTO xww1 'fin de la periode sigte! = 0 FOR i = 1 TO nmax sigte! = sigte! + t(i) NEXT nb = sigte! / nmax trestant = nb * tb! 'temps restant pour les boucles tfor = per! - trestant 'soustrait dela periode en entr‚e RETURN END SUB DEFSNG A-Z SUB mescode 'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS 'Pour mesurer le temps d'execution TC du code entre A et B 'Ce code est une partie critique de la SUB aepc 'Variables necessaires pour le code : DEFINT A-Z nb& = 1000: Ti = 100: Tstop& = 64000: Tmax = 4096: TC = 1: ku! = 9 CLS PRINT "Mesure de TC encours" wdeb: i = 0 ww1: IF INP(pp) > 128 THEN GOTO ww2 'pin 11 … 0 volt, environ GOTO ww1 'Pin11 tj … 4.5V environ ww2: IF INP(pp) > 128 THEN GOTO ww2 'pin 11 … 0 volt wnp: tt = 0: i = i + 1 'debut de p‚riode 'tt compte les boucles de test, i les periodes '*************d‚but de periode,inserer ici le code … mesurer Point AAA t& = INT((nb& * tb!) / 10) + Ti 'Front arriv‚ Pt AAAAAAAA 'pin 11 passe … haut(4.5V) 'T est le temps pass‚ ds la boucle ' augment‚ de la valeur initiale klt: IF t& > Tstop& THEN nb! = 0: GOTO klt 'moteur arr‚t‚ IF t& > Tmax THEN D = .1875 * t& 'N<732t/mn, avance 11ø2(ou zero) ELSE D = TABD(t&) 'Extraire le delai D de la table END IF DP = D - TC 'Delai pratique,TC temps de calcul kD& = INT(ku! * DP) 'Pour attente de DPu de 10æs Pt BBBBBBBB ' t& = INT((nb& * tb!) / 10) + Ti 'Front arriv‚ Pt AAAAAAAA 'pin 11 passe … haut(4.5V) 'T est le temps pass‚ ds la boucle ' augment‚ de la valeur initiale 'kltt: IF t& > Tstop& THEN nb! = 0: GOTO kltt 'moteur arr‚t‚ ' IF t& > Tmax THEN ' D = 0.1875 * t&'N <732t/mn, avance 11ø2(ou zero) ' ELSE ' D = TABD(t&) 'Extraire le delai D de la table ' END IF ' DP = D - TC 'Delai pratique,TC temps de calcul ' kD& = INT(ku! * DP) 'Pour attente de DPu de 10æs Pt BBBBBBBB '************fin du code Point BBBBBBBBBBBBBBBBB ww3: tt = tt + 1 IF INP(pp) < 128 THEN GOTO ww3 'partie haute du signal ' Transition haute/basse ww4: tt = tt + 1 IF INP(pp) > 128 THEN GOTO ww4 'partie basse du signal t(i) = tt 'fin de la periode IF i < nmax THEN GOTO ww1 sigte! = 0 'OPEN disc$ + "\aepl\tcode.txt" FOR OUTPUT AS #1 ' 'FOR j = 1 TO nmax ' PRINT #1, t(i) 'NEXT 'CLOSE #1 FOR i = 1 TO nmax sigte! = sigte! + t(i) NEXT tem! = sigte! / nmax 'nb de boucles moyen (test pin11) pendant T Taveccode! = tem! * tb! TC! = per! - Taveccode! 'en æs TC = INT(TC! / 10) 'en u de 10æs CLS : PRINT : PRINT PRINT " Mesure du temps de calcul TC": PRINT : PRINT PRINT "La periode mesur‚e avec le code ins‚r‚ est æs= "; INT(Taveccode!): PRINT : PRINT PRINT "Soit une dur‚e de code de æs:"; TC!: PRINT : PRINT PRINT "et en u de 10 æs TC= "; TC: PRINT : PRINT INPUT "Taper Entr‚e pour continuer", q CLS END SUB DEFSNG A-Z SUB mesper 'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS 'Connaissant tb!, elle mesure la periode en entr‚e DEFINT A-Z CLS : PRINT "Mesure de la periode de l'oscillateur externe en cours" zdeb: i = 0 zw1: IF INP(pp) > 128 THEN GOTO zw2 'pin 11 … 0 volt, environ GOTO zw1 'Pin11 tj … 4.5V environ zw2: IF INP(pp) > 128 THEN GOTO zw2 'pin 11 … 0 volt znp: hh = 0: bb = 0: i = i + 1 'debut de p‚riode zw3: hh = hh + 1 IF INP(pp) < 128 THEN GOTO zw3 'partie haute du signal 'transition haute/basse zw4: bb = bb + 1 IF INP(pp) > 128 THEN GOTO zw4 'partie basse du signal t(i) = hh + bb 'fin de la periode IF i < nmax THEN GOTO zw1 sigte! = 0 FOR i = 1 TO nmax sigte! = sigte! + t(i) NEXT tem! = sigte! / nmax 'nb de boucles (test pin11) pendant T CLS PRINT PRINT "nb de boucles (test pin11) entre deux fronts montants:"; tem! PRINT PRINT "Soit une periode T en æs= "; INT(tem! * tb!) PRINT PRINT "Pour le derniŠre periode le signal HAUT/BAS en æs: "; INT(hh * tb!); INT(bb * tb!) PRINT : PRINT : INPUT "Tapez Entr‚e pour continuer", A: CLS END SUB DEFSNG A-Z SUB mestc2 'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS DEFINT A-Z 'tout en entiers 16 bits sauf sp‚cifi‚ FTC2 = 1 'pour demarrer la mesure de TC2 avec AEPC,set FlagTC2 CLS : PRINT "Mesure de TC2 en cours": CALL AEPC 'TC2 vient d'etre calcul‚ FTC2 = 0 'mesure de TC2 terminŠe,clear flag PRINT "Ce PC est maintenant etalonn‚": PRINT : PRINT PRINT " Les 4 donn‚es d'etalonnage sont:": PRINT : PRINT PRINT "Temps de test de pin1 tb!æs= "; tb!: PRINT : PRINT PRINT "Avec k1ms& = "; k1ms&; "pour la boucle FOR de 1ms": PRINT : PRINT PRINT "Temps de calcul(correctif) en u de 10æs TC ="; TC PRINT : PRINT PRINT " TC2 ="; tc2 INPUT "Bias pour TC2 ", btc2 tc2 = tc2 + btc2 js: INPUT "Tapez Entr‚e pour continuer", A CLS PRINT PRINT OPEN disc$ + "\aepl\0pccar.txt" FOR OUTPUT AS #1 'sauver les 4 carac. du PC PRINT #1, tb! PRINT #1, k1ms& PRINT #1, TC 'temps de calcul,determin‚ par la SUB mescode PRINT #1, tc2 CLOSE #1 END SUB