From 4225a882583e3f3f35b5a9ee652d204338059b61 Mon Sep 17 00:00:00 2001 From: ukw Date: Wed, 24 Mar 2010 11:56:05 +0000 Subject: 1st checkin, version 1.0 git-svn-id: svn://mikrocontroller.net/irmp@1 aeb2e35e-bfc4-4214-b83c-9e8de998ed28 --- main.c | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 main.c (limited to 'main.c') diff --git a/main.c b/main.c new file mode 100644 index 0000000..2e05660 --- /dev/null +++ b/main.c @@ -0,0 +1,179 @@ +/*--------------------------------------------------------------------------------------------------------------------------------------------------- + * main.c - demo main module to test irmp decoder + * + * Copyright (c) 2009-2010 Frank Meyer - frank(at)fli4l.de + * + * ATMEGA88 @ 8 MHz + * + * Fuses: lfuse: 0xE2 hfuse: 0xDC efuse: 0xF9 + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + *--------------------------------------------------------------------------------------------------------------------------------------------------- + */ + +/*--------------------------------------------------------------------------------------------------------------------------------------------------- + * uncomment this for codevision compiler: + *--------------------------------------------------------------------------------------------------------------------------------------------------- + */ +// #define CODEVISION // to use Codevision Compiler instead of gcc + +#ifdef CODEVISION +#include +#include +#define uint8_t unsigned char +#define uint16_t unsigned int +#define F_CPU 8000000 // change for Codevision here, if you use WinAVR, use Project -> Configuration Options instead + +// register values from datasheet for ATMega88 +#define OCIE1A 1 +#define WGM12 3 +#define CS10 0 +#define UDRE0 5 +#define TXEN0 3 + +#include "irmp.h" +#include "irmp.c" + +#else // gcc compiler + +#include +#include +#include +#include +#include +#include "irmp.h" + +#endif // CODEVISION + + +#ifndef F_CPU +#error F_CPU unkown +#endif + +void +timer_init (void) +{ +#ifdef CODEVISION + OCR1AH = ((F_CPU / F_INTERRUPTS) >> 8) & 0xFF; // compare value: 1/10000 of CPU frequency (upper byte) + OCR1AL = ((F_CPU / F_INTERRUPTS) - 1) & 0xFF; // compare value: 1/10000 of CPU frequency (lower byte) +#else // gcc + OCR1A = (F_CPU / F_INTERRUPTS) - 1; // compare value: 1/10000 of CPU frequency +#endif // CODEVISION + TCCR1B = (1 << WGM12) | (1 << CS10); // switch CTC Mode on, set prescaler to 1 + +#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega64__) || defined (__AVR_ATmega162__) + TIMSK = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare +#else + TIMSK1 = 1 << OCIE1A; // OCIE1A: Interrupt by timer compare +#endif // __AVR... +} + +/*--------------------------------------------------------------------------------------------------------------------------------------------------- + * timer 1 compare handler, called every 1/10000 sec + *--------------------------------------------------------------------------------------------------------------------------------------------------- + */ +// Timer 1 output compare A interrupt service routine +#ifdef CODEVISION +interrupt [TIM1_COMPA] void timer1_compa_isr(void) +#else // CODEVISION +ISR(TIMER1_COMPA_vect) +#endif // CODEVISION +{ + irmp_ISR(); // call irmp ISR + // call other timer interrupt routines... +} + +/*--------------------------------------------------------------------------------------------------------------------------------------------------- + * MAIN: main routine + *--------------------------------------------------------------------------------------------------------------------------------------------------- + */ +#ifdef CODEVISION +// This is the main routine if you use Codevision C Compiler +void +main (void) +{ + IRMP_DATA irmp_data; + + #pragma optsize- + // crystal oscillator division factor: 1 + CLKPR=0x80; + CLKPR=0x00; + #ifdef _OPTIMIZE_SIZE_ + #pragma optsize+ + #endif + static uint8_t *Proto[]={"SIRCS","NEC","SAMSUNG","MATSUSH","KASEIKYO","RECS80","RC5(x)","DENON","RC6","SAMSG32","APPLE"}; + #define IRMP_APPLE_ADDRESS 0x77E1 + + + #if IRMP_LOGGING == 0 + // USART initialization has to be done here if Logging is off + // Communication Parameters: 8 Data, 1 Stop, No Parity + // USART Receiver: Off + // USART Transmitter: On + // USART0 Mode: Asynchronous + // USART Baud Rate: 9600 + #define BAUDRATE 9600L + UCSR0A=0x00; + UCSR0B=0x08; + UCSR0C=0x06; + UBRR0H = ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1) >> 8; // store baudrate (upper byte) + UBRR0L = ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1) & 0xFF; + #endif + + irmp_init(); // initialize rc5 + + printf("IRMP V1.0\n"); + #if IRMP_LOGGING == 1 + printf("Logging Mode\n"); + #endif + + timer_init(); // initialize timer + #asm("sei"); // enable interrupts + + for (;;) + { + if (irmp_get_data (&irmp_data)) + { + // ir signal decoded, do something here... + // irmp_data.protocol is the protocol, see irmp.h + // irmp_data.address is the address/manufacturer code of ir sender + // irmp_data.command is the command code + #if IRMP_LOGGING != 1 + if((irmp_data.protocol == IRMP_NEC_PROTOCOL) && (irmp_data.address == IRMP_APPLE_ADDRESS)) + printf("Code: Apple\n"); + else printf("Code: %s\n",Proto[irmp_data.protocol-1]); + printf("Address: 0x%.2X\n",irmp_data.address); + printf("Command: 0x%.2X\n\n",irmp_data.command); + #endif + } + } +} + +#else // gcc + +// This is the main routine if you use GCC Compiler +int +main (void) +{ + IRMP_DATA irmp_data; + + irmp_init(); // initialize rc5 + timer_init(); // initialize timer + sei (); // enable interrupts + + for (;;) + { + if (irmp_get_data (&irmp_data)) + { + // ir signal decoded, do something here... + // irmp_data.protocol is the protocol, see irmp.h + // irmp_data.address is the address/manufacturer code of ir sender + // irmp_data.command is the command code + } + } +} + +#endif // CODEVISION / gcc -- cgit v1.2.3