bonjour a tous,
voila je veux creer une frequence de 40KHz en sortie de mon microcontroleur( PIC16F1508),
j'utilise comme compilateur MPLABX,
donc je crée un TIMER0 de frequence 80KHz pour que toutes les 12.5 micro secondes ma tension en sortie du pic soit = 5v puis 12.5 micro secondes apres
la tension est a 0 ce qui me fera une frequence en sortie de pic de 40KHz.
j'explique mon code : la frequence du quartz est de 2MHz , le microcontroleur etant de 8 bits( = 255 en decimal ) alors il faut 128 micro secondes pour deborder (t0if=1), avec un produit en croix j'obtiens un TMR0 a 231 pour avoir une frequence de 80KHz,
voici mon code:
Code:#include <xc.h> #include <stdlib.h> // configuration du PIC16F1508 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF #ifndef _XTAL_FREQ #define _XTAL_FREQ 8000000 #endif #define SORTIE_ULTRASON RA4 int debordement=0; void INIT_PIC() { OSCCON=0b01110010; //Oscillateur interne à 8MHZ T0CS=0; // comptage quartz, FOSC=2MHz GIE=1; // autorisation générale IT T0IE=1; //valide IT en cas de débordement de TMR0 T0IF=0; // initialise T0IF a 0, T0IF=1 quand debordement de TMR0 PSA=1; // On desactive les prediviseurs TMR0=231; // TMR0 reglé pour avoir une frequence de 80KHZ //configuration des PORTS ANSELA=0; //numerique TRISA=0x00;// le PORTA = sorties PORTA=0x00;//toutes les sorties a 0 } void interrupt sous_programm() { if(T0IF==1) { T0IF=0; debordement=1; TMR0=231; } } void main() { INIT_PIC(); SORTIE_ULTRASON=1; while(1) { if(debordement==1)// frequence de 40 000 Hz { debordement=0; SORTIE_ULTRASON=!SORTIE_ULTRASON; } } }
Le probleme quand je lance le code et je regarde a l'oscilloscope en sortie de pic je n'ai qu'une frequence de 25 KHz et je ne comprend pas du tout pourquoi,
avez vous une idée d'ou peut venir le probleme , est ce que mon raisonnement est bon?
merci d'avance
-----