]> cloudbase.mooo.com Git - irmp.git/blame - main.c
Version 2.9.7: added port to to ESP8266 and TEENSY, added PANASONIC protocol, added...
[irmp.git] / main.c
CommitLineData
4225a882 1/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
2 * main.c - demo main module to test irmp decoder\r
3 *\r
0834784c 4 * Copyright (c) 2009-2015 Frank Meyer - frank(at)fli4l.de\r
4225a882 5 *\r
ad4d3d41 6 * $Id: main.c,v 1.27 2015/02/27 10:19:20 fm Exp $\r
cb8474cc 7 *\r
775fabfa 8 * This demo module is runnable on AVRs and LM4F120 Launchpad (ARM Cortex M4)\r
4225a882 9 *\r
775fabfa 10 * ATMEGA88 @ 8 MHz internal RC Osc with BODLEVEL 4.3V: lfuse: 0xE2 hfuse: 0xDC efuse: 0xF9\r
11 * ATMEGA88 @ 8 MHz external Crystal Osc with BODLEVEL 4.3V: lfuse: 0xFF hfuse: 0xDC efuse: 0xF9\r
4225a882 12 *\r
13 * This program is free software; you can redistribute it and/or modify\r
14 * it under the terms of the GNU General Public License as published by\r
15 * the Free Software Foundation; either version 2 of the License, or\r
16 * (at your option) any later version.\r
17 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
18 */\r
19\r
1f54e86c 20#include "irmp.h"\r
4225a882 21\r
22#ifndef F_CPU\r
061e654c 23#error F_CPU unknown\r
4225a882 24#endif\r
25\r
775fabfa 26/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
27 * ATMEL AVR part:\r
28 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
29 */\r
30#if defined (ATMEL_AVR)\r
31\r
622f5f59 32#include "irmp.h"\r
33#define BAUD 9600L\r
34#include <util/setbaud.h>\r
35\r
36#ifdef UBRR0H\r
37\r
38#define UART0_UBRRH UBRR0H\r
39#define UART0_UBRRL UBRR0L\r
40#define UART0_UCSRA UCSR0A\r
41#define UART0_UCSRB UCSR0B\r
42#define UART0_UCSRC UCSR0C\r
43#define UART0_UDRE_BIT_VALUE (1<<UDRE0)\r
44#define UART0_UCSZ1_BIT_VALUE (1<<UCSZ01)\r
45#define UART0_UCSZ0_BIT_VALUE (1<<UCSZ00)\r
46#ifdef URSEL0\r
47#define UART0_URSEL_BIT_VALUE (1<<URSEL0)\r
48#else\r
49#define UART0_URSEL_BIT_VALUE (0)\r
50#endif\r
51#define UART0_TXEN_BIT_VALUE (1<<TXEN0)\r
52#define UART0_UDR UDR0\r
53#define UART0_U2X U2X0\r
061e654c 54\r
622f5f59 55#else\r
56\r
57#define UART0_UBRRH UBRRH\r
58#define UART0_UBRRL UBRRL\r
59#define UART0_UCSRA UCSRA\r
60#define UART0_UCSRB UCSRB\r
61#define UART0_UCSRC UCSRC\r
62#define UART0_UDRE_BIT_VALUE (1<<UDRE)\r
63#define UART0_UCSZ1_BIT_VALUE (1<<UCSZ1)\r
64#define UART0_UCSZ0_BIT_VALUE (1<<UCSZ0)\r
65#ifdef URSEL\r
66#define UART0_URSEL_BIT_VALUE (1<<URSEL)\r
67#else\r
68#define UART0_URSEL_BIT_VALUE (0)\r
69#endif\r
70#define UART0_TXEN_BIT_VALUE (1<<TXEN)\r
71#define UART0_UDR UDR\r
72#define UART0_U2X U2X\r
73\r
74#endif //UBRR0H\r
75\r
76static void\r
77uart_init (void)\r
78{\r
79 UART0_UBRRH = UBRRH_VALUE; // set baud rate\r
80 UART0_UBRRL = UBRRL_VALUE;\r
81\r
82#if USE_2X\r
83 UART0_UCSRA |= (1<<UART0_U2X);\r
84#else\r
85 UART0_UCSRA &= ~(1<<UART0_U2X);\r
86#endif\r
87\r
88 UART0_UCSRC = UART0_UCSZ1_BIT_VALUE | UART0_UCSZ0_BIT_VALUE | UART0_URSEL_BIT_VALUE;\r
89 UART0_UCSRB |= UART0_TXEN_BIT_VALUE; // enable UART TX\r
90}\r
91\r
92static void\r
93uart_putc (unsigned char ch)\r
94{\r
95 while (!(UART0_UCSRA & UART0_UDRE_BIT_VALUE))\r
96 {\r
97 ;\r
98 }\r
99\r
100 UART0_UDR = ch;\r
101}\r
102\r
103static void\r
104uart_puts (char * s)\r
105{\r
106 while (*s)\r
107 {\r
108 uart_putc (*s);\r
109 s++;\r
110 }\r
111}\r
112\r
113static void\r
114uart_puts_P (PGM_P s)\r
115{\r
116 uint8_t ch;\r
117\r
118 while ((ch = pgm_read_byte(s)) != '\0')\r
119 {\r
120 uart_putc (ch);\r
121 s++;\r
122 }\r
123}\r
124\r
ad4d3d41 125static char *\r
126itoh (char * buf, uint8_t digits, uint16_t number)\r
622f5f59 127{\r
ad4d3d41 128 for (buf[digits] = 0; digits--; number >>= 4)\r
622f5f59 129 {\r
ad4d3d41 130 buf[digits] = "0123456789ABCDEF"[number & 0x0F];\r
622f5f59 131 }\r
ad4d3d41 132 return buf;\r
622f5f59 133}\r
134\r
135static void\r
1f54e86c 136timer1_init (void)\r
4225a882 137{\r
476267f4 138#if defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__) // ATtiny45 / ATtiny85:\r
0f700c8e 139\r
140#if F_CPU >= 16000000L\r
141 OCR1C = (F_CPU / F_INTERRUPTS / 8) - 1; // compare value: 1/15000 of CPU frequency, presc = 8\r
142 TCCR1 = (1 << CTC1) | (1 << CS12); // switch CTC Mode on, set prescaler to 8\r
143#else\r
764bd2bc 144 OCR1C = (F_CPU / F_INTERRUPTS / 4) - 1; // compare value: 1/15000 of CPU frequency, presc = 4\r
7644ac04 145 TCCR1 = (1 << CTC1) | (1 << CS11) | (1 << CS10); // switch CTC Mode on, set prescaler to 4\r
0f700c8e 146#endif\r
147\r
7644ac04 148#else // ATmegaXX:\r
149 OCR1A = (F_CPU / F_INTERRUPTS) - 1; // compare value: 1/15000 of CPU frequency\r
150 TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1\r
1f54e86c 151#endif\r
4225a882 152\r
775fabfa 153#ifdef TIMSK1\r
7644ac04 154 TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
775fabfa 155#else\r
7644ac04 156 TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare\r
1f54e86c 157#endif\r
4225a882 158}\r
159\r
7644ac04 160#ifdef TIM1_COMPA_vect // ATtiny84\r
775fabfa 161#define COMPA_VECT TIM1_COMPA_vect\r
7644ac04 162#else\r
775fabfa 163#define COMPA_VECT TIMER1_COMPA_vect // ATmega\r
7644ac04 164#endif\r
775fabfa 165\r
166ISR(COMPA_VECT) // Timer1 output compare A interrupt service routine, called every 1/15000 sec\r
7644ac04 167{\r
168 (void) irmp_ISR(); // call irmp ISR\r
169 // call other timer interrupt routines...\r
170}\r
171\r
775fabfa 172int\r
173main (void)\r
174{\r
622f5f59 175 IRMP_DATA irmp_data;\r
176 char buf[3];\r
775fabfa 177\r
178 irmp_init(); // initialize irmp\r
179 timer1_init(); // initialize timer1\r
622f5f59 180 uart_init(); // initialize uart\r
181\r
775fabfa 182 sei (); // enable interrupts\r
183\r
184 for (;;)\r
185 {\r
186 if (irmp_get_data (&irmp_data))\r
187 {\r
622f5f59 188 uart_puts_P (PSTR("protocol: 0x"));\r
ad4d3d41 189 itoh (buf, 2, irmp_data.protocol);\r
622f5f59 190 uart_puts (buf);\r
191\r
192#if IRMP_PROTOCOL_NAMES == 1\r
193 uart_puts_P (PSTR(" "));\r
f07dac6b 194 uart_puts_P (pgm_read_word (&(irmp_protocol_names[irmp_data.protocol])));\r
622f5f59 195#endif\r
196\r
197 uart_puts_P (PSTR(" address: 0x"));\r
ad4d3d41 198 itoh (buf, 4, irmp_data.address);\r
622f5f59 199 uart_puts (buf);\r
200\r
201 uart_puts_P (PSTR(" command: 0x"));\r
ad4d3d41 202 itoh (buf, 4, irmp_data.command);\r
622f5f59 203 uart_puts (buf);\r
204\r
205 uart_puts_P (PSTR(" flags: 0x"));\r
ad4d3d41 206 itoh (buf, 2, irmp_data.flags);\r
622f5f59 207 uart_puts (buf);\r
208\r
209 uart_puts_P (PSTR("\r\n"));\r
775fabfa 210 }\r
211 }\r
212}\r
213\r
214/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
215 * LM4F120 Launchpad (ARM Cortex M4):\r
216 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
217 */\r
218#elif defined(STELLARIS_ARM_CORTEX_M4)\r
219\r
220void\r
221timer1_init (void)\r
222{\r
223 SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);\r
224 TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_PER);\r
225\r
226 TimerLoadSet(TIMER1_BASE, TIMER_A, (F_CPU / F_INTERRUPTS) -1);\r
227 IntEnable(INT_TIMER1A);\r
228 TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT);\r
229 TimerEnable(TIMER1_BASE, TIMER_A);\r
230 // Important: Timer1IntHandler has to be configured in startup_ccs.c !\r
231}\r
232\r
233void\r
234Timer1IntHandler(void) // Timer1 Interrupt Handler\r
235{\r
236 (void) irmp_ISR(); // call irmp ISR\r
237 // call other timer interrupt routines...\r
238}\r
7644ac04 239\r
4225a882 240int\r
241main (void)\r
242{\r
1f54e86c 243 IRMP_DATA irmp_data;\r
4225a882 244\r
afd1e690 245 ROM_FPUEnable();\r
246 ROM_FPUStackingEnable();\r
247 ROM_SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);\r
afd1e690 248\r
1f54e86c 249 irmp_init(); // initialize irmp\r
775fabfa 250 timer1_init(); // initialize timer1\r
1f54e86c 251 sei (); // enable interrupts\r
4225a882 252\r
1f54e86c 253 for (;;)\r
4225a882 254 {\r
1f54e86c 255 if (irmp_get_data (&irmp_data))\r
256 {\r
257 // ir signal decoded, do something here...\r
258 // irmp_data.protocol is the protocol, see irmp.h\r
259 // irmp_data.address is the address/manufacturer code of ir sender\r
260 // irmp_data.command is the command code\r
261 // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)\r
262 }\r
4225a882 263 }\r
4225a882 264}\r
775fabfa 265\r
4a7dc859 266/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
267 * PIC18F4520 with XC8 compiler:\r
268 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
269 */\r
270#elif defined (__XC8)\r
271\r
272#define _XTAL_FREQ 32000000UL // 32MHz clock\r
273#define FOSC _XTAL_FREQ\r
274#define FCY FOSC / 4UL // --> 8MHz\r
275\r
276#define BAUDRATE 19200UL\r
277#define BRG (( FCY 16 BAUDRATE ) -1UL)\r
278\r
279#include <stdio.h>\r
280#include <stdlib.h>\r
281\r
282int\r
283main (void)\r
284{\r
285 IRMP_DATA irmp_data;\r
286\r
287 irmp_init(); // initialize irmp\r
288\r
289 // infinite loop, interrupts will blink PORTD pins and handle UART communications.\r
290 while (1)\r
291 {\r
292 LATBbits.LATB0 = ~LATBbits.LATB0;\r
293\r
294 if (irmp_get_data (&irmp_data))\r
295 {\r
296 // ir signal decoded, do something here...\r
297 // irmp_data.protocol is the protocol, see irmp.h\r
298 // irmp_data.address is the address/manufacturer code of ir sender\r
299 // irmp_data.command is the command code\r
300 // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)\r
301 printf("proto %d addr %d cmd %d\n", irmp_data.protocol, irmp_data.address, irmp_data.command );\r
302 }\r
303 }\r
304}\r
305\r
306void interrupt high_priority high_isr(void)\r
307{\r
308 if (TMR2IF)\r
309 {\r
310 TMR2IF = 0; // clear Timer 0 interrupt flag\r
311 irmp_ISR();\r
312 }\r
313}\r
314\r
622f5f59 315/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
316 * STM32:\r
317 *---------------------------------------------------------------------------------------------------------------------------------------------------\r
318 */\r
319#elif defined(ARM_STM32)\r
320\r
321uint32_t\r
322SysCtlClockGet(void)\r
323{\r
324 RCC_ClocksTypeDef RCC_ClocksStatus;\r
325 RCC_GetClocksFreq(&RCC_ClocksStatus);\r
326 return RCC_ClocksStatus.SYSCLK_Frequency;\r
327}\r
328\r
329void\r
330timer2_init (void)\r
331{\r
332 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;\r
333 NVIC_InitTypeDef NVIC_InitStructure;\r
334 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);\r
335\r
336 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;\r
337 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;\r
338 TIM_TimeBaseStructure.TIM_Period = 7;\r
339 TIM_TimeBaseStructure.TIM_Prescaler = ((F_CPU / F_INTERRUPTS)/8) - 1;\r
340 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);\r
341\r
342 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);\r
343\r
344 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;\r
345 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;\r
346 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;\r
347 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;\r
348 NVIC_Init(&NVIC_InitStructure);\r
349\r
350 TIM_Cmd(TIM2, ENABLE);\r
351}\r
352\r
353void\r
354TIM2_IRQHandler(void) // Timer2 Interrupt Handler\r
355{\r
356 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);\r
357 (void) irmp_ISR(); // call irmp ISR\r
358 // call other timer interrupt routines...\r
359}\r
360\r
361int\r
362main (void)\r
363{\r
364 IRMP_DATA irmp_data;\r
365 \r
366 irmp_init(); // initialize irmp\r
367 timer2_init(); // initialize timer2\r
368\r
369 for (;;)\r
370 {\r
371 if (irmp_get_data (&irmp_data))\r
372 {\r
373 // ir signal decoded, do something here...\r
374 // irmp_data.protocol is the protocol, see irmp.h\r
375 // irmp_data.address is the address/manufacturer code of ir sender\r
376 // irmp_data.command is the command code\r
377 // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)\r
378 }\r
379 }\r
380}\r
775fabfa 381#endif\r