Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

programation d'un pic 18F4520 avec sdcc, soucis de tableau?



  1. #1
    webshinra

    programation d'un pic 18F4520 avec sdcc, soucis de tableau?


    ------

    bonjour a toutes et a tous, je vient vous voir aprés de nombreuse recherche et donc en désespoir de cause.

    depuis quelque mois je me penche sur un projet de robot cartésien (j'avais d'ailleur fait un post a se sujet dans la section "Projets électroniques")
    toujours est il que pour le contrôlé, je comptait utilisé un microcontroleur pic 18f4520
    que je programmerais avec sdcc, mes premiers teste s'avérère concluant ( http://fr.youtube.com/watch?v=9JG7MIbUNzw pour ceux que ça intéresse )
    toujours est il que je suis rendu compte d'un comportement etrange de la part de sdcc en voulant m'amusé avec un afficheur lcd ( notamment parce que c'est plus simple pour deboguer avec la possibilité d'afficher des variable).
    c'est là que j'ai rencontré mes premiers soucis j'utilise une fonction simple pour afficher mes caracter (je pilote l'afficheur en 8 bits pour l'instant) elle mes les donne sur le port et envoie une impulsion sur la broche intéréssé. cela fonction sans aucun soucis tant que je n'essai pas de jouer avec les tableau de char dans un contexte dynamique, je m'explique est vais présenté différents teste auquel je me suis livré.

    dans un premier temps le teste de base:

    Code:
    int main(void) 
    {
    	initLcd();
    	for (i = 0; i < 3; i++)
    	{
    			DATA = 'y';             // on envoie y sur afficheur
    			enable=1;
    			delay10tcy(90);
    			enable=0;
    			delay10tcy(90);
    	}
    while(1);
    }
    affiche parfaitement "yyy".

    un second teste qui marche :
    Code:
    int main(void) 
    {
    	char chaine[6]; // Tableau de 6 char, j'ai tenté d'allouer le tableau avec le racourcis syntaxique, aucun changement.
    	int i;
    	chaine[0] = 'S';
    	chaine[1] = 'a';
    	chaine[2] = 'l';
    	chaine[3] = 'u';
    	chaine[4] = 't';
    	chaine[5] = '\0';
    	initLcd();
    	for (i = 0; i < 3; i++)
    	{
    			DATA = chaine[4];
    			enable=1;
    			delay10tcy(90);
    			enable=0;
    			delay10tcy(90);
    	}
    	while(1);
    }
    j'obtient bien "ttt"
    par contre, le teste qui ne marche pas est le suivant:
    Code:
    int main(void) 
    {
    	char chaine[6]; // Tableau de 6 char, j'ai tenté d'allouer le tableau avec le racourcis syntaxique, aucun changement.
    	int i;
    	chaine[0] = 'S';
    	chaine[1] = 'a';
    	chaine[2] = 'l';
    	chaine[3] = 'u';
    	chaine[4] = 't';
    	chaine[5] = '\0';
    	initLcd();
    	for (i = 0; i < 3; i++)
    	{
    			DATA = chaine[i];             
    			enable=1;
    			delay10tcy(90);
    			enable=0;
    			delay10tcy(90);
    	}
    	while(1);
    }
    ici obtient 3 fois caractère aléatoire(le même : dépendant du programme tapé avant et de la position de la stack).
    je pense qu'il s'agit d'une erreur de ma part, peut etre dans la configuration? (même si j'ai essayer de changé les seuls chose qui me parraissé pouvoir avoir une influence)

    voila, j'ai essayer de mettre tout les elements que j'ai, si vous pensé a d'autre testes dite le moi, je m'y livrerais volontiers.

    PS: j'ai testé avec différentes version ( la 2.6,2.7,2.8, snapshoot) et demandé a un ami de compilé chez lui et de m'envoiller le .hex, avec le même résultat.

    -----

  2. Publicité
  3. #2
    lolomatic

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    Salut !

    Avec un programme clair et simple comme celui-ci, il m'est impossible de voir ce qui peut poser un problème.

    Ta routine d'affichage s'exécute sur interruption ?

    Je suis tenté de croire immédiatement à un problème de gestion de pile !
    Comment la configures-tu ?

    Combien d'appels de fonctions imbriqués fais-tu ?
    Même logicielle, la gestion pile n'épargne aucun dépassement, et il faut savoir que tes variables locales "consomment" de l'espace de ta pile...

    A+

  4. #3
    webshinra

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    hum, suit a ce que tu m'a dit, j'ai fait différents teste sur ma pile, et le reste (peut etre ai-je raté ça, je vais donné toutes les informations possible)
    Code:
    #define __P18F4520//sdcc -mpic16 -p18f4520  "%f"
    #include <pic18fregs.h>
    #include <pic18f4520.h>
    #include <delay.h>
    //#include <adc.h>
    //#include <ctype.h>
    //#include <malloc.h>
    //#include <math.h>
    //#include <limits.h>
    
    //  __CONFIG :
    code char at __CONFIG1H _conf0 = _OSC_INTIO67_1H;
    code char at __CONFIG2L _conf1 = _PWRT_ON_2L;
    code char at __CONFIG2H _conf2 = _WDT_OFF_2H;
    code char at __CONFIG3H _conf3 = _MCLRE_ON_3H & _PBADEN_OFF_3H;
    code char at __CONFIG4L _conf4 = _LVP_OFF_4L & _STVREN_ON_4L;
    code char at __CONFIG5L _conf5 = _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L;
    code char at __CONFIG5H _conf6 = _CPD_OFF_5H & _CPB_OFF_5H;
    code char at __CONFIG6L _conf7 = _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L;
    code char at __CONFIG6H _conf8 = _WRTD_OFF_6H & _WRTB_OFF_6H & _WRTC_OFF_6H;
    code char at __CONFIG7L _conf9 = _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L;
    code char at __CONFIG7H _conf10 = _EBTRB_OFF_7H;
    
    
    #define DATA			LATB
    #define RS  			LATDbits.LATD3
    #define enable		LATDbits.LATD2
    #pragma stack 0x0500 0x00ff
    void wait(void)
    {
    	delay1ktcy(100);
    }
    
    void initLcd(void)
    {
    	TRISB=0;           // port B en sortie
    	LATB=0;
    	TRISDbits.TRISD3=0;   // RC5 = Register select
    	TRISDbits.TRISD2=0;   // RC4 = enable de l'afficheur
    	RS=0;                 // sélectionner le mode instructions
    	LATB=0x38;           // instruction function set, DL=1, N=1, F=0
    	set_enable();
    	LATB=0x0C;           // instruction display on/off, D=1
    	set_enable();
    	LATB=0x06;           // instruction shift mode, I/D=1
    	set_enable();
    	LATB=0x01;           // instruction clear display
    	set_enable();
    	RS=1;
    }
    int main (void)
    {
    	char i;
    	char* chaine = "salut"; // Tableau de 6 char, j'ai tenté d'allouer le tableau avec le racourcis syntaxique, aucun changement.
    	initLcd();	
    	for (i = 0; i < 3; i++)
    	{
    			DATA = chaine[3];             
    			enable=1;
    			delay10tcy(90);
    			enable=0;
    			delay10tcy(90);
    	}
    	for (i = 0; i < 3; i++)
    	{
    			DATA = chaine[i];             
    			enable=1;
    			delay10tcy(90);
    			enable=0;
    			delay10tcy(90);
    	}	
    	for (i = 0; i < 4; i++)
    	{
    			DATA = chaine[3];             
    			enable=1;
    			delay10tcy(90);
    			enable=0;
    			delay10tcy(90);
    	}
    	while(1);
    }
    donc se code, qui compile, affiche le resultat suivant:
    "uuu%%%uu" (ou % est un caractère qui change).

    le code utilisé pour ma stack n'est peu etre pas le bon, et ma configurations peut etre mauvaise. : (

    merci pour votre aide en tout cas

    ps: un teste que j'ai fait en déclarant ma variable chaine comme etant globale a encore moins marché, j'avais le résultat (le code, mise a part la dernière boucle etais identique): "######" j'ai beacoup de mal a comprendre ou il veut en venir

  5. #4
    Seb.26

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    Vraiment étrange ton truc !!!

    Quelques idées en vrac :

    > Que donne :

    Code:
    DATA = chaine[0];             
    enable=1;
    delay10tcy(90);
    enable=0;
    delay10tcy(90);
    //
    DATA = chaine[1];             
    enable=1;
    delay10tcy(90);
    enable=0;
    delay10tcy(90);
    //
    DATA = chaine[2];             
    enable=1;
    delay10tcy(90);
    enable=0;
    delay10tcy(90);


    > Tu peux aussi essayer au début de ton code de placer un pattern de quelques octets ( 16 ou 32 ) en haut de ta pile, et de vérifier en fin de programme s'ils sont toujours là ... s'ils ne le sont plus, ta pile est trop petite ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  6. A voir en vidéo sur Futura
  7. #5
    Seb.26

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    PS: Tu t'es pas planté dans :

    donc se code, qui compile, affiche le resultat suivant:
    "uuu%%%uu" (ou % est un caractère qui change).
    Avec un for( ;4; ), tu devrais avoir "uuu???uuuu" ...

    Tu as essayé avec un fichier de link plutôt que des #pragma pour ta stack ?

    genre :

    Code:
    LIBPATH .
    
    FILES c018i.o
    FILES clib.lib
    FILES p18f4550.lib
    
    CODEPAGE   NAME=vectors    START=0x0            END=0x29           	PROTECTED
    CODEPAGE   NAME=page       START=0x2A           END=0x7DBF
    CODEPAGE   NAME=debug      START=0x7DC0         END=0x7FFF         	PROTECTED
    CODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       	PROTECTED
    CODEPAGE   NAME=config     START=0x300000       END=0x30000D      	PROTECTED
    CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF      	PROTECTED
    CODEPAGE   NAME=eedata     START=0xF00000       END=0xF000FF       	PROTECTED
    
    ACCESSBANK NAME=accessram  START=0x0            END=0x5F
    DATABANK   NAME=stack      START=0x60         	END=0xFF			PROTECTED
    DATABANK   NAME=big1	   START=0x100          END=0x3F3
    DATABANK   NAME=dbgspr     START=0x3F4          END=0x3FF			PROTECTED
    DATABANK   NAME=big2       START=0x400          END=0x7FF
    ACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF          	PROTECTED
    
    SECTION    NAME=CONFIG     ROM=config
    
    STACK SIZE=0xA0 RAM=stack
    Dernière modification par Seb.26 ; 03/07/2008 à 12h46.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  8. #6
    webshinra

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    [Avec un for( ;4; ), tu devrais avoir "uuu???uuuu" ...
    oui, c'est pour ça que je le précisé, ça marche pas (justement quand je change la valeur ça change pas[c'est pour ça qu'il y a un quatre, j'ai essayer de l'augmenté depuis trois pour voir)

    ensuite, comme prévisible, le code que tu donne affiche"sal".
    j'ai tenté de modifier le fichier lkr, meme resultat, j'avoue que j'ai un peu de difficulté a comprendre; je vais tenté de fait ça avec la version d'essais d'un programe privateur pas beau[si j'en trouve un correcte], afin d'etre sur que se n'est pas la faute de mon microcontroleur (meme si je l'ai essayer sur plusieur exemplaire du meme model).

  9. Publicité
  10. #7
    Seb.26

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    Et avec ça :

    Code:
    const rom char myString[] = "Hello world !";
    
    ...
    
    DATA = myString[0];
    
    ...


    PS: Tu as des interruptions qui tournent, ou rien d'autre que ce que l'on voit dans ton post ???
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #8
    webshinra

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    rien d'autre que se que l'on vois dans mon post, par contre, le mot clef rom chie
    j'ai essayer en la mettant uniquement en constante , ça ne marche pas plus :/

  12. #9
    lolomatic

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    Ton programme étant simple, peux-tu poster le fichier assembleur (.asm) généré ?

  13. #10
    webshinra

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    bien sur, comme il est assez gros je le poste ici:
    http://webshinra.free.fr/gnu/array.asm
    et une version avec coloration la: http://phpfi.com/328980

    encore merci pour le temps que vous me consacrez.

  14. #11
    lolomatic

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    Bien vu le code avec la coloration syntaxique !

    Bon, après une rapide lecture, je crois avoir repéré quelquechose :

    Code:
    MOVFF	r0x01, FSR0L
    MOVFF	r0x02, PRODL
    MOVF	r0x03, W
    CALL	__gptrget1
    MOVWF	_LATB
    Juste avant, il y a une sorte de calcul de pointeur que j'assimilerais bien à celui de l'indice "i" de ta boucle for.
    Mais ce qui m'intéresse sont ces lignes, ci-dessus !

    Il y a un appel à une fonction interne "__gptrget1", soit...
    Mais je remarque que seul FSR0L est utilisé, ce qui me fait demander si tu n'utilises pas le modèle de pile "SMALL" dans un cas où le modèle "LARGE" est préférable !?
    http://sdcc.sourceforge.net/doc/sdcc...l/node128.html

    Ce que tu peux essayer d'autre, c'est d'utiliser un autre type que le "int" pour ta variable "i" (d'ailleurs déconseillé sur cette architecture !...)

    Essaie donc avec un unsigned char dans un premier temps, et si tu peux, utilise un modèle "LARGE" ( --pstack-model)...

    Tiens nous au courant,
    Bon courage

    A+

  15. #12
    webshinra

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    alors alors, j'ai relut attentivement la documentations sdcc, et les int ne sont pas recommandé sur les architecture pic-14, mais, dans le cas du code asm, j'ai vérifier, et je l'avais remplacer par un char.

    donc, pour se qui est des testes, j'ai regardé ceux que vous m'avez recommandé (donc avec le modeles de stack large) et j'ai tenté (les deux en même temps et séparément) de rajouté une directive pour le placement du code et de la memoire:
    --code-loc 0x6000 --xram-loc 0xB000

    sans plus d'effet, j'ai aussi tésté les diferentes possibilité opur "allouer" le string en memoire, mais comme je l'ai constaté, ça ne marche pas, pensez vous que je devrais reporté ça sur leur mailling list?

  16. Publicité
  17. #13
    lolomatic

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    Je pense qu'en effet, un post sur la mailing list s'impose !
    Avant, essaie de replacer ta routine InitLCD() par une initialisation d'USART et remplace l'écriture dans LATB par TXREG pour voir si sur le port série tu obtiens la même chose !
    A+

  18. #14
    webshinra

    Re : programation d'un pic 18F4520 avec sdcc, soucis de tableau?

    alors alors, aprés mainte périgrinations et un post a la mailing list, je n'ai pas avancé, ceux-ci (peut etre a cause de mon mauvais anglais) me prennant plus ou moins pour un cretin, est-ce qu'il serais possible généreusement que l'un d'entre vous me fournisse un fichier hex (et a la limite le code C correspondant que je puisse compilé moi meme et voir si j'ai le meme resultat) qui envois hello world ou n'importe quoi d'ailleur ) en boucle afin que je puisse tésté?
    (il faut tenir compte du fait que je n'utilise pas de quartz externe)

    je vous en serais vraiment reconnaissant.

Discussions similaires

  1. memoire flash du PIC 18f4520
    Par Seraph-01 dans le forum Électronique
    Réponses: 2
    Dernier message: 24/06/2008, 11h13
  2. Conversion analogique-numerique pic 18f4520
    Par Mkv dans le forum Électronique
    Réponses: 1
    Dernier message: 17/05/2008, 22h29
  3. Conversion A/D PIC 18F4520
    Par Mkv dans le forum Électronique
    Réponses: 0
    Dernier message: 14/05/2008, 17h23
  4. Réponses: 2
    Dernier message: 14/09/2007, 18h07
  5. Programation d'un pic 16F84
    Par dans le forum Électronique
    Réponses: 3
    Dernier message: 07/03/2003, 19h22
Découvrez nos comparatifs produits sur l'informatique et les technologies.