Boucle "for" pour un tableau qui plante tout [Forums - Langage C]
Boucle "for" pour un tableau qui plante tout [Forums - Langage C]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes



(1) 2 3 4 ... 14 »


Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Bonjour,

Quand je comprend pas pourquoi ça plante, et que ma carte se réinitialise, je vous demande l'aide car j'ai les cheveux qui poussent à l'intérieur de mon crâne ...

Pour mon bus 1 wire, j'arrive à écrire sans problème.

Mais c'est en lecture qu'il y a un truc qui m'échappe.

Voici 3 fonctions :

La première lit 1 bit sur le bus, et c'est ok.
char OWReadBit(void)
{
            
int result;
            
OWOUT(0);        // Drives DQ low
            
tickDelay(A);
            
OWOUT(1);         // Releases the bus
            
tickDelay(E);
            
sync 1;
            
OWIN();
            
result PORT_PTDD 0x01// Sample the bit value from the slave
            
sync 0;
            
tickDelay(F); // Complete the time slot and 10us recovery
            
return result;
}


La 2ème lit un octet grâce à la 1ère fonction. C'est ok.
char OWReadByte(void)
{
            
char loopresult=0;
            for (
loop 0loop 8loop++)
                {
// shift the result to get it ready for the next bit
                
result >>= 1;
// if result is one, then set MS bit
                
if (OWReadBit())
                    
result |= 0x80;
                }
                return 
result;
}


Et voici là 3ème, et c'est celle qui me rend fou, et qui est censée me lire 8 octets d'un seul coup, donc grâce à la 2ème fonction

void OWReadPackets(void)
{
    
unsigned char page_data[8];
    
unsigned char i;
for (
0<= 7i++)
    {
    
page_data[i] = OWReadByte();
    }
asm(nop);
}


Je peux faire un breakpoint sur le for, mais pas sur le asm(nop); Donc c'est bien que mon tableau déconne ???!!!

Qué passa !!!!???

Posté le : 04/03/2016 16:52
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
la fonction 2 retourne un char

le char tu le range dans un tableau de unsigned char

Pas sur que ça ait un rapport mais c'est pas bon déjà.

Posté le : 04/03/2016 17:04
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Ok j'uniformise.

D'ailleurs ça fait quoi un char seul ? il est signé ou pas ??

Posté le : 04/03/2016 17:06
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
et en plus il reste un int tout en haut

Posté le : 04/03/2016 17:09
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Je remet tout :
Ça ne règle pas mon probleme ...
//---------------------------------------------------------------------------
// Read a bit from the 1-Wire bus and return it. Provide 10us recovery time.
//
unsigned char OWReadBit(void)
{
    
unsigned char result;
            
OWOUT(0);        // Drives DQ low
            
tickDelay(A);
            
OWOUT(1);         // Releases the bus
            
tickDelay(E);
            
sync 1;
            
OWIN();
            
result PORT_PTDD 0x01// Sample the bit value from the slave
            
sync 0;
            
tickDelay(F); // Complete the time slot and 10us recovery
            
return result;
}

//---------------------------------------------------------------------------
// Read 1-Wire data byte and return it
//
unsigned char OWReadByte(void)
{
    
unsigned char loopresult=0;
            for (
loop 0loop 8loop++)
                {
// shift the result to get it ready for the next bit
                
result >>= 1;
// if result is one, then set MS bit
                
if (OWReadBit())
                    
result |= 0x80;
                }
                return 
result;
}

void OWReadPackets(void)
{
    
unsigned char page_data[8];
    
unsigned char i;
for (
0<= 7i++)
    {
    
page_data[i] = OWReadByte();
    }
asm(nop);
}

Posté le : 04/03/2016 17:17

Edité par dinastar sur 04/03/2016 17:53:57
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Chien de garde je l'ai désactivé.

Heuuu dans quel cas il y a dépassement de variable ? Variable mal dimmensionnée ?

Posté le : 04/03/2016 18:34
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1943
Hors Ligne
perso je sèche en l’état

ça te raconte quelque chose quand ça plante ? c'est quoi les symptômes ?


Posté le : 04/03/2016 20:12
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Quand ça plante ça dit que dalle.

Comme je disais, dans cette fonction, j'arrive à arriver à un break sur la ligne du for.
Dès que je rentre dans la boucle, ça foire, et impossible d'arriver au asm(nop).

void OWReadPackets(void)
{
    
unsigned char page_data[8];
    
unsigned char i;
for (
0<= 7i++)
    {
    
page_data[i] = OWReadByte();
    }
asm(nop);
}


Alors peut-être autre chose :

Voici le début de mon main :

void main(void) {
  
EnableInterrupts;
  
/* include your code here */
      
WDOG_CS1_EN 0;
      
initMCU();
      
SetSpeed(1);
      
OWTouchReset();
      
OWWriteByte(0x33);
      
OWReadPackets();    //->fonction avec la fameuse boucle for
        
OWReadByte();       //-> Warning : C1420 Result of function-call is ignored



Que veut dire cette erreur ? la fonction sert donc à lire un octet complet, et est utilisé dans ma boucle for ...
C1420 Result of function-call is ignored

Là ché pas où chercher ...

Posté le : 04/03/2016 21:14
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
J'ai l'impression qu'il y a un truc qui va pas dans OWReadByte() ...

Posté le : 04/03/2016 21:20
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Pilier de la communauté
Inscrit:
13/10/2005 10:06
De haute-savoie (74)
Messages: 1164
Hors Ligne
Salut

Alors C1420 Result of function call is ignored est un warning et pas une erreur. Cela dit simplement que la variable de retour de ta fonction n'est pas utilisée par la suite. Attention il peut du coup décider d'optimiser. Si tu ne veux pas que le compilateur s'autorise à faire des optimisations sauvages tu peux déclarer des variables avec le mot clé volatile
volatile unsigned char u8toto 0;


Ensuite quand tu dis que ça plante, ça fait quoi ?? Est-ce que tu peux faire du pas à pas dans la boucle for ? Si non où est-ce que cela bloque ? (quel index de la boucle ?)

Pour illustrer si besoin était l'importance des conventions et d'écrire du code directement propre c'est que dans tes quelques lignes tu t'es confronté toi même à des erreurs de type... le 'int result' qui est renvoyé dans un char c'est un dépassement de mémoire assuré. Je te recommande d'écrire un préfixe de taille de variable sur tes variables pour rapidement détecter ces erreurs. en l'occurence si ta variable result déclarée en int s'était appelée u16result, tu aurait rapidement vu que cela rentrait pas dans un u8.


Pour ton problème de fond. J'ai un doute sur ton page_data qui est déclaré en variable globale et qui n'est pas utilisé par la suite. C'est typique de là où le compilateur selon son paramétrage va optimiser en se disant que ça ne sert à rien de manipuler une variable qui n'est pas lue ensuite !

Donc déclare ta variable ainsi :

volatile unsigned char page_data[8];


et dis nous si ça améliore...

Et je te recommande vivement d'introduire un fichier tdef pour les types afin d'éviter de te balader avec des unsigned int char short long, long long, double, etc.... Ce sont des erreurs assurée à très court terme.


Posté le : 04/03/2016 21:48
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant
(1) 2 3 4 ... 14 »



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Boucle "for" pour un tableau qui plante tout [Forums - Langage C]