X-Git-Url: http://cloudbase.mooo.com/gitweb/irmp.git/blobdiff_plain/956ea3ea733ead7da9cf5584b9a0dc1c1d98d548..622f5f5988ba7b2cba507f65050ec09533535b12:/irsnd.c diff --git a/irsnd.c b/irsnd.c index 4b276d6..00f80e3 100644 --- a/irsnd.c +++ b/irsnd.c @@ -1,9 +1,9 @@ /*--------------------------------------------------------------------------------------------------------------------------------------------------- * @file irsnd.c * - * Copyright (c) 2010-2013 Frank Meyer - frank(at)fli4l.de + * Copyright (c) 2010-2014 Frank Meyer - frank(at)fli4l.de * - * Supported mikrocontrollers: + * Supported AVR mikrocontrollers: * * ATtiny87, ATtiny167 * ATtiny45, ATtiny85 @@ -13,7 +13,7 @@ * ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284, ATmega1284P * ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P * - * $Id: irsnd.c,v 1.77 2014/07/09 14:45:56 fm Exp $ + * $Id: irsnd.c,v 1.82 2014/09/15 10:27:38 fm Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -193,6 +193,9 @@ #define SAMSUNG32_AUTO_REPETITION_PAUSE_LEN (uint16_t)(F_INTERRUPTS * SAMSUNG32_AUTO_REPETITION_PAUSE_TIME + 0.5) // use uint16_t! #define SAMSUNG32_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * SAMSUNG32_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t! +#define SAMSUNG48_AUTO_REPETITION_PAUSE_LEN (uint16_t)(F_INTERRUPTS * SAMSUNG48_AUTO_REPETITION_PAUSE_TIME + 0.5) // use uint16_t! +#define SAMSUNG48_FRAME_REPEAT_PAUSE_LEN (uint16_t)(F_INTERRUPTS * SAMSUNG48_FRAME_REPEAT_PAUSE_TIME + 0.5) // use uint16_t! + #define MATSUSHITA_START_BIT_PULSE_LEN (uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PULSE_TIME + 0.5) #define MATSUSHITA_START_BIT_PAUSE_LEN (uint8_t)(F_INTERRUPTS * MATSUSHITA_START_BIT_PAUSE_TIME + 0.5) #define MATSUSHITA_PULSE_LEN (uint8_t)(F_INTERRUPTS * MATSUSHITA_PULSE_TIME + 0.5) @@ -502,14 +505,34 @@ irsnd_off (void) * @details sets pwm frequency *--------------------------------------------------------------------------------------------------------------------------------------------------- */ +#if defined(__12F1840) +extern void pwm_init(uint16_t freq); +#include +#endif + static void irsnd_set_freq (IRSND_FREQ_TYPE freq) { #ifndef ANALYZE -# if defined(PIC_C18) // PIC C18 - OpenPWM(freq); - SetDCPWM( (uint16_t) (freq * 2) + 1); // freq*2 = Duty cycles 50% - PWMoff(); +# if defined(PIC_C18) // PIC C18 or XC8 +# if defined(__12F1840) // XC8 + TRISA2=0; + PR2=freq; + CCP1M0=1; + CCP1M1=1; + CCP1M2=1; + CCP1M3=1; + DC1B0=1; + DC1B1=0; + CCPR1L = 0b01101001; + TMR2IF = 0; + TMR2ON=1; + CCP1CON &=(~0b0011); // p 197 "active high" +# else // PIC C18 + OpenPWM(freq); + SetDCPWM( (uint16_t) (freq * 2) + 1); // freq*2 = Duty cycles 50% +# endif + PWMoff(); # elif defined (ARM_STM32) // STM32 static uint32_t TimeBaseFreq = 0; @@ -575,8 +598,10 @@ void irsnd_init (void) { #ifndef ANALYZE -# if defined(PIC_C18) // PIC C18 +# if defined(PIC_C18) // PIC C18 or XC8 compiler +# if ! defined(__12F1840) // only C18: OpenTimer; +# endif irsnd_set_freq (IRSND_FREQ_36_KHZ); // default frequency IRSND_PIN = 0; // set IO to outout PWMoff(); @@ -590,6 +615,7 @@ irsnd_init (void) RCC_AHBPeriphClockCmd(IRSND_PORT_RCC, ENABLE); # elif defined (ARM_STM32F10X) RCC_APB2PeriphClockCmd(IRSND_PORT_RCC, ENABLE); + // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // only in case of remapping, not necessary for default port-timer mapping # elif defined (ARM_STM32F4XX) RCC_AHB1PeriphClockCmd(IRSND_PORT_RCC, ENABLE); # endif @@ -607,7 +633,7 @@ irsnd_init (void) GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(IRSND_PORT, &GPIO_InitStructure); - GPIO_PinRemapConfig(, ENABLE); // TODO: remapping required + // GPIO_PinRemapConfig(GPIO_*Remap*_TIM[IRSND_TIMER_NUMBER], ENABLE); // only in case of remapping, not necessary for default port-timer mapping # endif /* TIMx clock enable */ @@ -888,6 +914,22 @@ irsnd_send_data (IRMP_DATA * irmp_data_p, uint8_t do_wait) break; } #endif +#if IRSND_SUPPORT_SAMSUNG48_PROTOCOL == 1 + case IRMP_SAMSUNG48_PROTOCOL: + { + address = bitsrevervse (irmp_data_p->address, SAMSUNG_ADDRESS_LEN); + command = bitsrevervse (irmp_data_p->command, 16); + + irsnd_buffer[0] = (address & 0xFF00) >> 8; // AAAAAAAA + irsnd_buffer[1] = (address & 0x00FF); // AAAAAAAA + irsnd_buffer[2] = ((command & 0xFF00) >> 8); // CCCCCCCC + irsnd_buffer[3] = ~((command & 0xFF00) >> 8); // cccccccc + irsnd_buffer[4] = (command & 0x00FF); // CCCCCCCC + irsnd_buffer[5] = ~(command & 0x00FF); // cccccccc + irsnd_busy = TRUE; + break; + } +#endif #if IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 case IRMP_MATSUSHITA_PROTOCOL: { @@ -1496,6 +1538,24 @@ irsnd_ISR (void) break; } #endif +#if IRSND_SUPPORT_SAMSUNG48_PROTOCOL == 1 + case IRMP_SAMSUNG48_PROTOCOL: + { + startbit_pulse_len = SAMSUNG_START_BIT_PULSE_LEN; + startbit_pause_len = SAMSUNG_START_BIT_PAUSE_LEN - 1; + pulse_1_len = SAMSUNG_PULSE_LEN; + pause_1_len = SAMSUNG_1_PAUSE_LEN - 1; + pulse_0_len = SAMSUNG_PULSE_LEN; + pause_0_len = SAMSUNG_0_PAUSE_LEN - 1; + has_stop_bit = SAMSUNG_STOP_BIT; + complete_data_len = SAMSUNG48_COMPLETE_DATA_LEN; + n_auto_repetitions = SAMSUNG48_FRAMES; // 1 frame + auto_repetition_pause_len = SAMSUNG48_AUTO_REPETITION_PAUSE_LEN; // 47 ms pause + repeat_frame_pause_len = SAMSUNG48_FRAME_REPEAT_PAUSE_LEN; + irsnd_set_freq (IRSND_FREQ_38_KHZ); + break; + } +#endif #if IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 case IRMP_MATSUSHITA_PROTOCOL: { @@ -1968,6 +2028,9 @@ irsnd_ISR (void) case IRMP_SAMSUNG_PROTOCOL: case IRMP_SAMSUNG32_PROTOCOL: #endif +#if IRSND_SUPPORT_SAMSUNG48_PROTOCOL == 1 + case IRMP_SAMSUNG48_PROTOCOL: +#endif #if IRSND_SUPPORT_MATSUSHITA_PROTOCOL == 1 case IRMP_MATSUSHITA_PROTOCOL: #endif @@ -2054,7 +2117,7 @@ irsnd_ISR (void) if (current_bit < SAMSUNG_ADDRESS_LEN) // send address bits { pulse_len = SAMSUNG_PULSE_LEN; - pause_len = (irsnd_buffer[current_bit / 8] & (1<<(7-(current_bit % 8)))) ? + pause_len = (irsnd_buffer[current_bit >> 3] & (1<<(7-(current_bit & 7)))) ? (SAMSUNG_1_PAUSE_LEN - 1) : (SAMSUNG_0_PAUSE_LEN - 1); } else if (current_bit == SAMSUNG_ADDRESS_LEN) // send SYNC bit (16th bit) @@ -2067,7 +2130,7 @@ irsnd_ISR (void) uint8_t cur_bit = current_bit - 1; // sync skipped, offset = -1 ! pulse_len = SAMSUNG_PULSE_LEN; - pause_len = (irsnd_buffer[cur_bit / 8] & (1<<(7-(cur_bit % 8)))) ? + pause_len = (irsnd_buffer[cur_bit >> 3] & (1<<(7-(cur_bit & 7)))) ? (SAMSUNG_1_PAUSE_LEN - 1) : (SAMSUNG_0_PAUSE_LEN - 1); } } @@ -2080,7 +2143,7 @@ irsnd_ISR (void) if (current_bit < NEC16_ADDRESS_LEN) // send address bits { pulse_len = NEC_PULSE_LEN; - pause_len = (irsnd_buffer[current_bit / 8] & (1<<(7-(current_bit % 8)))) ? + pause_len = (irsnd_buffer[current_bit >> 3] & (1<<(7-(current_bit & 7)))) ? (NEC_1_PAUSE_LEN - 1) : (NEC_0_PAUSE_LEN - 1); } else if (current_bit == NEC16_ADDRESS_LEN) // send SYNC bit (8th bit) @@ -2093,7 +2156,7 @@ irsnd_ISR (void) uint8_t cur_bit = current_bit - 1; // sync skipped, offset = -1 ! pulse_len = NEC_PULSE_LEN; - pause_len = (irsnd_buffer[cur_bit / 8] & (1<<(7-(cur_bit % 8)))) ? + pause_len = (irsnd_buffer[cur_bit >> 3] & (1<<(7-(cur_bit & 7)))) ? (NEC_1_PAUSE_LEN - 1) : (NEC_0_PAUSE_LEN - 1); } } @@ -2125,7 +2188,7 @@ irsnd_ISR (void) } else if (current_bit < BANG_OLUFSEN_COMPLETE_DATA_LEN) // send n'th bit { - uint8_t cur_bit_value = (irsnd_buffer[current_bit / 8] & (1<<(7-(current_bit % 8)))) ? 1 : 0; + uint8_t cur_bit_value = (irsnd_buffer[current_bit >> 3] & (1<<(7-(current_bit & 7)))) ? 1 : 0; pulse_len = BANG_OLUFSEN_PULSE_LEN; if (cur_bit_value == last_bit_value) @@ -2141,7 +2204,7 @@ irsnd_ISR (void) } else #endif - if (irsnd_buffer[current_bit / 8] & (1<<(7-(current_bit % 8)))) + if (irsnd_buffer[current_bit >> 3] & (1<<(7-(current_bit & 7)))) { pulse_len = pulse_1_len; pause_len = pause_1_len; @@ -2308,7 +2371,7 @@ irsnd_ISR (void) { pulse_len = GRUNDIG_NOKIA_IR60_BIT_LEN; pause_len = GRUNDIG_NOKIA_IR60_BIT_LEN; - first_pulse = (irsnd_buffer[current_bit / 8] & (1<<(7-(current_bit % 8)))) ? TRUE : FALSE; + first_pulse = (irsnd_buffer[current_bit >> 3] & (1<<(7-(current_bit & 7)))) ? TRUE : FALSE; } } else // if (irsnd_protocol == IRMP_RC5_PROTOCOL || irsnd_protocol == IRMP_RC6_PROTOCOL || irsnd_protocol == IRMP_RC6A_PROTOCOL || @@ -2368,7 +2431,7 @@ irsnd_ISR (void) } } #endif - first_pulse = (irsnd_buffer[current_bit / 8] & (1<<(7-(current_bit % 8)))) ? TRUE : FALSE; + first_pulse = (irsnd_buffer[current_bit >> 3] & (1<<(7-(current_bit & 7)))) ? TRUE : FALSE; } if (irsnd_protocol == IRMP_RC5_PROTOCOL)