Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Utilisation d'un PWM sur un pic 12f683
Yvesbf
Membre
Membre
Messages : 1
Enregistré en : juillet 2022

#1 Message par Yvesbf » jeu. 4 août 2022 16:19

Bonjour a tous je suis nouveau sur ce site,. Je voudrais comprendre comment faire clignote une Led relié à la sortie GPO a l'aide du PWM, sur miKro pro C,
Je ne comprends absolument pas comment m'y prendre, un simple code. Pourrait bien m'aider, merci

Utilisation d'un PWM sur un pic 12f683
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » mer. 10 août 2022 14:54

bonjour,


pour faire clignoter une led , on utilise plutot les timer sou des delaysdans une boucle..
une sortie PWM c'est plutot pour faire varier l'intensité lumineuse de la led ... clignotement non visible, trop rapide
une petite ampoule à incandescence (ex 6V 0,2A) , pilotée via un transistor, permet de MIEUX VISUALISER le comportement en PWM


oscillateur interne 8MHz
led sur GPIO4
PWM sur GPIO 2
UART sur GPIO 0 et GPIO6 => optionnel !


details ICI

[c ode=php]
#define Version "171231"
//12F683_PWM_UART_TX_RX_interrupt_tests_2017.hex
// corrigé Bug pour RAZ GPIF_bit
// doit lire le PORT pour le RAZER
// rajout PWM hardwere GPIO.F2 (RA2 pin 5)
// testé ok avec montage girlande 20 leds (leds tirées au +Vcc)

// presentation
#define Version "171227"
#define Directory "C:\\_MikroC\\_MesProjets_MikroC\\_12F683_PWM_UART_12F683"
#define Projet "12F683_PWM_UART_TX_RX_interrupt_tests_2017.mcppi"
#define Source "_12F683_Test_PWM_UART_TX_GP1_RX_GP0_via_Interrupt_" // sans date ni extension !
#define Langage "MikroC 7.1.0"
#define MCU "12F1840 DIP8"
#define POWER_SUPPLY "5V" // (3 à 5V)
#define OSCILLATEUR_INTERNE
#define FOSC 8 MHZ
#define EEPROM_FILE "xxx_Eeprom.ihex"



//#define Version "171218"
// avec Analog sur RA2

// CONFIG : $2007 : 0x08F4


//ac:Pinout_12F683

//ac:Pinout_HC06_BlueTooth

//ac:Schema_12F683

// ac:Interrupt_12F683

/*
usage de PicKit2 pour programmer in situ le pIC12F683
ATTENTION : Enlever le HC06 pour utiliser l'ICSP
12F683
Internal FOSC 8HMz
Pin Number Description
1 Vdd +5V Power Supply
2 GP5 / output Guirlande
3 GP4 / Output Led verte
4 GP3 / Input ONLY!! MCLR & VPP
5 GP2 / PWM out
6 GP1 / TX RS232 ICSP CLK
7 GP0 / RX RS232 ICSP DATA
8 0V
*/

#define Led_Verte GPIO.F4
//#define ADC_IN GPIO.F2
#define PWM_Out GPIO.F2
#define SQ50_Synchro GPIO.F5
#define TX GPIO.F1
#define RX GPIO.F0
#define ON 0 // car led avec pull up vers +5V
#define OFF 1
#define Augmente 1
#define Diminue -1
//#define With_Analog

unsigned char RS_tmp absolute 0x20;
unsigned int Volt;
unsigned char Index =0;
volatile unsigned char Recu=0;
unsigned char Flag_Reception=0;
char TEXTE[32];
char CRam1[16];
char *txt ;
unsigned int i,j;
static unsigned int k, l;
char c2,error ;
unsigned int val;

void Bit_Delay(void);
void Demi_Bit_Delay(void);
void Quart_Bit_Delay(void);

void Interrupt() iv 0x0004 ics ICS_AUTO
{ // int n;
if ((GPIE_bit)&&(GPIF_bit))
{
Recu=0;
Demi_Bit_Delay();
// Led_Verte=ON;
Bit_Delay(); //passe le start
// SQ50_Synchro =1;
if(GPIO.F0==1) Recu.B0=1;
// SQ50_Synchro =0;
Bit_Delay();
if(GPIO.F0==1) Recu.B1=1;
Bit_Delay();
if(GPIO.F0==1) Recu.B2=1;
Bit_Delay();
if(GPIO.F0==1) Recu.B3=1;
Bit_Delay();
if(GPIO.F0==1) Recu.B4=1;
Bit_Delay();
if(GPIO.F0==1) Recu.B5=1;
Bit_Delay();
if(GPIO.F0==1) Recu.B6=1;
Bit_Delay();
// SQ50_Synchro =1;
if(GPIO.F0==1) Recu.B7=1;
// SQ50_Synchro=0;
Bit_Delay();
Quart_Bit_Delay();

if((Recu==13) || (Index>30))
{
Flag_Reception=1;
TEXTE[Index]=0;
GPIE_bit=0;
}
else
{
TEXTE[Index]=Recu;
Index++;
// option au lieu du test Index>30
// Index=Index & 0x001F; // 31 cars maxi
}
// Led_Verte=OFF;
c2=GPIO;
GPIF_bit=0;
}
}

void Bit_Delay()
{
_asm {
RSdelai:
MOVLW 64 ; // 102 µS at 8MHz
MOVWF _RS_tmp ;
RS1:
DECFSZ _RS_tmp,F ;
GOTO RS1 ;
}
}

void Demi_Bit_Delay()
{
_asm {
RSdelai:
MOVLW 32 ; // 51 µS at 8MHz
MOVWF _RS_tmp ;
RS1:
DECFSZ _RS_tmp,F ;
GOTO RS1 ;
}
}

void Quart_Bit_Delay()
{
_asm {
RSdelai:
MOVLW 15 ; // 25 µS at 8MHz
MOVWF _RS_tmp ;
RS1:
DECFSZ _RS_tmp,F ;
GOTO RS1 ;
}
}



void Write_String(char *texte)
{
short int i1,j1,k;
j1=strlen(texte);
i1=0;
do
{
k=*(texte+i1);
Soft_UART_Write(k);
i1++;
}while (i1<j1);
}


void CRLF()
{
Soft_UART_Write(10);
Soft_UART_Write(13);
}

void Hardware_Init()
{
// Internal oscillator 8MHz OSTS=1 HTS=1 status oscillateur LTS=0 SCS=1 internal oscillator is used
//OSCCON = 0b01110101 ;
// 8Mhz
OSCCON.IRCF2=1;
OSCCON.IRCF1=1;
OSCCON.IRCF0=1;
// 1Mhz
// OSCCON.IRCF2=1;
// OSCCON.IRCF1=0;
// OSCCON.IRCF0=0;
OSCCON.SCS=1; // internal oscillator is used
//while(OSCCON.HTS==0);
// Configure GPIO Port
TRISIO = 0b00001001; // GP0 =input Rx GP1=Output TX GP2=Output PWM GP3=input GP4 et GPR5=Output
PWM_Out=OFF; //
WPU = 0x00; // Weak-pull-up disabled
ANSEL=0;
// Configure Comparator
CMCON0 = 0xFF; // Comparator is turned OFF
// Interrupt Configuration
INTCON=0x00;
}


void Init_Timer1()
{
T1CON=0;
T1CON.T1CKPS1=1; // 1/8 prescaler
T1CON.T1CKPS0=1;
TMR1ON_bit=1;

}


void strConstRamCpy(char *dest, const char *source) {
while(*source) *dest++ = *source++ ;
*dest = 0 ; // terminateur
}



void main()
{
Hardware_Init();

// to check FOSC
Led_Verte=ON;
Delay_1sec();
Led_Verte=OFF;
Delay_1sec();
Led_Verte=ON;
Delay_1sec();
Led_Verte=OFF;

txt=&TEXTE[0];
error =Soft_UART_Init(&GPIO, 0,1, 9600,0);
CRLF();
strConstRamCpy(txt, "UART TX,IT RX,PWM 12F683");
Write_String(txt);
CRLF();
txt=&TEXTE[0];
strConstRamCpy(txt, "Version : "Version"\r\n");
Write_String(txt);
k=0;

txt=&TEXTE[0];
strConstRamCpy(txt, "Attente Terminal\r\n");
Write_String(txt);
PWM_Out=1;

PWM1_Init(5000); // 5000Hz
PWM1_Start();
PWM1_Set_Duty(255);
for (val=0;val<255;val++)
{
PWM1_Set_Duty(255-val);
Delay_ms(10);
}
Delay_1sec();
for (val=0;val<255;val++)
{
PWM1_Set_Duty(val);
Delay_ms(10);
}
Delay_1sec();


IOC=0;
IOC.IOC0=1;
GPIE_bit=1;
GIE_bit=1;
Index=0;
Flag_Reception=0;
txt=&TEXTE[0];
val=255;
PWM1_Set_Duty(val);
while(1)
{
if (Flag_Reception==1)
{ txt=&TEXTE[0] ;
strConstRamCpy(CRam1, "Recu=");
Write_String(CRam1);
val= atoi(txt);
IntToStr(val,CRam1);
Write_String(CRam1);
if ((val>0) && (val<256)) PWM1_Set_Duty(255-val);
CRLF();
Flag_Reception=0;
txt=&TEXTE[0];
Index=0;
c2=GPIO;
GPIF_bit=0;
GPIE_bit=1;
}
Delay_ms(1000);
}

}


[/code]
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 43 invités