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

Débuter l'ASM avec un atmega8535.



  1. #1
    culte

    Débuter l'ASM avec un atmega8535.

    Bonjour à tous.

    Je programme en c sans trop de difficulté un atmage8535 à l'aide de kontrollerLab sous linux.
    Je voudrai programmer ce uC en assembleur. Pour ceci, j'ai cherché sur le net mais je n'ai pas trouvé grand chose de satisfaisant.

    Je ne sais pas par ou commencer .

    J'utilise avr-gcc indirectement avec kontrollerLab, j'ai donc eu l'idée de convertir mon .c en .s.

    main.c
    #include <avr/io.h>

    int main(void)
    {
    DDRB = 0xff;

    while(1)
    {
    PORTB = 0x01;
    PORTB = 0x00;
    }

    return 0;
    }
    main.s
    .file "main.c"
    __SREG__ = 0x3f
    __SP_H__ = 0x3e
    __SP_L__ = 0x3d
    __CCP__ = 0x34
    __tmp_reg__ = 0
    __zero_reg__ = 1
    .global __do_copy_data
    .global __do_clear_bss
    .text
    .global main
    .type main, @function
    main:
    push r29
    push r28
    in r28,__SP_L__
    in r29,__SP_H__
    /* prologue: function */
    /* frame size = 0 */
    ldi r30,lo8(55)
    ldi r31,hi8(55)
    ldi r24,lo8(-1)
    st Z,r24
    .L2:
    ldi r30,lo8(56)
    ldi r31,hi8(56)
    ldi r24,lo8(1)
    st Z,r24
    ldi r30,lo8(56)
    ldi r31,hi8(56)
    st Z,__zero_reg__
    rjmp .L2
    .size main, .-main
    Sauf que je ne comprends pas grand chose au code ASM.
    Si vous avez un lien ou autre chose qui pourrait m'aider je vous en serai très reconnaissant de m'en faire part.

    merci.

    -----

    Je préfère aider (quand je peux ^^ ), que me faire aider :) .

  2. Publicité
  3. #2
    vede

    Re : Débuter l'ASM avec un atmega8535.

    bonjour,

    il n'y a pas la liste des instructions assembleur disponibles,
    et leurs descriptions, dans le datasheet du atmage8535 ?
    comme dans le datasheet de tout pic...

    vede
    ;O]

  4. #3
    vede

    Re : Débuter l'ASM avec un atmega8535.

    re,

    c'est bien ce que je pensais...
    tu as la liste des instructions et une description de leurs fonctions,
    à la fin du datasheet, page 301, dans "Instruction Set Summary"...

    vede
    ;O]

  5. #4
    culte

    Re : Débuter l'ASM avec un atmega8535.

    Merci de ta réponse vede mais j'avais bien remarqué la liste des instructions.

    J'aurais, plus voulu avoir un cours sur la syntaxe du langage et aussi ce qui est propre au uC.

    Merci.
    Je préfère aider (quand je peux ^^ ), que me faire aider :) .

  6. #5
    vede

    Re : Débuter l'ASM avec un atmega8535.

    hi,

    ben là, ce qu'on voit dans le source .asm issu du .c,
    c'est que le compilateur C utilise un adressage mémoire
    spécifique (c'est normal)... il faut voir au niveau du fichier .lst,
    normallement généré, pour voir les correspondances mémoires
    des "variables" r29,30,31... pour commencer à comprendre...

    mais peut-etre je dis une connerie...
    je connais pas les Atmega...

    vede
    ;O]

    ps: la syntaxe...c'est les instructions...et elles sont
    "propres" à ton uc...cad: ce sont les seules supportées
    par ton uc...
    l'idéal en assembleur, serait de partir d'un code/exemple tout en assembleur (exemple clignoter une led) plutot que depuis un code .asm venant d'une compilation en c...

  7. A voir en vidéo sur Futura
  8. #6
    vede

    Re : Débuter l'ASM avec un atmega8535.

    rere

    les lignes
    push r28
    push r29

    c'est clair, ça sauvegarde dans
    la pile 2 variables ou états de registres...

    aprés
    in r28,__SP_L__
    ça met
    __SP_L__ dans r28 ???
    ou l'inverse??
    r28 dans __SP_L__
    et oui, je ne connais pas l'asm. Atmega...

    vede
    ;O]

  9. Publicité
  10. #7
    vede

    Re : Débuter l'ASM avec un atmega8535.

    re

    et c'est vrai que ça parait ardu de
    trouver des exemples en assembleur
    pour ce uControleur...

    peut-être des infos sur un forum dédié...
    à cette gamme...

    vede
    ;O]

    asm c'est procédural...les instructions
    s'executent les unes aprés les autres...
    aprés tu peux faire des sauts (jnz,jne, je, jz, jump, call...)...
    vers des adresses ou label...et c'est tout...

    sur un pic, on peut par exemple obliger
    le compilo à écrire le code à une certaine
    adresse, dans la mémoire programme du
    pic avec, org adresse :
    asm
    org 0x0F
    nop
    nop
    nop
    end

    aprés, dans la mémoire programme du pic,
    à l'adresse 0x0F, il y aura les instuctions:
    nop
    nop
    nop
    (instructions qui "attendent" 3 cycles)...
    Dernière modification par vede ; 23/08/2009 à 01h28.

  11. #8
    indri

    Re : Débuter l'ASM avec un atmega8535.

    Citation Envoyé par vede Voir le message

    in r28,__SP_L__
    ça met
    __SP_L__ dans r28 ???



    Sinon pour le code en asm, il te faut d'abords charger le fichier de ton µC pour que le compilateur reconnaisse les instructions, le nom de registres, etc. C'est des fichiers .def que tu dois normalement trouver dans les dossiers d'install de ton compilateur (ca dépend peux-être du compilateur, dans avrstudio il le faut en tout cas )

    Code:
    .include "m8535.def" ;pas sur du nom, a vérifier
    Les premières adresses de ton programme sont réservés au interruptions,(cfr datasheet) tu peux rien écrire dessus, sauf des appel de procédure.

    A l'adresse 00 t'appelle ton main: (tu l'appelles comme tu veux en fait )

    Code:
    rjmp main
    tu peux commencer ton programme à une adresse spécifique en utilsant le fonction .org puis l'adresse. Pour pas taper ton programme dans les adresse d'interruption.

    Puis tu commence...

    Tu peux pas charger directemment les registres spécifiques (ddrb,portb,etc.) tu dois passer par les registres intermédiares (r0,r32), (chez les Atmega 48 je sais que tu peux pas charger directemment le 16 premiers registres..., faut voir pour le 8535)

    Tu dois aussi charger les stack pointers si tu veux faire appel à des procédures. Elle est tout faite dans les datasheet:

    Code:
     
    ldi r16,high(RAMEND) ; Main program start
     out SPH,r16 ; Set Stack Pointer to top of RAM
     ldi r16,low(RAMEND)
    out SPL,r16
    De même pour charger les autres registres tu passes par la fonction ldi (charge un registre avec une valeur immédiate)

    Code:
    ldi r16,$FF  ;met le registre à FF , $ pour héxa, 0x ca marche aussi ;)
    out ddrb,r16  ;place la valeur de r16 dans ddrb
    
    LA: ;label pour lancer le programme en boucle
    
    ldi r16,$01
    out PORTB,r16
    clr r16 ;clear r16
    nop ; ne rien faire (je sais pas si c'est utile lol)
    rjmp LA ; retourne au label
    
    ret ;fin de la procédure.
    Ce qui te donne:
    Code:
    .include "m8535.def"
    rjmp main
    .org $20
    
    main:
    ldi r16,high(RAMEND) ; Main program start
     out SPH,r16 ; Set Stack Pointer to top of RAM
     ldi r16,low(RAMEND)
    out SPL,r16
    
    LA: ;label pour lancer le programme en boucle
    
    ldi r16,$01
    out PORTB,r16
    clr r16 ;clear r16
    nop ; ne rien faire (je sais pas si c'est utile lol)
    rjmp LA ; retourne au label
    
    ret ;fin de la procédure.
    Pour faire le même programme que celui que t'as mis en C....
    J'éspère que j'ai pas dit de bétise

  12. #9
    indri

    Re : Débuter l'ASM avec un atmega8535.

    Par contre, si c'est pour faire clignotter une led, ca risque d'êter très rapide

  13. #10
    culte

    Re : Débuter l'ASM avec un atmega8535.

    re bonjour.

    Pour tout vous dire j'avais déjà posté ici.

    Ceci dit, merci à tous les deux de m'aider. La description des lignes du fichier asm, va mettre fort utile dans mes débuts.

    Voila ce que j'ai fait :
    - J'ai réalisé d'autre recherche et j'ai trouvé ceci (Cliquez sur " Mes Liens" et les documents intéressant sont en bas de page.).
    - J'ai trouvé un assembleur pour linux, avra.

    J'aimerais déjà, dans un premier temps, pour voir si tout fonctionne, assembler un code minimal.

    J'ai donc repris le code donné par indri.
    Code:
    .include "m8535.def"
    rjmp main
    .org $20
    
    main:
    ldi r16,high(RAMEND) ; Main program start
     out SPH,r16 ; Set Stack Pointer to top of RAM
     ldi r16,low(RAMEND)
    out SPL,r16
    
    LA: ;label pour lancer le programme en boucle
    
    ldi r16,$01
    out PORTB,r16
    clr r16 ;clear r16
    nop ; ne rien faire (je sais pas si c'est utile lol)
    rjmp LA ; retourne au label
    
    ret ;fin de la procédure.
    Je sais, qu'il faut remplacer la ligne .include "m8535.def" par .include "m8535def.inc".
    Lors de l'assemblage avec avra, celui ci me trouve des erreurs dans le fichier inc.
    Erreurs renvoyées par avra:
    Code:
    Pass 1...
    m8535def.inc(40) : Error   : Unknown mnemonic/macro: #ifndef
    m8535def.inc(41) : Error   : Unknown mnemonic/macro: #define
    m8535def.inc(44) : Error   : Unknown mnemonic/macro: #pragma
    m8535def.inc(47) : Error   : Unknown device: ATmega8535
    m8535def.inc(48) : Error   : Unknown mnemonic/macro: #pragma
    m8535def.inc(53) : Error   : Unknown mnemonic/macro: #pragma
    m8535def.inc(145) : Error   : Line to long
    m8535def.inc: Success
    Warning : No .DEVICE definition found. Cannot make useful address range check !
    Je ne sais absolument pas ce que je dois faire pour que ça fonctionne.

    Par contre, si c'est pour faire clignotter une led, ca risque d'êter très rapide
    lol. C'est pour visualiser sur un oscilloscope, sinon faut avoir de bons yeux.

    Merci de m'aider.
    Je préfère aider (quand je peux ^^ ), que me faire aider :) .

  14. #11
    culte

    Re : Débuter l'ASM avec un atmega8535.

    Il n'y a personne pour m'aider ?

    Bon sinon, j'ai trouvé que l'assembleur de avr-gcc est avr-as.
    J'ai testé deux trois trucs avec avr-as, mais rien de satisfaisant.

    Et vous, vous utilisez quel assembleur et ou avez vous appris le langage ?

    Merci.
    Je préfère aider (quand je peux ^^ ), que me faire aider :) .

  15. #12
    indri

    Re : Débuter l'ASM avec un atmega8535.

    Personnellement j'utilise AVR Studio qu'est vraiment bien fait. Tes erreurs, je sais pas trop t'aider.
    Et moi j'ai appris ce langage à l'école

  16. Publicité

Sur le même thème :

Discussions similaires

  1. [C++]Débuter avec cURL
    Par ProgVal dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 19/08/2009, 19h05
  2. UART avec ATMEGA8535
    Par jojo_lapin dans le forum Électronique
    Réponses: 3
    Dernier message: 29/07/2008, 00h25
  3. atmega8535 programmant atmega8535
    Par thomasalbert1993 dans le forum Électronique
    Réponses: 12
    Dernier message: 29/01/2008, 20h19
  4. nettoyage de l'ASM
    Par celinef55 dans le forum Secourisme spécial Croix-Rouge
    Réponses: 1
    Dernier message: 10/04/2006, 22h51