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

pwm avec pic12F629



  1. #1
    ZBilou

    Question pwm avec pic12F629


    ------

    Bonjour,

    Actuellement sur un projet de communication radio, je voudrai envoyer un partir d'un pic12F629 (oscillateur interne 4MHz) un signal PWM d'environ 800 900Hz (cycle de 50%) pour arriver sur un module de type Aurel.
    Le problème c'est que niveau programmation (assembleur) je suis pas très fort, je c'est que je devrai utiliser des interruptions, des timers... mais comment ???

    Merci d'avance pour le temps passé à me répondre !

    -----

  2. Publicité
  3. #2
    ZBilou

    Re : pwm avec pic12F629

    siouplait.... quelqu'un ???

  4. #3
    BastienBastien
    Invité

    Re : pwm avec pic12F629

    Bonjour,

    Pourquoi ne pas utiliser le langage C ?

    Si tu DOIS utiliser l'assembleur, je te conseille les livres de BigOnOff.

  5. #4
    mister_e

    Re : pwm avec pic12F629

    Bonjour,
    Solution plus simple, utiliser un PIC12F683 qui à deja cette fonction (CCP). A partir de là, configuration de 2-3 registre, et voila!

    Sinon, et bien oui, c'est une interruption par les Timers interne. Les cours de Bigonoff doivent en parler.
    Steve

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    RISC

    Re : pwm avec pic12F629

    Zbilou,

    Tu peux programmer aussi les PIC12F en C. Mais généralement il faut acheter une license (CCS, Hitech,...).
    L'assembleur lui est gratuit et fourni en standard dans MPLAB...

    Un très bon cours avec des exemples en C ici :
    http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm
    et aussi en ASM sur les PIC16 (utilisable aussi pour les PIC12)

    a+

  9. #6
    mister_e

    Re : pwm avec pic12F629

    Mikroelektronika MikroC, version demo gratuite pourrait suffire.
    http://www.mikroe.com/en/compilers/mikroc/pic/
    Steve

  10. Publicité
  11. #7
    michel5002

    Re : pwm avec pic12F629

    Bonjour à vous,
    voici un exemple de programme avec PIC10F200:

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Programme avec PIC10F200 révisé le 19 avril 2008. "PIC10F200 - signal continu de 800Hz.c"
    //
    // PROGRAMME FREQUENCE CONTINUE DE 800Hz
    // ============================== ========
    // sur la sortie GP1 du PIC
    // ========================
    //
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #device PIC10F200
    #nolist
    #define PIN_B0 48
    #define PIN_B1 49
    #define PIN_B2 50
    #define PIN_B3 51
    #define FALSE 0
    #define TRUE 1
    #define BYTE int
    #define BOOLEAN short int
    #define getc getch
    #define fgetc getch
    #define getchar getch
    #define putc putchar
    #define fputc putchar
    #define fgets gets
    #define fputs puts
    #define WDT_FROM_SLEEP 0x00
    #define WDT_TIMEOUT 0x08
    #define MCLR_FROM_SLEEP 0x10
    #define NORMAL_POWER_UP 0x18
    #define COMP_FROM_SLEEP 0x50
    #define PIN_CHANGE_FROM_SLEEP 0x90
    #define RTCC_INTERNAL 0
    #define RTCC_EXT_L_TO_H 32
    #define RTCC_EXT_H_TO_L 48
    #define RTCC_DIV_1 8
    #define RTCC_DIV_2 0
    #define RTCC_DIV_4 1
    #define RTCC_DIV_8 2
    #define RTCC_DIV_16 3
    #define RTCC_DIV_32 4
    #define RTCC_DIV_64 5
    #define RTCC_DIV_128 6
    #define RTCC_DIV_256 7
    #define RTCC_8_BIT 0
    #define WDT_18MS 8
    #define WDT_36MS 9
    #define WDT_72MS 10
    #define WDT_144MS 11
    #define WDT_288MS 12
    #define WDT_576MS 13
    #define WDT_1152MS 14
    #define WDT_2304MS 15
    #define DISABLE_PULLUPS 0x40 // for 508 and 509 only
    #define DISABLE_WAKEUP_ON_CHANGE 0x80 // for 508 and 509 only
    #ifndef PIN_CHANGE_FROM_SLEEP
    #define PIN_CHANGE_FROM_SLEEP 0x90 // for 508 and 509 only
    #endif
    #list
    #use delay(clock=4000000)
    #fuses NOWDT,NOPROTECT,NOMCLR
    #define GP0 PIN_B0
    #define GP1 PIN_B1
    #define GP2 PIN_B2
    #define GP3 PIN_B3

    void traitement_signal(void);
    byte pas_fini=0x01;

    void main() // programme principal
    {
    debut:
    output_low (GP0);
    output_low (GP1);
    output_low (GP2);
    output_low (GP3);
    traitement_signal(); // lancement du signal
    goto debut;
    }

    void traitement_signal(void)
    {
    pas_fini=0x01;
    while (pas_fini>0)
    {
    output_high (GP1); // sortie sur la pin GP1
    delay_us(625); // (1000000 divisé par 800Hz=1250mS) divisé par 2=625mS
    output_low (GP1);
    delay_us(625); // 625mS si la largeur du pic est égale au temps de repos
    pas_fini=0x01;
    }
    }

    A+
    michel5002

  12. #8
    dome45

    Re : pwm avec pic12F629

    Bonjour,

    Avec l'oscillateur interne, je n'ai jamais pu avoir 4 Mhz avec les 12F629 meme avec le programme Autocal.asm ( frequence toujours inferieure )
    @+

  13. #9
    mister_e

    Re : pwm avec pic12F629

    Bonjour, et bien voici un exemple en assembleur qui fonctionne avec l'interruption du Timer0. Le pseudo PWM se fait en "tache de fond". Donc si plus tard tu veux ajouter des fonctions supplémentaires, tu ne devrais pas avoir trop de soucis à te faire.

    Comme tâche principale, mon exemple éfectue un classique "led clignotant", rien de très complexe en soit, mais confirme qu'il y à de la vie quelque part et que deux choses peuvent se faire... pratiquement en même temps.

    A noter que je suis un très, très mauvais programmeur en assembleur... donc si quelqu'un y trouve un danger potentiel... bien vouloir m'en faire part

    Voila! Bonne prog.
    Code:
            ;-----------------------------------------------------------------------
            ;
            ;   Simple démonstration de génération de signal PWM sur GP5 de ~850Hz 
            ;   (rapport cyclique=50%) en tâche de fond, utilisant l'interruption du 
            ;   Timer0.
            ;
            ;   Un led clignotant est aussi attaché à GP4 en guise de tâche principale
            ;   
            ;   Utilisation de l'oscillateur interne (4MHz), fonction MCLR activé.
            ;
            ;-----------------------------------------------------------------------
                    
            include     <P12F629.inc>
            errorlevel -302
            __CONFIG    _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _BODEN_ON 
                        ;   Oscillateur -------- interne
                        ;   MCLR --------------- activé
                        ;   "WatchDogTimer" ---- désactivé
                        ;   "Power up Timer" --- activé
                        ;   "Brown out detect" - activé
          
          
            ;
            ;       Déclaration des variables et constantes
            ;       =======================================
            CBLOCK  20h
                    TEMP_W      ; Tampon pour W
                    TEMP_STATUS ; Tampon pour STATUS
                    C0          ; Compteur (delais)
                    C1          ; Compteur (delais)
                    ENDC
    
    PRELOAD=.109    ; Constante a charger dans Timer0 pour produire PWM ~850Hz 
                    ;   @4MHz et prescaller 1:4
            
            
            ORG     0   
            GOTO    INIT    ; Aller au Programme principal
            
            
            ;------------------------< Routine d'interruption >---------------------
            ;
            ;       Source d'interruption: TIMER0 (Overflow)
            ;       But: créer le signal PWM sur GP5
            ;
            ORG     4 
            MOVWF   TEMP_W        ; Sauvegarder W
            SWAPF   STATUS,W      ; 
            BCF     STATUS,RP0    ; BANK0
            MOVWF   TEMP_STATUS   ; Sauvegarder STATUS
                    ;
            MOVLW   PRELOAD       ; 
            MOVWF   TMR0          ; Charger TMR0 avec valeur de PRELOAD  
            BCF     INTCON,T0IF   ; RAZ flag "TMR0 Overflow"
                    ;       
            MOVF    GPIO,W        ; Lire GPIO  
            ANDLW   b'00110000'   ; garder intact GP5 et GP4, ignorer les autres (=0)
            XORLW   b'00100000'   ; Inverser l'état du Bit 5 (Sortie PWM)
            MOVWF   GPIO          ; Ecrire sur GPIO  
                    ;      
            SWAPF   TEMP_STATUS,W ; Restaurer 
            MOVWF   STATUS        ;     STATUS
            SWAPF   TEMP_W,F      ; Restaurer
            SWAPF   TEMP_W,W      ;     W  
                    ;
            RETFIE                ; Bye Bye!  
            ;
            ;-----------------------------------------------------------------------
            
            
            ;--------------------------< Programme principal >----------------------       
    INIT    ;
            ;       Initialisation des registres internes
            ;       =====================================
                    ;
                    ;   BANK1
                    ;   -----
                    ;
            BSF     STATUS, RP0 
                    ;
            CALL    3FFh        ; 
            MOVWF   OSCCAL      ; charger la calibration de l'oscillateur interne
                    ;
            MOVLW   b'11010001'
                    ; 1-------> GPPU   , Désactiver Pull-up interne
                    ; -x------> INTEDG , n/a
                    ; --0-----> T0CS   , TMR0 utilise le clock interne  
                    ; ---x----> T0SE   , n/a
                    ; ----0---> PSA    , Assigner prescaler a TMR0
                    ; -----000> PS<2:0>, Prescaler = 1:4
            MOVWF   OPTION_REG
                    ;
            CLRF    TRISIO      ; configurer tous les I/Os comme sortie (sauf MCLR)
                    ;
                    ;
                    ;   BANK0
                    ;   -----
                    ;
            BCF     STATUS, RP0
                    ;
            MOVLW   .7
            MOVWF   CMCON       ; Desactiver comparateur analogue
                    ;
            MOVLW   b'00100000'
                    ; 0-------> GIE , desactiver toutes les interruptions    
                    ; -0------> PEIE, désactiver les interruption péripherique
                    ; --1-----> T0IE, activer interruption Timer0
                    ; ---0----> INTE, desactiver interruption sur GP2/INT
                    ; ----0---> GPIE, désactiver interruption "GPIO port change"  
                    ; -----0--> T0IF, RAZ flag TMR0 "overflow"
                    ; ------0-> INTF, RAZ flag GP2/INT
                    ; -------0> GPIF, RAZ flag "GPIO port change"
            MOVWF   INTCON
                    ;
            CLRF    GPIO        ; RAZ de tous les sorties
                    ;
            MOVLW   PRELOAD     ;
            MOVWF   TMR0        ; Charger Timer0
                    ; 
            BSF     INTCON, GIE ; Activer les interruptions
            ;
            ;        
            ;       Boucle principale
            ;       =================
                    ;        
    START           ;       Clignoter un LED sur GP4 en guise de tâche principale
                    ;       
            BSF     GPIO,4      ; Allumer LED
            CALL    DELAIS      ; Delais
            BCF     GPIO,4      ; Eteindre LED
            CALL    DELAIS      ; Delais
            GOTO    START       ; Et on recommence!
            ;
            ;-----------------------------------------------------------------------
    
            
            ;-----------------------------< Sous-Routines >-------------------------
            ;
    DELAIS  ;       Boucle de délais
            ; 
            DECFSZ  C0,F        ; 1(2)
            GOTO    $-1         ; 2
            DECFSZ  C1,F        ; 1(2)
            GOTO    DELAIS      ; 2  
            RETURN              ; 2
            ;
            ;-----------------------------------------------------------------------
            
            END
    Steve

  14. #10
    mister_e

    Re : pwm avec pic12F629

    woops.. erreur de commentaire...
    Code:
                    ; -----000> PS<2:0>, Prescaler = 1:4
    devrais plutôt être...
    Code:
                    ; -----001> PS<2:0>, Prescaler = 1:4
    le code est bon quand même
    Steve

  15. #11
    ZBilou

    Re : pwm avec pic12F629

    Bonjours tout le monde,

    Merci pour toutes vos réponses (très complètes !).

    Je n'ai plus qu'à mettre en pratique alors je vous tiendrais au courant de mes évolutions.

    PS : super furum je le conseille à tout le monde !!!

Discussions similaires

  1. Le PWM avec MikroC
    Par inoxxam dans le forum Électronique
    Réponses: 12
    Dernier message: 24/02/2013, 15h04
  2. Sous-programme PIC12F629 - problème
    Par michel5002 dans le forum Électronique
    Réponses: 8
    Dernier message: 10/12/2007, 20h12
  3. probleme avec PWM et NE555
    Par joeystarr57 dans le forum Électronique
    Réponses: 5
    Dernier message: 22/08/2006, 09h25
  4. Tension variable 0-1V DC avec un PWM
    Par joop@gp dans le forum Électronique
    Réponses: 3
    Dernier message: 30/09/2005, 09h33
  5. Gestion du temps sur PIC12F629 ?
    Par Aurelien62fr dans le forum Électronique
    Réponses: 6
    Dernier message: 29/03/2005, 08h40
Découvrez nos comparatifs produits sur l'informatique et les technologies.