1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.

Pic 18F - du code asm dans programme C

Discussion dans 'Electronique spécifique CNC' créé par Lnx2051, 6 Janvier 2012.

  1. Lnx2051

    Lnx2051 Apprenti

    Messages:
    208
    Inscrit:
    2 Août 2010
    Localité:
    Lyon
    Pic 18F - du code asm dans programme C
    bonjour

    j'essaye d' insérer du code asm dans un programme C18 pour pic 18F, j'ai quelques soucis ...

    Code:
    //    Delay = 3 seconds ; Clock frequency = 20 MHz  ; Actual delay = 3 seconds = 15000000 cycles ;	Error = 0 %
    void delay_ (void)
    {
    _asm
    
    Delay
    		//14999990 cycles
    	movlw	0x87
    	movwf	d1
    	movlw	0xB3
    	movwf	d2
    	movlw	0x21
    	movwf	d3
    Delay_0
    	decfsz	d1, f
    	goto	$+2
    	decfsz	d2, f
    	goto	$+2
    	decfsz	d3, f
    	goto	Delay_0
    
    		//6 cycles
    	goto	$+1
    	goto	$+1
    	goto	$+1
    
    		//4 cycles (including call)
    	return
    _endasm
    }
    

    a compiler ça râle dur :
    370:Error: syntax error ( ligne Delay )

    m'en sort pas bien, est ce que kk1 a déjà fait ?
    apparemment il faut déclarer l'assembleur dans un fichier tiers ... on ne peut pas l’insérer dans le programme C directement comme ça ?? :cry:

    Cdlt
    Ln
     
  2. Zaphreux

    Zaphreux Nouveau

    Messages:
    30
    Inscrit:
    25 Juillet 2011
    Localité:
    Près de Montpellier
    Pic 18F - du code asm dans programme C
    Bonsoir

    S'il faut juste attendre un certain nombre de cycles, il suffit que tu utilises les fonctions styles Delay10KTCYx qui sont définis dans le fichier delays.h du C18

    Cordialement
     
  3. speedjf37

    speedjf37 Compagnon

    Messages:
    987
    Inscrit:
    15 Octobre 2009
    Localité:
    indre et loire
    Pic 18F - du code asm dans programme C
    Bonsoir,

    exemple:
    un pti ajout asm dans du "C" pour 18f4620
    // workaround bug interrupt

    _asm
    call bidon,0x01
    bidon:
    pop
    // nop
    _endasm

    L'étiquette bidon est suivie de ':'
    ne pas oublier la fin "_endasm"
     
  4. Lnx2051

    Lnx2051 Apprenti

    Messages:
    208
    Inscrit:
    2 Août 2010
    Localité:
    Lyon
    Pic 18F - du code asm dans programme C
    hello speedjf37 :)

    j'ai relus le 3.2.5.1 du compilo C18, pas vu l'histoire des ":" mais ça compile now ^^
    j' échange un soucis contre un autre du coup, le Goto ne semble pas lui plaire, pourtant c une fonction assembleur ..


    @Zaphreux: tu sais, je me méfie des biblio du compilateur C18, j'ai déjà perdu un temps énorme avec des bibliothèque pourrave, notamment le OpenSpi ... prefere tout paramétrer et faire ma propre bibli de fonction ^^


    Cdlt
    Ln
     
  5. jcma

    jcma Compagnon

    Messages:
    1 658
    Inscrit:
    2 Novembre 2008
    Localité:
    Mulhouse - Haut-Rhin
    Pic 18F - du code asm dans programme C
    Bonsoir,

    Non, les goto c'est du C (On les place d'ailleurs hors des accolades), pour l'assembleur, c'est jmp.

    EDIT:
    Apparement ton compilateur accepte les goto à la place du jmp, ta syntaxe devrais marcher.

    @+
    Jean-Charles
     
  6. Lnx2051

    Lnx2051 Apprenti

    Messages:
    208
    Inscrit:
    2 Août 2010
    Localité:
    Lyon
    Pic 18F - du code asm dans programme C
    hello,

    oui, effectivement il le digere le goto :smt002
    c'est le $+2 qu'il ne veut pas alors que c'est dans la doc de MPASM. on s'y perd.
    il ne veux pas non plus du return

    c'est comme si le compilateur se foutait du _asm et mélangeait les 2 languages allegrement ...
    Je me demande si on peut insérer du vrai code asm ou si on peut seulement y mettre un ptit bout pour faire bipbip ... en tous cas j'y arrive pas :oops:

    pourtant le ptit bout de programme de speedjf37 compile bien :oops:

    Code:
    
    _asm
    call bidon,0x01
    bidon:
    pop
    // nop
    _endasm
    
    
    cdlt
    Ln
     
  7. jcma

    jcma Compagnon

    Messages:
    1 658
    Inscrit:
    2 Novembre 2008
    Localité:
    Mulhouse - Haut-Rhin
    Pic 18F - du code asm dans programme C
    Bonjour,

    Je n'avais réagit qu'il s'agissait d'un PIC18.
    Pour un PIC18, la longueur des instructions est differente de celle d'un PIC16. Tes goto $+2 sont à changer en $+4. Le calcul du delai est aussi a reprendre, certaines instruction ne mettent pas le même temps a s'executer que sur le PIC16 (Nombre de cycles d'execution differents).

    @+
    Jean-Charles
     
  8. Lnx2051

    Lnx2051 Apprenti

    Messages:
    208
    Inscrit:
    2 Août 2010
    Localité:
    Lyon
    Pic 18F - du code asm dans programme C
    il a l'air mal embouché le Compilo :

    Code:
    void delay_ (void)
    {
    _asm
    Delay_:
    	movlw	0x87
    	movwf	d1
    	movlw	0xB3
    	movwf	d2
    	movlw	0x21
    	movwf	d3
    Delay__0:
    	decfsz	d1, f
            goto	$+4
    	decfsz	d2, f
    	goto	$+4
    	decfsz	d3, f
    	goto	Delay__0
    
    			;6 cycles
    	goto	$+1
    	goto	$+1
    	goto	$+1
    
    			;4 cycles (including call)
    	return
    _endasm

    Tx.c:373:Error: syntax error -> Goto $+4
    malheureusement ...
    sans compter le return qu'il rejette aussi et les declaration de variables qu'il vômit egalement ... :cry:



    on peut aussi inclure de l 'asm contenu dans un autre fichier, ça doit mieux fonctionner puisque les routines delay en C18 fonctionnent comme ça .. .... kk1 a deja fait ?
     
  9. pierrepmx

    pierrepmx Compagnon

    Messages:
    3 618
    Inscrit:
    24 Septembre 2010
    Localité:
    Alpes & Drôme
    Pic 18F - du code asm dans programme C
    Salut,

    je ne peux rien dire de ce compilo particulier, mais dans le principe, la syntaxe du code d'assemblage "inline", qui est traité par le préprocesseur et le compilateur "C", peut très bien être simplifié et légèrement différente de celle d'un fichier purement assembleur, qui lui est traité par un autre programme, le macro-assembleur.
    A voir dans la doc du C18...
     
  10. Lnx2051

    Lnx2051 Apprenti

    Messages:
    208
    Inscrit:
    2 Août 2010
    Localité:
    Lyon
    Pic 18F - du code asm dans programme C
    hello Pierre,
    La doc C18 dit :

    2.8.2 Inline Assembly
    MPLAB C18 provides an internal assembler using a syntax similar to the MPASM
    assembler.



    • apparemment il est différent du code assembleur "normal" ...

    It is generally recommended to limit the use of inline assembly to a minimum. Any functions containing inline assembly will not be optimized by the compiler. To write large
    fragments of assembly code, use the MPASM assembler and link the modules to the C modules using the MPLINK linker.


    • lol, ça veut tout dire ... je vais regarder comment on fait pour utiliser un fichier .asm et le linker

    cdlt
    Ln
     
  11. speedjf37

    speedjf37 Compagnon

    Messages:
    987
    Inscrit:
    15 Octobre 2009
    Localité:
    indre et loire
    Pic 18F - du code asm dans programme C
    Bonjour,

    Le bout de code mis en asm dans le 'C' est correctement assemblé dans un fichier asm .
    Les commentaires dans le fichier 'C' ne peuvent être délimités par ';' comme en assembleur

    Effectivement l'assemblage en ligne est limité .
    Il est utilisé pour des traitements non réalisables en 'C' pour raison de rapidité ou correction de bug(ajustement de registres).

    Les goto $ sont souvent générés par des compilateurs à partir de boucle while ou for.
    En assembleur il est préférable de mettre des étiquettes pour rendre le code plus lisible
     
Chargement...

Partager cette page