Bonjour à tous!
Avec mon groupe de travail on doit réaliser un radar de recul. Je m'occupe de la partir du sonar. Le but étant de le faire biper plus ou moins vite selon une distance (qu'un collègue se chargera de programmer de son côté à l'aide d'un capteur).
J'utilise le logiciel MPLABX IDE, avec le compilateur XC8, sur le PIC18f45k20.
J'ai bien avancé, je gère les bip à l'aide d'une PWM, ainsi qu'une interruption sur le débordement du timer 1, en changeant les valeurs du timer pour qu'il déborde plus ou moins vite selon la valeur de la distance qui nous est envoyée. Le sonar sera placé sur le port RB3 du pic.
Le soucis, c'est que le sonar bip sans arrêt, et je ne sais pas d'où ça vient. Avez -vous des conseils svp?
Voici mon code:
Code:#pragma config FOSC=INTIO7, FCMEN=OFF, IESO=OFF, PWRT=OFF, BOREN=OFF #pragma config BORV=30, WDTEN=OFF, WDTPS=1, MCLRE=ON, HFOFST=ON #pragma config LPT1OSC=OFF, PBADEN=OFF, CCP2MX=PORTBE, STVREN=OFF #pragma config LVP=OFF, XINST=OFF, CP0=OFF, CP1=OFF, CP2=OFF #pragma config CP3=OFF, CPB=OFF, CPD=OFF, WRT0=OFF, WRT1=OFF #pragma config WRT2=OFF, WRT3=OFF, WRTB=OFF, WRTC=OFF, WRTD=OFF #pragma config EBTR0=OFF, EBTR1=OFF, EBTR2=OFF, EBTR3=OFF #pragma config EBTRB=OFF // Libraries #include "p18f45K20.h" #include <stdio.h> #include <stdlib.h> volatile unsigned char d=50; volatile int j=0; void interrupt high_isr (void) { if (PIR1bits.TMR1IF==1) { j++; if (j=5) { TRISBbits.RB3 = 0; // Disable RB3 output PIR1bits.TMR1IF = 0; // Timer1 interrupt Flag cleared if (d<20) { TRISBbits.RB3 = 1; // Disable RB3 output TMR1H = 255; // preset for timer1 MSB register TMR1L = 255; // preset for timer1 LSB register //0 sec } if ((d>=20)&&(d<40)) { TRISBbits.RB3 = 1; // Disable RB3 output TMR1H = 236; // preset for timer1 MSB register TMR1L = 231; // preset for timer1 LSB register // 0.1s } if ((d>=40)&&(d<100)) { TRISBbits.RB3 = 1; // Disable RB3 output TMR1H = 207; // preset for timer1 MSB register TMR1L = 102; // preset for timer1 LSB register //0.25s } if (d>=100) { TRISBbits.RB3 = 1; // Disable RB3 output TMR1H = 110; // preset for timer1 MSB register TMR1L = 53; // preset for timer1 LSB register //0.75s } j=0; } TMR1IF=0; T1CONbits.TMR1ON = 1; } } // Main Program void main (void) { OSCCON = 0b01100000; // PWM output setup (CCP2 on RB3) // -------------------------------------------------------------------- CCP2CON = 0b00001111; // CCP2 as PWM mode, LSB's set to 0 PR2 = 0xff; // Initial Period CCPR2L = 0x1F; // Initial duty cycle (MSB's) T2CON = 0x00; // Timer 2 prescaler is 1 -> T2CONbits.TMR2ON = 1; // Launch Timer 2 -> TRISBbits.RB3 = 1; // Disable RB3 output //Timer1 Registers Prescaler= 8 - TMR1 Preset = 0 - Freq = 7.63 Hz - Period = 0.131072 seconds T1CONbits.T1CKPS1 = 1; T1CONbits.T1CKPS0 = 1; T1CONbits.T1OSCEN = 0; T1CONbits.T1SYNC = 0; T1CONbits.TMR1CS = 0; T1CONbits.TMR1ON = 1; INTCONbits.PEIE = 1; // Bit6 Enable Peripheral interrupts PIE1bits.TMR1IE = 1; // Timer1 interrupt enabled PIR1bits.TMR1IF = 0; // Timer1 interrupt Flag cleared TMR1L = 0x00; // Reset Timer1 lower 8 bits TMR1H = 0x00; // Reset Timer1 upper 8 bits INTCONbits.GIE = 1; // Bit7 enable Global interrupts }
-----