Attention ! Fermeture imminente du forum d’Elektor (pour en savoir plus, cliquer ici). À partir du vendredi 1er mars il ne sera plus possible de s’identifier sur ce forum, mais son contenu restera disponible en lecture seule jusqu’à la fin du mois. Le 1er avril, il sera fermé définitivement.

Interrupteur sur p1_7 et allumer LED p1_0

Postby tarkus » Wed May 30, 2007 12:00 am

Afin de maitriser les entrées / soties, je suis à la recherche d'un programme en C pour HEW, qui allume une LED sur p1_0 en fonction de la position d'un
switch sur p1_7

Cela devrait comprendre également la confuguration du port.


tarkus
 
Posts: 4
Joined: Fri Jan 17, 2014 4:37 pm

Postby gibi » Wed May 30, 2007 12:00 am

Bonjour,

Tarkus c'est ton prénom ?

Pour configurer les ports il suffit de mettre leurs registres à 1 pour les placer en sortie.
Donc pour le port 1 p1, tu places le registre pd1 avec les bits comme tu veux.

pd1 = 0xFF; /* pd1 output. Les 8 bits sont en sortie*/

Pour écrire sur une sortie
p1_0 = 1; met le bit 0 du port 1 (p1) à 1.
p1 = 0xFF; met tous bits à 1.

Les autres ports ont moins de bits

pd3 = 0x0F; /* p3_0 à p3_3 en output
pd4 = 0x20; /* seulement p4_5 ici en output

Le port p0 est un port protégé. Pour le paramétrer il faut mettre la protection off. Curieusement an0 correspond à p0_7, an1 à p0_6 etc...
p0_0 n'existe pas.

prc2 = 1; /* Protection off pour écrire sur pd0 */
pd0 = 0xFE; /* bits 1 à 7 sur p0 en output

Pour revenir à ton problème, il te faut une entrée et une sortie. Prenons le port p1.
pd1 = 0x01;
Cela te place une sortie sur p1_0 et une entrée sur tous les autres

Pour lire et écrire sur ton port c'est très simple.

if(p1_1==1)
{
p1_0=1;
}
else
{
p1_0=0;
}

Pour avoir un programme plus simple tu peux définir tes E/S comme cela.
#define LED p1_0
#define INTER p1_1

et remplacer ce qui correspond dans le programme ci dessus.

Ceci dit, la doc est fournie, le Cbooklet d'Elektor donne déjà pas mal de choses. Bosses un peu !

Amicalement,
Jean.

gibi
 
Posts: 104
Joined: Fri Jan 17, 2014 4:36 pm

Postby tarkus » Wed May 30, 2007 12:00 am

Bonjour Jean,

Bien merci pour ces infos, j'ai hâte d'expérimenter cela.
J'ai +/- l'habitude des PIC sous picbasic, et je débute en C.,
bien que le turbo pascal ne m'est pas étranger.

Tarkus est mon ablum préféré de Emerson Lake and Palmer!

Bàt et encore merci.

Daniel.
tarkus
 
Posts: 4
Joined: Fri Jan 17, 2014 4:37 pm

Postby tarkus » Wed May 30, 2007 12:00 am

Bonjour Jean,

Bien merci pour ces infos, j'ai hâte d'expérimenter cela.
J'ai +/- l'habitude des PIC sous picbasic, et je débute en C.,
bien que le turbo pascal ne m'est pas étranger.

Tarkus est mon ablum préféré de Emerson Lake and Palmer!

Bàt et encore merci.

Daniel.
tarkus
 
Posts: 4
Joined: Fri Jan 17, 2014 4:37 pm

Postby gibi » Wed May 30, 2007 12:00 am

Bonsoir Daniel,

Pour progresser il y a une adresse que j'aime bien sur le langage C

http://www.commentcamarche.net/c/cintro.php3

La difficulté, cest quand on aborde les pointeurs. Cela consiste à passer l'adresse d'une variable plutot que sa valeur. Cela évite de passer trop de données sur la pile du microcontroleur.

On passe l'adresse (le pointeur) dans la fonction appelante, et c'est la fonction qui pointe sur la donnée.

Voici un exemple :

char toto[] ="une fonction veut me lire"; // une variable chaine
char *pt; // un pointeur

pt = toto; // pt a maintenant l'adresse de toto, pas sa valeur. Il pointe sur toto.

En C, toute chaine est terminée par un 0.
On va faire une boucle avec la variable i, et passer l'adresse de la variable toto.
On utilise donc le pointeur *pt, et comme il s'agit d'une adresse et non d'une donnée je peux modifier cette adresse en écrivant *(pt+i)
ce qui ne fait qu'ajouter à mon adresse la valeur i. Donc si *pt a l'adresse 2000, i = 1, *(pt+i) deviendra 2001 et pointera sur 'n' car l'indice des variables en C commence à 0.

i=0;
while(*(pt+i)!=0) // jusqu'au caractère de fin de chaine '\0'
{
write(*(pt+i)); // on passe l'adresse de la variable dans la fonction
i++; // idem à i = i+1
}

void write(char dat)
{
// bla bla...
}

Et ce n'est seulement qu'à ce moment que dat prend la valeur d'une lettre de toto.

J'arrête la pour ce soir.

Bonne lecture du site,
Jean.
'
gibi
 
Posts: 104
Joined: Fri Jan 17, 2014 4:36 pm

Postby tarkus » Wed May 30, 2007 12:00 am

Bonjour,

Voilà, l'expérience est totalement concluante, j'ai testé les I/O sur base de tes informations, c'est extra! je vais pouvoir dévelloper aussi facillement que les pic's en basic.
Je placé simplement des LED en sortie, et ma pince brucelle en entrée,
mais tout cela sera remplacé par des appications bien concrètes...
Encore bien merci.

Daniel.
tarkus
 
Posts: 4
Joined: Fri Jan 17, 2014 4:37 pm

Postby gibi » Wed May 30, 2007 12:00 am

Bonjour,

Content de voir que tes premiers essais sont concluants.

J'ai ouvert une nouvelle page sur mon site :

http://perso.wanadoo.fr/asnora/R8C/r8c_pre_pas.htm

Tu y trouveras des infos pour débuter.
Port E/S
champ de bits
convertisseur analogique numérique 1O bits

et dautres infos qui restent à venir.

Amuse toi bien,
Jean.
'
gibi
 
Posts: 104
Joined: Fri Jan 17, 2014 4:36 pm


Return to R8C/13 (01-2006)

Who is online

Users browsing this forum: No registered users and 1 guest