You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
4.3 KiB

/*
* File: main_IR_Receptor.c
* Author: micka
*
* Created on 9 mars 2015, 17:03
*
* License CC-BY-NC-SA
* https://creativecommons.org/licenses/by-nc-sa/3.0/fr/
*
*/
/* CONFIGURATION */
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#pragma config CCPMX = RB3 // CCP1 Pin Selection bit
#pragma config DEBUG = OFF // In-Circuit Debugger Mode bit
#pragma config WRT = OFF // Flash Program Memory Write Enable bits
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has PGM function, low-voltage programming enabled)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config FOSC = INTOSCIO
#define _XTAL_FREQ 8000000 // set your internal(or)external oscillator speed
#include <htc.h>
#include <xc.h>
#include <pic16f87.h>
/* Alias */
#define RECEP PORTAbits.RA1
#define OUT1 PORTAbits.RA2
#define OUT2 PORTAbits.RA3
#define RED1 PORTBbits.RB2
#define GREEN1 PORTBbits.RB3
#define RED2 PORTBbits.RB5
#define GREEN2 PORTBbits.RB4
/* FONCTIONS */
void init_oscillator (void);
unsigned change_out (unsigned OUT);
void init_code (unsigned *code);
/*
* MAIN
*/
void main(void) {
init_oscillator();
TRISAbits.TRISA1 = 1; //input of IR recepter
TRISAbits.TRISA2 = 0; //output led
TRISAbits.TRISA3 = 0; //output led
TRISB = 0;
TRISAbits.TRISA4 = 0; //output led
unsigned signal_precedent = 1;
unsigned code[8];
/* set code to 0 */
init_code(code);
/* set outpu to 0 */
OUT1 = 0;
OUT2 = 0;
GREEN1 = 0;RED1 = 1;
GREEN2 = 0;RED2 = 1;
while(1)
{
/* code: 01010101 -> reception: 10101010 */
if( code[0]==1 && code[1]==0 && code[2]==1 && code[3]==0 && code[4]==1 && code[5]==0 && code[6]==1 && code[7]==0 ){
OUT1 = change_out(OUT1);
if( OUT1==1 ){GREEN1=1;RED1=0;}else{GREEN1=0;RED1=1;}
init_code(code);
}
/* code: 00011000 -> reception: 11100111 */
else if( code[0]==1 && code[1]==1 && code[2]==1 && code[3]==0 && code[4]==0 && code[5]==1 && code[6]==1 && code[7]==1 ){
OUT2 = change_out(OUT2);
if( OUT2==1 ){ GREEN2=1;RED2=0; }else{ GREEN2=0;RED2=1; }
init_code(code);
}
if( RECEP==0 ){
__delay_ms(10);
if( RECEP==0 && signal_precedent==1 ){
__delay_ms(1);
__delay_us(500); // delay to be at the midle
code[0] = RECEP;
__delay_ms(1);
code[1] = RECEP;
__delay_ms(1);
code[2] = RECEP;
__delay_ms(1);
code[3] = RECEP;
__delay_ms(1);
code[4] = RECEP;
__delay_ms(1);
code[5] = RECEP;
__delay_ms(1);
code[6] = RECEP;
__delay_ms(1);
code[7] = RECEP;
signal_precedent = 0;
PORTAbits.RA4 = change_out(PORTAbits.RA4);
}
else{}
}
else{ signal_precedent=1; }
}
}
/*
* Init frenquency
*/
void init_oscillator(void){
OSCCONbits.IRCF = 0b111; //8MHz
OSCCONbits.SCS = 0b00; //Oscillator mode defined by FOSC
OSCCONbits.IOFS = 1; //Frequency is stable
}
/*
* Change out signal
*/
unsigned change_out(unsigned OUT){
if( OUT==1 ) return 0;
else return 1;
}
/*
* Set code to default: 00000000
*/
void init_code(unsigned *code){
code[0] = 0;
code[1] = 0;
code[2] = 0;
code[3] = 0;
code[4] = 0;
code[5] = 0;
code[6] = 0;
code[7] = 0;
}