Buenos días, hace ya algunas semanas adquirí un launchpad de texas instruments, en el cual veían 2 mcu (MSP430G2452 y MSP430G2553), tras haber hecho ya algunos ejemplos, quisiera hacer un transmisor de infrarrojos a 38khz con los siguientes requisitos:
* CHIP MSP430G2452
* Uso del DCO interno
* 940nm IR led
* Modular la frecuencia a 38khz para el uso del protocolo NEC, SIN usar timers
**Las referencias que he codigo están adjuntos en el PDF
Ahora Expongo mi codigo y lo que he ido haciendo
* CHIP MSP430G2452
* Uso del DCO interno
* 940nm IR led
* Modular la frecuencia a 38khz para el uso del protocolo NEC, SIN usar timers
**Las referencias que he codigo están adjuntos en el PDF
Ahora Expongo mi codigo y lo que he ido haciendo
Código:
#include <msp430.h>
#include <stdint.h>
#include <delay.h> //Liberia a incluir
//#define CPU_CLOCK 16000000
#define F_CPU 16000000UL
void parpadeoLed();
void generar38khz(int useg);
void enviarTrama(int trama[8]);
void sendNec();
//Hacemos un parpadeo de un led que lo utilizamos para ver si el micro esta
//funcionando, el pin usado es el P2.2
void parpadeoLed(){
P2DIR |= 0x04; // Set P2.2 to output direction
P2OUT ^= 0x04; // Toggle P2.2 using exclusive-OR
}
//Modulamos una frecuencia de 38khz
void generar38khz(int useg) {
unsigned int i=0;
P1DIR = 0x40; //Habilitamos la direccion del pin 1.6
//Calculamos el numero de pulsos que tenemos que enviar
//Como unsigned int solo llega hata 65 mil y pico
// tenemos que operar un poco para no desbordarlo
useg = useg/10;
unsigned mult = (useg*38.2); //useg * 38khz
unsigned res = (mult/100);
for(i=0;i<res;i++){
P1OUT = 0x40; //Ponemos como salida el pin 1.6 en HIGH
_delay_us(7); //Redondeamos el delay de 1/4 del duty_cycle
P1OUT = 0x00; //Ponemos como salida el pin 1.6 en LOW
_delay_us(19); //Redondeamos el delay de 1/4 del duty_cycle
}
}
void enviarTrama(int trama[8]){
unsigned char i = 0;
// Recorermos el array verificando si tenemos que enviar un
// 0 logico o 1 logico
while (i < 8) {
// Transmitimos un 1
if (trama[i] == 1) {
generar38khz(560);
_delay_us(1690);
}else {
// Transmitimos un 0
generar38khz(560);
_delay_us(560);
}
i++;
}
}
void sendNec(){
//Segun la teoria del protocolo NEC, primero debemos
//enviar una cabecera modulada de 9ms + 4.5 de delay
//un 1 logico son 560 us + 1690 us de delay
//un 0 logico son 560 us + 560 us de delay
//Bit de parada 560 us + 4708 us de delay
//
//Tambien sabemos que la trama se envía de LSB a MSB
//Desde el bit menos significativo al mas
//Mandamos una cabecera, mandamos una direccion y despues un comando
int addr2[8] = {0,0,0,0,0,1,0,0}; // => 0x20 = 00100000 -> lo invertimos por LSB a MSB -> 00000100
int naddr2[8] = {1,1,1,1,1,0,1,1}; //el negado de lo anterior
int cmd2[8] = {0,0,0,0,0,0,1,0}; //0x40 -> comando vol_UP
int ncmd2[8] = {1,1,1,1,1,1,0,1}; //negado del comando
//Cabecera
generar38khz(9000); //PWN 38khz 9ms
_delay_us(4500); //delay 4.5ms
//Address
enviarTrama(addr2); //Trama normal
enviarTrama(naddr2); //Trama negada
//Command
enviarTrama(cmd2); //Trama normal
enviarTrama(ncmd2); //Trama negada
//Bit de parada
generar38khz(560); //bit parada
_delay_us(4708); //bit parad
}
///FUNCION PRINCIPAL DEL MICRO///////
////////////////////////////////////
int main(void) {
WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer
//Calibramos el micro a 16Mhz
BCSCTL1 = CALBC1_16MHZ; // Set range
DCOCTL = CALDCO_16MHZ; // Set DCO step + modulation*/
//All values to cero as INPUT Pines del P1_0 al P1_6
//Pines as INput P2_0 al P2_6
P1DIR = 0x00;
P2DIR = 0x00;
for(;;) { //Bucle infinito
parpadeoLed();//Parpadeamos el led para saber que el micro está funcionando
_delay_ms(500);
sendNec(); //Mandamos un comando NEC
_delay_ms(500);
}
}
Adjuntos
Última edición: