-
18/04/2008 - 10h19 ZBilou 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 !
-
18/04/2008 - 13h51 ZBilou
Re : pwm avec pic12F629
siouplait.... quelqu'un ???
-
18/04/2008 - 14h22 BastienBastien
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.
-
18/04/2008 - 16h24 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.
-
18/04/2008 - 21h40 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+
-
18/04/2008 - 23h05 mister_e
Re : pwm avec pic12F629
Mikroelektronika MikroC, version demo gratuite pourrait suffire. http://www.mikroe.com/en/compilers/mikroc/pic/ -
19/04/2008 - 09h13 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
-
19/04/2008 - 10h08 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 )
@+
-
19/04/2008 - 15h29 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 -
19/04/2008 - 17h36 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 -
19/04/2008 - 19h29 ZBilou | | |