Aller au contenu


Photo
- - - - -

Debuté en programmation


  • Veuillez vous connecter pour répondre
22 réponses à ce sujet

#21 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 02 février 2010 - 12:50

Hello à tous,

Normalement, chaque Pin de ton uC (Microcontroleur) a une adresse allouée, ensuite tu peux très bien dire que la variable x ou y ou toto est égale à cette adresse...

Je n'ai pas de programme sous la main, mais je te balance ce soir un exemple réalisé avec un MST430 (uC de chez Texas). Même si tu as un uC différent, le principe est le même.

Un prof m'a dit exactement la même chose, mais aux tests c'était le résultat qui comptait, allez comprendre...

Amicalement Philou

#22 arthael

arthael

    Membre passionné

  • Membres
  • PipPipPip
  • 479 messages
  • Gender:Male

Posté 02 février 2010 - 06:18

ok ok, merci a tous, en fait c'est pas si compliqué a comprendre tout ca, (juste un peu de logique ^^)

#23 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 02 février 2010 - 10:33

hello à tous,



Voici comme promis 2 codes réalisé en C avec un uC de chez Texas...




///////////////////////////////////////////////////////////////////////////////

// * Auteur : Bovey Philippe

// * Labo : Premiers programmes avec le MSP430

// * Date : 14.04.2008

///////////////////////////////////////////////////////////////////////////////



#include "io430.h"





// déclarartion des différents fonctions utilisée dans le programme

//////////////////////////////////////////////////////////////////

// Nom de la fonction: ATTENTE

// Descriptif: attent pendant 3ms

// Entrées: -

// Sorties: -

void ATTENTE(){

for(int i = 0; i < 30000 ;i++);

}



//////////////////////////////////////////////////////////////////

// Nom de la fonction: VALEUR_LEDS_P2

// Descriptif: détermine la leds qui sera allumé

// Entrées: -

// Sorties: -

int VALEUR_LEDS_P2(int Valeur_leds_AV){

int Valeur_leds_AP;



Valeur_leds_AP = Valeur_leds_AV * 2;

if (Valeur_leds_AP == 0x10)

VALEUR_LEDS_P2(Valeur_leds_AP);

else if (Valeur_leds_AP == 0x20)

VALEUR_LEDS_P2(Valeur_leds_AP);

else if (Valeur_leds_AP > 0x80)

return 0x01;

else

return Valeur_leds_AP;

}



//////////////////////////////////////////////////////////////////

// Nom de la fonction: FCT_A_FAIRE()

// Descriptif: attent pendant 3ms

// Entrées: -

// Sorties: -

void FCT_A_FAIRE(int Val_fct, int On_off, int *Val_chenille){



switch (Val_fct){



case 1:

if (On_off == 1)

P2OUT = 0xCF;

else

P2OUT = 0x00;

break;



case 2:

if (On_off == 1){

P2OUT = *Val_chenille;

ATTENTE();

*Val_chenille = VALEUR_LEDS_P2(*Val_chenille);

}

else

P2OUT = 0x00;

break;



case 3:

if (On_off == 1){

P2OUT = 0xCF;

ATTENTE();

P2OUT = 0x00;

ATTENTE();

}

else

P2OUT = 0x00;

break;



default:

P2OUT = 0x00;

break;

}

}



////////////////////// Programme Principal ////////////////////////////////////

int main( void )

{



#define SWITCHS P1;

#define LEDS P2OUT;



// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD;



// déclarartion des ports

P1DIR = 0x00; //initialisation du port 1, entrée à '0'

P2DIR = 0xFF; //initialisation du port 2, sortie à '1'



P1SEL = 0x00; //Définit port en I/O

P2SEL = 0x00; // " " "



P2OUT = 0x00; // toutes les leds sont éteintes



// déclaration des variables

int Valeur_fct = 0;

int On_Off = 0;

int Val_Led_chenille = 0x01;



while(1){



// lecture de la touche 1.

while(P1IN & 1);

while(!(P1IN & 1));



if (On_Off == 0){

On_Off = 1;

Valeur_fct = 1;

}

FCT_A_FAIRE(Valeur_fct, On_Off, &Val_Led_chenille);



// lecture de la touche 1.

while(P1IN & 1);

while(!(P1IN & 1));



if (On_Off == 1){

On_Off = 0;

Valeur_fct = 1;

}

FCT_A_FAIRE(Valeur_fct, On_Off, &Val_Led_chenille);



// lecture de la touche 2.

while(P1IN & 2);

while(!(P1IN & 2));



if (On_Off == 0){

On_Off = 1;

Valeur_fct = 2;

}



do{

FCT_A_FAIRE(Valeur_fct, On_Off, &Val_Led_chenille);

}while((P1IN & 2) == 0);



// lecture de la touche 2.

// while(P1IN & 2);

while(!(P1IN & 2));



if (On_Off == 1){

On_Off = 0;

Valeur_fct = 3;

}

FCT_A_FAIRE(Valeur_fct, On_Off, &Val_Led_chenille);



// lecture de la touche 3.

while(P1IN & 4);

while(!(P1IN & 4));



if (On_Off == 0){

On_Off = 1;

Valeur_fct = 3;

}



do{

FCT_A_FAIRE(Valeur_fct, On_Off, &Val_Led_chenille);

}while((P1IN & 4) == 0);



// lecture de la touche 3.

// while(P1IN & 4);

while(!(P1IN & 4));



if (On_Off == 1){

On_Off = 0;

Valeur_fct = 3;

}

FCT_A_FAIRE(Valeur_fct, On_Off, &Val_Led_chenille);

}



return 0;

}



[/code]




/////////////////////////////////////////////////////////////////////////////

// * Auteur : Bovey Philippe

// * Titre : Mesure Réaction

// * Date : 24.09.2008

// Dernière modif : 25.10.2008

///////////////////////////////////////////////////////////////////////////////



// déclaration des différentes librairies

#include "io430.h"

#include "intrinsics.h"

#include "LCD.h"

#include "stdio.h"



////////////////////////////////////////////////////////////////////////////////

// DECLARATION VARIABLES GLOBALES //

///////////////////////////////////////////////////////////////////////////////



//////////////////////////////// Constantes ////////////////////////////////////

#define LONGUEUR_TXT 20



///////////////////////////// Variables globales ///////////////////////////////



int tiques = 0; // A chaques interruption Timer A, s'incrémente de 1

int pret = 0; // Bit configuré pour savoir si presser sur SW4

int Lecture_tiques = 0;

int Terminer = 0; // Bit configuré pour savoir si presser sur SW1





////////////////////////////////////////////////////////////////////////////////

// FONCTIONS //

////////////////////////////////////////////////////////////////////////////////



// Nom de la fonction: DEFILEMENT

// Descriptif: Permet de faire défiler un texte sur affichage LCD de

// gauche à droite

// Entrées: *tableau_msg

// Sorties: *tableau_msg

// Remarque : pas utiliser dans ce programme, car encore quelques bugs

void DEFILEMENT(char *tableau_msg)

{

// déclaration de variables hshshshshs

char premier_caract;



premier_caract = tableau_msg[0];



for (int i = 0; i < LONGUEUR_TXT; i++)

{

if (i < LONGUEUR_TXT)

tableau_msg[i] = tableau_msg[i + 1];

else

tableau_msg[i] = premier_caract;

}

}



// Nom de la fonction: AFFICHAGE

// Descriptif: Permet d'affichager un message sur l'affichage LCD en lui donnant

// 2 tableaux de caractère

// Entrées: *Aff_StrDisp, *Aff_str

// Sorties: -

void AFFICHAGE(char *Aff_StrDisp, char *Aff_str)

{

sprintf (Aff_StrDisp, "%s", Aff_str);

LCD_clear();

LCD_print(Aff_StrDisp);

}



// Nom de la fonction: ATTENTE_C

// Descriptif: permet d'avoir un moment d'attente pour avec une boucle for

// Entrées: -

// Sorties: -

void ATTENTE_C()

{

for(int i = 0; i < 30000 ; i++);

}





// Nom de la fonction: ATTENTE_L

// Descriptif: permet d'avoir un moment d'attente pour avec une boucle for

// Entrées: -

// Sorties: -

void ATTENTE_L()

{

for(long J = 0; J < 150000 ; J++);

}



// Nom de la fonction: ALEATOIRE

// Descriptif: permet de d'avoir un nb aléatoire lorsque l'on appelle cette

// fonction

// Entrées: -

// Sorties: Val_alea

static int ALEATOIRE()

{

static int w = 1;

static int x = 2;

static int y = 3;



unsigned int Val_alea;



w = (157 * w)%32363;

x = (146 * x)%31727;

y = (142 * y)%31657;



Val_alea = ((w - x + y)%32362);



return Val_alea;

}





////////////////////////////////////////////////////////////////////////////////

// PROGRAMME PRINCIPAL //

////////////////////////////////////////////////////////////////////////////////

int main( void )

{

// déclartion des différentes variables utiliser dans le main

unsigned int Val_alea = 0;



char strDisp1[LONGUEUR_TXT + 1]; // longueur tableau pour msg

char str1[] = "PUSH Sw4 " ; // texte à afficher

char str2[] = "pret " ; // texte à afficher



// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD;



// initialisation des ports

P1DIR = 0x00; //initialisation du port 1, entrée à '0'

P2DIR = 0xFF; //initialisation du port 2, sortie à '1'

P2OUT = 0x00; //leds éteintes



//initialisation du Port1 pour interruption

P1IES &= 0x00; // interrupt P1.x au flancs montants

P1IE |= 0x0F; // enable interrupt P1.x

P1IFG = 0x00; // mise à zéro du port



// initialisation du Timer

TACTL_bit.TACLR; // Remis à zéro du Timer

TACTL_bit.TASSEL = 1; // Choix de l'horloge / horloge externe

TACTL_bit.TAID = 0; // Choix du diviseur de fréquecne / :1

TACTL_bit.TAMC = 1; // Choix du mode comptage jusqu'à la valeur du CCR0

TACCR0 = 327 + 1; // Chargement de la valeur de CCR0 (représente 10ms)

TACCTL0_bit.CCIE = 1; // Permet d'activer le timer A



// initialisation des interruptions

__enable_interrupt(); // Activation général des interruption



// initialisation du LCD

LCD_init(); // initiation de l'affichage

sprintf(strDisp1, "%s", str1); // sorte de printf

LCD_clear(); // effacer l'affichage

LCD_print(strDisp1); // affichage de la châine de caractères





// boucle infini

while(1)

{

// partie affichage

//DEFILEMENT(str1); // permet de faire défiler un texte de bienvenu

AFFICHAGE(strDisp1, str1); // afficher un texte

ATTENTE_C(); // fonction d'attente



// test si presser sur SW4 Interruption sur le port P1

if(pret == 1)

{

ATTENTE_L();

pret = 0;



// nettoyage du tableau pour nouveau message

for(int i = 0; i < LONGUEUR_TXT; i++)

strDisp1[i]= ' ';



AFFICHAGE(strDisp1, str2); // afficher un texte

ATTENTE_L();



// nettoyage du tableau pour nouveau message

for(int i = 0; i < LONGUEUR_TXT; i++)

strDisp1[i]= ' ';



Val_alea = ALEATOIRE(); // fonction aléatoire



for(int j = 0; j < Val_alea; j++); // boucle d'attente pour éteindre leds



P2OUT = 0x00; // Leds éteintes

tiques = 0; // Remise à Zéro de la variable tiques

// pour compter temps de réaction

}



// test si presser sur SW1 Interruption sur le port P1 (réaction)

if(Terminer == 1)

{

Terminer = 0;

sprintf(strDisp1, "%d ms",

Lecture_tiques*10); // enregistrement temps de réaction, x10 car

// interruption toutes 10ms

LCD_clear();

LCD_print(strDisp1);

ATTENTE_L();

}

}

}



////////////////////////////////////////////////////////////////////////////////

// INTERUPTIONS //

////////////////////////////////////////////////////////////////////////////////



// Nom de la fonction: INT_TIMERA

// Descriptif: A chaque fois que le timerA crée une interruption une variable

// s'incrémente de 1

// Entrées: -

// Sorties: -

#pragma vector= TIMERA0_VECTOR

__interrupt void INT_TIMERA()

{

tiques = tiques + 1; //

}



// Nom de la fonction: INTER_PORT1

// Descriptif: Si pression sur Sw4 ou Sw1, interruption activée

// Entrées: -

// Sorties: -

#pragma vector = PORT1_VECTOR

__interrupt void INTER_PORT1()

{

if(P1IFG == 0x08)

{

P2OUT = 0xCF;

pret = 1;

}

else if(P1IFG == 0x01)

{

Terminer = 1;

Lecture_tiques = tiques;

}



P1IFG = 0x00; // mise à zéro du port

}

[/code]



Amicalement Philou




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users