R8C/1B problème de reception uart1

Postby gatsby94 » Fri Aug 24, 2007 12:00 am

toi qd tu 'as fait tu as fait ce même genre de code ou pas?
as tu quelque chose qui marche pour tester ??
gatsby94
 
Posts: 29
Joined: Fri Jan 17, 2014 4:38 pm

Postby sda » Fri Aug 24, 2007 12:00 am

Quand tu sort d'une IT le flag IR revient automatiquement à 0 donc pas besoin de l'écrire, tu change ne niveau d'interruption dans ton IT, est-ce vraiment nécessaire?
Tu lis le poids faible de u1rb, comme vue précedement il faut aussi lire le poids fort.
Je ne comprend pas pourquoi tu fais un while, une fois que ton octet est lue, tu auras une nouvelle IT si un nouvel octet arrive.

Pour être sûr et ne rien laisser au hasard, l'entrée RX est bien branché sur la pin 9 et elle est configuré en entrée sans pull up? Tu n'utilise pas la sortie INT0 en relation avec le timer z?

void reception_trame(void)
{
unsigned char dummy;
tab_reception_emission[pointeur_trame] = u1rbl;

dummy = u1rbh;

pointeur_trame ++;
temp_fin_trame = 10000;
flag_reception = 1;

}
sda
 
Posts: 24
Joined: Fri Jan 17, 2014 4:38 pm

Postby gatsby94 » Fri Aug 24, 2007 12:00 am

merci beaucoup ça marche nikel !!
je te remercie de ta patience j'ai bien compris comment l'utiliser maintenant. Mais trame arrive parfaitement c super !!
encore merci
gatsby94
 
Posts: 29
Joined: Fri Jan 17, 2014 4:38 pm

Postby sda » Fri Aug 24, 2007 12:00 am

Peux tu poster ton code uart pour d'autre personne qui aurait le même souci... et pour me montrer ce que tu as changer pour que cela fonctionne

A+ SDA
sda
 
Posts: 24
Joined: Fri Jan 17, 2014 4:38 pm

Postby gatsby94 » Fri Aug 24, 2007 12:00 am

j'ai parlé un peu trop vite
ça marche une fois et puis ensuite plus rien
il faut reseter pour que ça remarche une fois.
je dois oublier qchose lorsque j'ai reçu ma trame.
gatsby94
 
Posts: 29
Joined: Fri Jan 17, 2014 4:38 pm

Postby gatsby94 » Fri Aug 24, 2007 12:00 am

voici la routine d'initialisation de recpetion UART1

void init_uart(void)
{
unsigned int dummy;

u1mr = 0x05; /* pas de parité / 1 stop / clock interne / 8 bits*/
u1c0 = 0x08; /* LSB first, clock f1 (14,7456MHz)*/
u1brg = 0x5F; /* 9600 bauds (=[f1 /(16*9600)]-1)*/
u1c1 = 0x07; /* Reception et emission autorisées.*/
ucon = 0xB0;

s1ric = 0x01;


dummy = u1rb;

}

puis voici la routine d'interruption de reception UART1

void reception_trame(void)
{

unsigned char dummy;
tab_reception_emission[pointeur_trame] = u1rbl;

dummy = u1rbh;

pointeur_trame ++;
temp_fin_trame = 10000;
flag_reception = 1;


}

puis l'initialisation des ports de l'uart1

p4_5 = 0;
pd4_5 = 0;
p3_7 = 1;
pd3_7 = 1;
p1_7 = 0;
pd1_7 = 1;
gatsby94
 
Posts: 29
Joined: Fri Jan 17, 2014 4:38 pm

Postby gatsby94 » Fri Aug 24, 2007 12:00 am

ne pas oublier le
#pragma INTERRUPT reception_trame
avant le
void reception_trame(void)

et dans le sector30

.section vector,ROMDATA ; variable vector table
.org VECTOR_ADR

.glb _reception_trame

.lword dummy_int ; vector 0
.lword dummy_int ; vector 1
.lword dummy_int ; vector 2
.lword dummy_int ; vector 3
.lword dummy_int ; vector 4
.lword dummy_int ; vector 5
.lword dummy_int ; vector 6
.lword dummy_int ; vector 7
.lword dummy_int ; vector 8
.lword dummy_int ; vector 9
.lword dummy_int ; vector 10
.lword dummy_int ; vector 11
.lword dummy_int ; vector 12
.lword dummy_int ; vector 13
.lword dummy_int ; vector 14
.lword dummy_int ; vector 15
.lword dummy_int ; vector 16
.lword dummy_int ; vector 17
.lword dummy_int ; vector 18
.lword dummy_int ; vector 19
.lword _reception_trame ; vector 20
.lword dummy_int ; vector 21
.lword dummy_int ; vector 22
.lword dummy_int ; vector 23
.lword dummy_int ; vector 24
.lword dummy_int ; vector 25
.lword dummy_int ; vector 26
gatsby94
 
Posts: 29
Joined: Fri Jan 17, 2014 4:38 pm

Postby sda » Fri Aug 24, 2007 12:00 am

Qu'est ce qui marche qu'une fois? Est ce que tu reçois plusieurs octets ou un seul?
Tu incrémentes un pointeur, c'est dangeureux de ne pas tester s'il ne déborde pas avant de l'utiliser, ex :

void reception_trame(void)
{

unsigned char dummy;

if ( pointeur_trame < xxx )
tab_reception_emission[pointeur_trame] = u1rbl
else
{
//gestion de l'erreur
pointeur_trame = 0;
}

dummy = u1rbh;

pointeur_trame ++;
temp_fin_trame = 10000;
flag_reception = 1;
}
sda
 
Posts: 24
Joined: Fri Jan 17, 2014 4:38 pm

Postby gatsby94 » Fri Aug 24, 2007 12:00 am

j'ai enfin réussi à le faire plus fois d'affiler
en fait je réinitialise le compteur temp_fin_trame à chaque interruption de reception pour détecter la fin de trame . Si il n'y a plus de reception, le compteur n'est plus réinitialiser et il est décrementer pas une fonction comme ci dessous.

void tempo_fin_trame(void)
{
int z = 0;
temp_fin_trame--;
if (temp_fin_trame == 0)
{
for(z==0;z<210;z++)
{
tab_reception_emission[z] = 0;
}
init_uart();
pointeur_trame = 0;
flag_reception = 0;
}
}

cette fonction permet lorsque le compteur est à 0 de reinitialiser le tbleau de reception à 0.

lorsque je n'avais pas remis init_uart() dans cette focntion e ne pouvais que recevoir une fois alors que en réinitialsant l'uart dans cette focntion. je recevoir le nombre de fois que je veux.

Donc alleluia !!!!!
et merci merci merci.
En espérant que d'autres pourront l'utiliser.
gatsby94
 
Posts: 29
Joined: Fri Jan 17, 2014 4:38 pm

Postby gatsby94 » Fri Aug 24, 2007 12:00 am

je ne teste pas le pointeur parce que je sais ce que j'envoie comme nombre d'octet à l'avance donc je sais que je ne déborderai pas.
et en plus comme je le dis juste avant ma fonction tempo_fin_trame me vide le tableau et réinitialise le pointeeur à 0.
gatsby94
 
Posts: 29
Joined: Fri Jan 17, 2014 4:38 pm

Previous

Return to R8C/13 (01-2006)

Who is online

Users browsing this forum: No registered users and 1 guest