mich29800

voiture_rc

Feb 16th, 2022
1,522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 16.52 KB | None | 0 0
  1. //******************************************************************************
  2. //******************************************************************************
  3. // Onglet principal voitue_rc_gal_1
  4. //******************************************************************************
  5. //******************************************************************************
  6. //Michel COLIN ................aucuns droits...peut être recopié.......
  7. //******************************************************************************
  8. //          Programme de pilotage voiture RC
  9. //******************************************************************************
  10. // Lecture de 6 voies de télécommande RC et pilotage de 6 servos
  11. // la lecture des voies se trouve dans la variable valeurV1 à valeurV6
  12. // les valeurs des pulses de sortie sont à mettre dans le tableau valeurS[0 à 5]
  13. //******************************************************************************
  14. // ATTENTION, les valeurs lues et à écrire sont le double des valeurs
  15. // conventionnelles (3000 pour un point milieu à la place de 1500)
  16. //*******************************************************************************
  17. // Le programme utilise l'interruption changement d'état des I/O PCINT1
  18. // ainsi que le timer 1
  19. // Il utilise également l'IT de comparaison COMPA1
  20. // utilisable uniquement sur un récepteur de télécommande
  21. // et ne permet pas la mesure de pulses en //
  22. //*********************************************************************************
  23.  
  24. #include "avr/io.h"
  25. #include <avr/interrupt.h>
  26.  
  27. //*****************************************************************
  28. // déclaration des variables globales
  29. //*****************************************************************
  30. volatile int valeurV1=3000;  // contient la valeur*2 de la durée impulsion entrée PC0
  31. volatile int valeurV2=3000;  // contient la valeur*2 de la durée impulsion entrée PC1
  32. volatile int valeurV3=3000;  // contient la valeur*2 de la durée impulsion entrée PC2
  33. volatile int valeurV4=3000;  // contient la valeur*2 de la durée impulsion entrée PC3
  34. volatile int valeurV5=3000;  // contient la valeur*2 de la durée impulsion entrée PC4
  35. volatile int valeurV6=3000;  // contient la valeur*2 de la durée impulsion entrée PC5
  36. volatile int valeurS[6];  // tableau des durées d'impulsions à générer
  37.  
  38. //**************************************************************************
  39. // déclaration de la fonction Interruption écrite en assembleur Atmega 328
  40. //**************************************************************************
  41. extern "C" {void PCINT1_vect();}
  42. extern "C" {void TIMER1_COMPA_vect();}
  43. byte nombre;
  44. byte sequence=0;
  45. int i;
  46. int j;
  47. int valeursortie;
  48. unsigned long oldmilli;
  49. byte etat_inter=0;
  50. byte sens_V4=0;
  51.  
  52. void setup()
  53. {
  54.   Serial.begin(9600);
  55. //*****************************************************************
  56. // Configuration des registres
  57. //*****************************************************************
  58. cli();                              // masquage des IT
  59. //**************** Configuration du port C en entrées **************************
  60. DDRC=0x00;                           // Toutes pins du port C en entrée
  61. PORTC=0x00;                          // pas de pullup sur le port C
  62.  
  63. //**************** Configuration du port D en sorties **************************
  64. DDRD=0xFF;                           // Toutes pins du port D en sorties
  65.  
  66. //**************** Initialisation Timer 1 ******************************
  67. TCCR1B=0x02;                           // Horloge compteur à 2 Mhz
  68. TCCR1A=0x00;                           // Fonctionnement en mode standard
  69. //TIFR1=0x02;                            // démasquage IT de comparaison COMPTA1
  70. OCR1AL=0xF0;                           // prépositionnement du comparateur A1
  71. OCR1AH=0xFF;                           // à FFF0h (à la mise sous tension)
  72. TIMSK1=0x02;                           // validation interruption comparaison
  73.  
  74. //**************** Initialisation interruptions changement état Voies 1 à 6 ******
  75. PCMSK1=0x3F;                        // valide les changements d'état entrées
  76. PCICR=0x02;                         // valide l'interruption PCINT1
  77. PCIFR=0x02;                         // valide l'interruption PCINT1
  78.  
  79. sei();                              // démasquage des IT
  80.  
  81. }
  82. void loop()
  83. {
  84.  
  85. if(Serial.available()>0){nombre=Serial.read();}
  86.   if (nombre==49){sequence=1;}
  87.  
  88. if (sequence==1)
  89. {for (i=1000;i<5000;i++){valeurS[0]=i;delay(1);}
  90. for (j=5000;j>1000;j--){valeurS[0]=j;delay(1);}
  91. sequence=0;}
  92. else {valeurS[0]=valeurV1;}
  93. if (valeurV4>3000){etat_inter=1;}
  94.   else {etat_inter=0;}
  95. if (((millis()-oldmilli)>3)&&(etat_inter==1))
  96.  {oldmilli=millis();
  97.   if (valeurS[3]>=4000){sens_V4=1;}
  98.   if (valeurS[3]<=2000){sens_V4=0;}
  99.   if (sens_V4==0){valeurS[3]=valeurS[3]+5;}
  100.   if (sens_V4==1){valeurS[3]=valeurS[3]-5;}
  101.  }
  102.  
  103. valeurS[1]=valeurV1;
  104. valeurS[2]=valeurV1;
  105. //valeurS[3]=valeurV3;
  106. valeurS[4]=valeurV2;
  107. valeurS[5]=valeurV2;
  108. }
  109.  
  110. //******************************************************************************
  111. //******************************************************************************
  112. // Onglet lecture pulses RC lecturerx.S
  113. //******************************************************************************
  114. //******************************************************************************
  115. //Michel COLIN
  116. //*****************************************************************
  117. //          Lecture des pulses récepteur Voies 1, 2, 3, 4, 5, 6
  118. //          utilise le timer 1, code testé sur ATMEGA 328P
  119. //****************************************************************
  120. // voie 1 = PORTC0, A0    -> valeurV1
  121. // voie 2 = PORTC1, A1    -> valeurV2
  122. // voie 3 = PORTC2, A2    -> valeurV3
  123. // Voie 4 = PORTC3, A3    -> valeurV4
  124. // Voie 5 = PORTC4, A4    -> valeurV5
  125. // Voie 6 = PORTC5, A5    -> valeurV6
  126. //*****************************************************************
  127.  
  128. #include "avr/io.h"
  129.  
  130. // Déclaration des variables locales
  131. //************************************
  132.  
  133. .DATA
  134. .lcomm compteurV1,2       ;déclaration des compteurs de durée voies 1 à 6 et réservation 2 octets
  135. .lcomm compteurV2,2
  136. .lcomm compteurV3,2
  137. .lcomm compteurV4,2
  138. .lcomm compteurV5,2
  139. .lcomm compteurV6,2
  140. .lcomm oldportc,1         ; déclaration valeur du PORTC à l'interruption it-1 et réservation 1 octet
  141.  
  142. // programme interruption, mesure de la durée des pulses
  143. //*******************************************************
  144.  
  145. .org 0x0010                               // adresse vecteur PCINT1
  146.  
  147. .section .text
  148. .global PCINT1_vect
  149.  
  150. PCINT1_vect :
  151.                cli                       // masquage des IT
  152.                push R24
  153.                lds R24,SREG
  154.                push R24                
  155.                push R16
  156.                lds R16,PINC              // lecture portC
  157.                push R17                  // sauvegarde des registres utilisés ici
  158.                push R18                  //             R16 à R24, SREG
  159.                push R19
  160.                push R20
  161.                push R21
  162.                push R22
  163.                push R23
  164.                lds R18,TCNT1L            // chargement compteur TCNT1 dans R18 R19
  165.                lds R19,TCNT1H
  166.                andi R16,0x3F             // test si un front montant parmi 6
  167.                mov R24,R16
  168.                lds R17,oldportc
  169.                com R17
  170.                andi R17,0x3F
  171.                and R17,R16
  172.                breq passe_montant        // si pas de front montant,aller à  test si front descendant
  173.                call f_montant1           // recherche la(les)voie(s) avec front montant
  174. passe_montant:  mov R16,R24
  175.                lds R17, oldportc         // test si un front descendant parmi 6
  176.                com R16
  177.                and R16,R17
  178.                breq fin                  // recherche la(les)voie(s) avec front descendant
  179.                call f_descendant1                
  180.                ori R24,0x0
  181.                brne fin
  182. fin:            sts oldportc, R24
  183.                mov R24, R18
  184.                pop R23
  185.                pop R22
  186.                pop R21
  187.                pop R20
  188.                pop R19
  189.                pop R18
  190.                pop R17
  191.                pop R16
  192.                pop R24                   // Récupérationa dans la pile des registres
  193.                sts SREG,R24              //             R16 à R24, SREG
  194.                pop R24                
  195.                sei
  196.                reti
  197.  
  198. // détection front montant on charge le compteur de la voie détectée avec la valeur de TCNT1
  199. //******************************************************************************************
  200.  
  201. f_montant1:     ror R16               // si front montant détecté sur voie 1 compteurV1 = TCNT1 lu à l'interruption
  202.                 brcc f_montant2
  203.                 sts compteurV1,R18
  204.                 sts compteurV1+1,R19
  205. f_montant2:     ror R16               // si front montant détecté sur voie 2 compteurV2 = TCNT1 lu à l'interruption
  206.                 brcc f_montant3
  207.                 sts compteurV2,R18
  208.                 sts compteurV2+1,R19
  209. f_montant3:     ror R16               // si front montant détecté sur voie 3 compteurV3 = TCNT1 lu à l'interruption
  210.                 brcc f_montant4
  211.                 sts compteurV3,R18
  212.                 sts compteurV3+1,R19
  213. f_montant4:     ror R16               // si front montant détecté sur voie 4 compteurV4 = TCNT1 lu à l'interruption
  214.                 brcc f_montant5
  215.                 sts compteurV4,R18
  216.                 sts compteurV4+1,R19
  217. f_montant5:     ror R16               // si front montant détecté sur voie 5 compteurV5 = TCNT1 lu à l'interruption
  218.                 brcc f_montant6
  219.                 sts compteurV5,R18
  220.                 sts compteurV5+1,R19
  221. f_montant6:     ror R16               // si front montant détecté sur voie 6 compteurV6 = TCNT1 lu à l'interruption
  222.                 brcc fin_montant
  223.                 sts compteurV6,R18
  224.                 sts compteurV6+1,R19
  225. fin_montant:    ret
  226.  
  227. // détection front descendant on calcule la durée de l'impulsion de la voie correspondante
  228. //****************************************************************************************
  229.  
  230. f_descendant1 : ror R16               // si front descendant détecté sur voie 1 valeurV1 = TCNT1 - compteurV1
  231.                 brcc f_descendant2
  232.                 movw R20,R18
  233.                 lds R22,compteurV1
  234.                 lds R23,compteurV1+1
  235.                 sub R20,R22
  236.                 sbc R21,R23
  237.                 sts valeurV1,R20
  238.                 sts valeurV1+1,R21
  239. f_descendant2:  ror R16               // si front descendant détecté sur voie 1 valeurV2 = TCNT1 - compteurV2
  240.                 brcc f_descendant3
  241.                 movw R20,R18
  242.                 lds R22,compteurV2
  243.                 lds R23,compteurV2+1
  244.                 sub R20,R22
  245.                 sbc R21,R23                
  246.                 sts valeurV2,R20
  247.                 sts valeurV2+1,R21
  248. f_descendant3:  ror R16               // si front descendant détecté sur voie 1 valeurV3 = TCNT1 - compteurV3
  249.                 brcc f_descendant4
  250.                 movw R20,R18
  251.                 lds R22,compteurV3
  252.                 lds R23,compteurV3+1
  253.                 sub R20,R22
  254.                 sbc R21,R23      
  255.                 sts valeurV3,R20
  256.                 sts valeurV3+1,R21
  257. f_descendant4:  ror R16               // si front descendant détecté sur voie 1 valeurV4 = TCNT1 - compteurV4
  258.                 brcc f_descendant5
  259.                 movw R20,R18
  260.                 lds R22,compteurV4
  261.                 lds R23,compteurV4+1
  262.                 sub R20,R22
  263.                 sbc R21,R23      
  264.                 sts valeurV4,R20
  265.                 sts valeurV4+1,R21
  266. f_descendant5:  ror R16               // si front descendant détecté sur voie 1 valeurV5 = TCNT1 - compteurV5
  267.                 brcc f_descendant6
  268.                 movw R20,R18
  269.                 lds R22,compteurV5
  270.                 lds R23,compteurV5+1
  271.                 sub R20,R22
  272.                 sbc R21,R23      
  273.                 sts valeurV5,R20
  274.                 sts valeurV5+1,R21
  275. f_descendant6:  ror R16               // si front descendant détecté sur voie 1 valeurV5 = TCNT1 - compteurV5
  276.                 brcc fin_descendant
  277.                 movw R20,R18
  278.                 lds R22,compteurV6
  279.                 lds R23,compteurV6+1
  280.                 sub R20,R22
  281.                 sbc R21,R23      
  282.                 sts valeurV6,R20
  283.                 sts valeurV6+1,R21
  284. fin_descendant: ret
  285.  
  286. //******************************************************************************
  287. //******************************************************************************
  288. // Onglet eriture pulses RC ecrituerx.S
  289. //******************************************************************************
  290. //******************************************************************************
  291. //Michel COLIN
  292. //*****************************************************************
  293. //          Génération des pulses  Voies 1, 2, 3, 4, 5, 6
  294. //          utilise le timer 1, code testé sur ATMEGA 328P
  295. //****************************************************************
  296. // voie 1 = PORTD2, D2    ->valeurS[0]
  297. // voie 2 = PORTD3, D3    ->valeurS[1]
  298. // voie 3 = PORTD4, D4    ->valeurS[2]
  299. // Voie 4 = PORTD5, D5    ->valeurS[3]
  300. // Voie 5 = PORTD6, D6    ->valeurS[4]
  301. // Voie 6 = PORTD7, D7    ->valeurS[5]
  302. //*****************************************************************
  303.  
  304. #include "avr/io.h"
  305.  
  306. // Déclaration des variables locales
  307. //************************************
  308.  
  309. .DATA
  310. .lcomm voiesortie,1         // déclaration n° de voie de sortie et réservation 1 octet
  311. .lcomm pinsortie,1          // déclaration n° de pin en cours du PORTB et réservation 1 octet
  312.  
  313.  
  314. // programme interruption, génération des pulses
  315. //*******************************************************
  316.  
  317. .org 0x002C                               // adresse vecteur TIMER1_COMPTA
  318.  
  319. .section .text
  320. .global TIMER1_COMPA_vect
  321.  
  322. TIMER1_COMPA_vect :
  323.                 cli                       // masquage des IT
  324.                 push R24
  325.                 lds R24,SREG
  326.                 push R24
  327.                 push R16
  328.                 clr R16                  
  329.                 sts PORTD,R16             // mise à 0 des bits de sortie portD
  330.                 push R17                  // sauvegarde des registres utilisés ici
  331.                 push R18                  //    R16 à R19, R26, R27, R24, SREG
  332.                 push R19
  333.                 push R25
  334.                 push R26
  335.                 push R27
  336.                 lds R17, pinsortie       // lecture n° pin de sortie active
  337.                 lds R16, voiesortie      // lecture voie de sortie en cours
  338.                 cpi R16,0x0C             // on vérifie si la voie de sortie en cours est la n°6
  339.                 brne prem
  340.                 ldi R16,0x0              // on repositionne la voie de sortie sur la n°1
  341.                 ldi R17,0x4              // on positionne la pin de sortie sur D2
  342. prem:           ldi R26,lo8(valeurS)     // chargement du pointeur des valeurs de pulses
  343.                 ldi R27,hi8(valeurS)
  344.                 add R26,R16              // On rajoute l'offset de la voie de sortie au pointeur
  345.                 brbc 0,deuze            
  346.                 inc R27
  347. deuze:          ld R18,X+                // chargement de la valeur de la voie en cours
  348.                 ld R19,X
  349.                 lds R24,TCNT1L           // chargement de la valeur du compteur TCNT1
  350.                 lds R25,TCNT1H
  351.                 add R18,R24              // rajout de la valeur de la voie au compteur TCNT1
  352.                 adc R19,R25
  353.                 sts OCR1AH,R19           // chargement comparateur COMPA
  354.                 sts OCR1AL,R18
  355.                 sts PORTD,R17            // positionnnement à 1 du bit en sortie
  356.                 clc                
  357.                 rol R17                  // décalage pour voie suivante (prochain cycle)
  358.                 sts pinsortie,R17        // sauvegarde de la pin de sortie voie suivante
  359.                 inc R16                  // préparation voie de sortie prochain cycle
  360.                 inc R16
  361.                 sts voiesortie,R16
  362.                 pop R27
  363.                 pop R26
  364.                 pop R25  
  365.                 pop R19
  366.                 pop R18
  367.                 pop R17
  368.                 pop R16
  369.                 pop R24                   // Récupération dans la pile des registres
  370.                 sts SREG,R24              //             R16 à R24, SREG
  371.                 pop R24
  372.                 sei
  373.                 reti
  374.  
Advertisement
Add Comment
Please, Sign In to add comment