Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programmation Atmel (samc21)

    20 septembre 2016 à 14:36:34

    Bonjour,

    Je dois programmer pour la première fois un microcontrôleur atmel samc21e pour générer, entre autre, 6 signaux PWM avec des temps morts.

    J'ai l'impression qu'il y a une énorme différence entre microchip et atmel, je n'arrive meme pas à configurer mes pins entrées/sorties.

    Je possède la carte xplained pro samc21 ainsi que le logiciel atmelstudio mais aucun des programmes proposés ne me permet de générer mes signaux..

    Quelqu'un aurait un cours bien expliqué sur le fonctionnement et les méthodes de programmation des atmel? un exemple de code autre que ceux que l'on trouve sur le site d'atmel, ou meme quelques conseils?

    Merci d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2016 à 22:49:03

      Je dirais que pour commencer, il faut que tu te plonges dans la datasheet. http://www.rowleydownload.co.uk/arm/packages/targets/SAM_C/CMSIS/Documents/Atmel-42365-SAMC21_Datasheet.pdf

      Normalement il faut configurer tes registres, tu n'as même pas besoin d'interruptions normalement. :)

      Essaye de voir sur le net si tu trouves des codes concernant les PWM, sur d'autres AVR, ça devrait être facile à adapter.

      Poste ce que tu as fait, histoire de voir. :)

      Si tu as vraiment des soucis, le mieux c'est de poster sur le forum officiel avr freaks. ;)

      • Partager sur Facebook
      • Partager sur Twitter
        21 septembre 2016 à 17:07:15

        Hello,

        D'abord merci pour ta réponse et pour ton temps!

        Du coup j'ai trouvé un exemple de code pour un autre µc mais avec le meme Coeur ARM et ca donne le code qui suit (init_pwm et main).

        Et de la page 447 à 450 de la datasheet, ils donnent les adresse à utiliser pour mettre une pin en entrée ou en sortie.

        C'est en mettant # define DIR[31:0]=1 que je peux mettre ma pin en mode output à ton avis?

        Ils disent en gros que des pins PA00 à PA31, l'adresse est 0x00. Et pour PB00 à PB31, c'est 0x80.

        donc si je veux modifier ma pin PA12 je dois utiliser l'adresse 0x1100 ? C'est incorrect non?

        init_pwm.c :

        #define TC1_CCR ((volatile unsigned int *) 0xFFFE0040)

        #define TC1_CMR ((volatile unsigned int *) 0xFFFE0044)

        #define TC1_RA ((volatile unsigned int *) 0xFFFE0054)

        #define TC1_RB ((volatile unsigned int *) 0xFFFE0058)

        #define TC1_RC ((volatile unsigned int *) 0xFFFE005C)

        #define PIO_PDR ((volatile unsigned int *) 0xFFFF0004)

        //* TC_CMR: Timer Counter Channel Mode Register Bits Definition

        #define TC_CLKS_MCK20x0

        #define TC_EEVT_XC0 0x400

        #define TC_CPCTRG 0x4000

        #define TC_WAVE 0x8000

        #define TC_ACPA_TOGGLE_OUTPUT 0x30000

        #define TC_ACPC_TOGGLE_OUTPUT 0xC0000

        #define TC_ASWTRG_SET_OUTPUT 0x400000

        #define TC_BCPB_TOGGLE_OUTPUT 0x3000000

        #define TC_BCPC_TOGGLE_OUTPUT 0xC000000

        #define TC_BSWTRG_SET_OUTPUT 0x40000000

        //* TC_CCR: Timer Counter Control Register Bits Definition

        #define TC_CLKEN 0x1

        #define TC_CLKDIS 0x2

        #define TC_SWTRG 0x4

        //* PIO Controller

        #define PIOTIOA1 4 /* Timer 1 Signal A */

        #define PIOTIOB1 5 /* Timer 1 Signal B */

        main.c :

        int main ( void )

        //* Begin

        {

        *TC1_CCR = TC_CLKDIS ; /* Disable the Clock Counter */

        *PIO_PDR = (1<<PIOTIOA1) | (1<<PIOTIOB1) ; /* Define TIOA1 and TIOB1 as peripheral */

        //* Timer/Counter 1 mode configuration

        *TC1_CMR =

        TC_BSWTRG_SET_OUTPUT | /* BSWTRG : software trigger set TIOB */

        TC_BCPC_TOGGLE_OUTPUT | /* BCPC : Register C compare toggle TIOB */

        TC_BCPB_TOGGLE_OUTPUT | /* BCPB : Register B compare toggle TIOB */

        TC_ASWTRG_SET_OUTPUT | /* ASWTRG : software trigger set TIOA */

        TC_ACPC_TOGGLE_OUTPUT | /* ACPC : Register C compare toggle TIOA */

        TC_ACPA_TOGGLE_OUTPUT | /* ACPA : Register A compare toggle TIOA */

        TC_WAVE | /* WAVE : Waveform mode */

        TC_CPCTRG | /* CPCTRG : Register C compare trigger enable */

        TC_EEVT_XC0 | /* EEVT : XC0 as external event (TIOB=output) */

        TC_CLKS_MCK2 ; /* TCCLKS : MCK / 2 */

        //* Compare registers initialization

        *TC1_RC = 0x80E8 ; /* 1kHz PWM generation */

        *TC1_RB = 0x4074 ; /* 30% duty cycle on TIOB1 */

        *TC1_RA = 0x26AC ; /* 50% duty cycle on TIOA1 */

        *TC1_CCR = TC_CLKEN ; /* Enable the Clock counter */

        *TC1_CCR = TC_SWTRG ; /* Trig the timer */

        for (;;)

        {

        }//* End for

        return(0) ;

        }//*End

        • Partager sur Facebook
        • Partager sur Twitter
          21 septembre 2016 à 20:01:04

          Je pense pas qu'accéder aux addresses directement comme ça en les déclarants soit la meilleure des idées. ;)

          Normalement le compilateur te fournit les registres à manipuler. :)

          J'essayerai de me plonger plus dedans pour te filer un coup de main si je suis motivé. ^^

          Je pense que si tu veux avoir des réponses plus complètes que les miennes, il faut aller sur avrfreaks.net pour poster ton problème. (ok c'est en anglais, mais il y en a qui s'y connaissent bien !)

          • Partager sur Facebook
          • Partager sur Twitter
            21 septembre 2016 à 22:41:36

            Ok ça marche,

            Et bien écoute merci beaucoup pour tes réponses, je vais tester les configuration bits dispo sur atstudio si je les trouve et sinon j'irai voir du côté d'avrfreaks voir ce que ça donne. J'essayerai de te tenir au courant si je trouve quelque chose  ;)

            Merci encore!

            A+

            • Partager sur Facebook
            • Partager sur Twitter

            Programmation Atmel (samc21)

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown