]> cloudbase.mooo.com Git - irmp.git/blame - irmp-main-pic-12F1840.c
Version 3.0: corrected ESP8266 port, added MBED port, added several main example...
[irmp.git] / irmp-main-pic-12F1840.c
CommitLineData
a2ddd841 1/*---------------------------------------------------------------------------------------------------------------------------------------------------\r
2a774a84 2 * main_pic12f1840.c - example main module for PIC 12f1840\r
a2ddd841 3 * \r
4 * IR decoder using IRMP\r
5 *\r
2a774a84 6 * (c) 2014 Wolfgang Strobl (news4 at mystrobl.de) 2014-03-12:2014-07-20\r
a2ddd841 7 *\r
8 * This demo module is runnable on a Microchip PIC 12F1840\r
9 *\r
10 * To be used with IRMP by Frank Meyer (frank(at)fli4l.de)\r
11 * <http://www.mikrocontroller.net/articles/IRMP>\r
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
20 \r
21/* \r
2a774a84 22\r
23Hauptprogramm fuer den nachfolgenden Testaufbau, bestehend aus zwei mal \r
24\r
25\r
26 TSOP1736+ PIC12F1840\r
27 | __\r
28 1k | Vdd--o| o|o--Vss\r
29 ___ +--GP5--o| |o--GP0 / ICSPDAT\r
30RS232 out -|___|-------GP4--o| |o--GP1 / ICSPCLK ___ LED\r
31RS232 in -|___|---Vpp/GP3--o|__|o--GP2-----------|___|- ->|---Vss\r
32 10k\r
33 \r
34auf einem Steckbrett. (Genauer gesagt, dies ist die aktuelle Beschaltung\r
35fuer V1.8, V1.0 ist aber bzgl. IRMP-Empfang funktional identisch. Nicht eingezeichnet\r
36ist ein Abblockkondensator von 100nF ueber Vss und Vdd.\r
37\r
38Uebersetzt mit Microchip MPLAB XC8 C Compiler (Free Mode) V1.31 \r
39im stark gecrippelten "Free Mode".\r
40\r
41Memory Summary: (V 1.8)\r
42 Program space used C6Fh ( 3183) of 1000h words ( 77.7%)\r
43 Data space used 9Bh ( 155) of 100h bytes ( 60.5%)\r
44 EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)\r
45 Data stack space used 0h ( 0) of 5Eh bytes ( 0.0%)\r
46 Configuration bits used 2h ( 2) of 2h words (100.0%)\r
47 ID Location space used 0h ( 0) of 4h bytes ( 0.0%)\r
48\r
49\r
50Testaufbau: \r
51\r
52Zwei Steckbretter,\r
53urspruengliche Version des Programms als Empfaenger, \r
54aktuelle Version als Sender, Aufzeichnung mit putty,\r
55angeschlossen jeweils per USB2RS232-Kabel von Conrad\r
56(972543, basierend auf Prolific PL2303). Soft-UART \r
57fuer Input, da 12F1820 keine Kontrolle ueber Input-\r
58Polaritaet erlaubt und ich fuer Testaufbauten eine\r
59Minimalbeschaltung bevorzuge.\r
60\r
61Kurze Distanz\r
62(~30 cm) zwischen Sender und Empfaenger), keine genaue Ausrichtung.\r
63Stromversorgung wahlwweise mit 5V via PICkit 2 oder 3x1.2V NiMH-AA.\r
64\r
65Zunaechst \r
66CD TAPE TUNER AUX OFF mit Philips FB, \r
67OFF mit VAOVA TV-2900HDD FB\r
68dann Eingabe . und n beim Sender.\r
69\r
70Sender:\r
71\r
72IRMP PIC 12F1840 1.8 ws\r
73P 7 a=0x0014 c=0x003f f=0x00 (RC5)\r
74P 7 a=0x0014 c=0x003f f=0x01 (RC5)\r
75P 7 a=0x0012 c=0x003f f=0x00 (RC5)\r
76P 7 a=0x0011 c=0x003f f=0x00 (RC5)\r
77P 7 a=0x0015 c=0x003f f=0x00 (RC5)\r
78P 7 a=0x0015 c=0x000c f=0x00 (RC5)\r
79P 2 a=0xbf00 c=0x0059 f=0x00 (NEC)\r
80P 2 a=0xbf00 c=0x0059 f=0x01 (NEC)\r
81. MX115OFF PR2 221\r
82n NEC PR2 209\r
83\r
84Empfaenger:\r
85\r
86IRMP PIC 12F1840 1.0 ws\r
87P 7 a=0x0014 c=0x003f f=0x00 (RC5)\r
88P 7 a=0x0014 c=0x003f f=0x01 (RC5)\r
89P 7 a=0x0012 c=0x003f f=0x00 (RC5)\r
90P 7 a=0x0011 c=0x003f f=0x00 (RC5)\r
91P 7 a=0x0015 c=0x000c f=0x00 (RC5)\r
92P 2 a=0xbf00 c=0x0059 f=0x00 (NEC)\r
93P 2 a=0xbf00 c=0x0059 f=0x01 (NEC)\r
94P 7 a=0x0015 c=0x000c f=0x00 (RC5)\r
95P 7 a=0x0015 c=0x000c f=0x01 (RC5)\r
96P 7 a=0x0015 c=0x000c f=0x01 (RC5)\r
97P 2 a=0x0055 c=0x00aa f=0x00 (NEC)\r
98\r
99Die via DSO an der LED gemessenen Frequenzen sind 36.0 resp. 38.0 kHz\r
a2ddd841 100\r
101*/\r
102\r
103#include <stdio.h>\r
104\r
105#include "irmp.h"\r
2a774a84 106#include "irsnd.h"\r
a2ddd841 107\r
108/******************************************************************************/\r
109// "system.h"\r
110/******************************************************************************/\r
111#define SYS_FREQ 32000000L\r
112#define _XTAL_FREQ 32000000 // for _delay\r
113#define FCY (SYS_FREQ/4)\r
114\r
115/******************************************************************************/\r
116// "user.c"\r
117/******************************************************************************/\r
118void InitApp(void)\r
119{\r
120 ANSELA=0;\r
121 TRISA4=0;\r
122 IRCF0=0; // p. 45\r
123 IRCF1=1;\r
124 IRCF2=1;\r
125 IRCF3=1;\r
126 SPLLEN=1; // p 46 and 54 \r
127}\r
128\r
129/******************************************************************************/\r
130// "configuration_bits.c" 12F1848\r
131/******************************************************************************/\r
132// CONFIG1\r
133#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)\r
134#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)\r
135#pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled)\r
136#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)\r
137#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)\r
138#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)\r
139#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)\r
140#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)\r
141#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)\r
142#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)\r
143\r
144// CONFIG2\r
145#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)\r
146#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)\r
147#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)\r
148#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)\r
149#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)\r
150/******************************************************************************/\r
151\r
152/******************************************************************************/\r
153// UART\r
154/******************************************************************************/\r
155\r
2a774a84 156#define GPIO3 RA3 \r
157#define GPIO4 RA4 \r
158\r
159#define SOFTUART_RXPIN GPIO3\r
160#define SOFTUART_STDIO 1\r
161#define SOFTUART_DI 1\r
162\r
a2ddd841 163\r
2a774a84 164#define BAUD 19200 // 38200 ginge auch noch\r
165#define SOFTUART_BAUD BAUD\r
166#include "softuart_pic.h"\r
167\r
168#define kbhit softuartkbhit\r
a2ddd841 169\r
170\r
171void \r
172RS232init(void)\r
173 {\r
174 // Transmit\r
175 TXCKSEL = 1; // put TX on pin 4 - not 0 -, p 102\r
176 SPBRGL = (_XTAL_FREQ/BAUD/64-1); \r
177 SPBRGH = 0;\r
178 BRGH = 0;\r
179 BRG16 = 0;\r
180 // p 259 manual\r
181 SYNC = 0; // 0 p. 267\r
182 SPEN = 1; // 26.1.1.7\r
183 SCKP = 1; // invert p 269\r
184 TXEN = 1;\r
185 }\r
186\r
187 // EUSART transmit\r
188 void \r
189 putch(char c)\r
190 {\r
191 while (!TRMT) _delay(1);\r
192 TXREG=c;\r
193 }\r
194 \r
195/******************************************************************************/\r
196// Timer and ISR\r
197/******************************************************************************/\r
198 \r
199void \r
200timer1_init(void)\r
201{\r
202 // p 154\r
203 TMR1=0xFC00; // p. 155 wait 1024 cycles for stabilization.\r
204 TMR1CS1=0; // Clock source == System Clock\r
205 TMR1CS0=1; \r
206 TMR1IE=1; // enable TMR1 interrupts\r
207 PEIE=1; // enable Pheripheral Interrupts\r
2a774a84 208 TMR1IF=0;\r
209 TMR1ON=1;\r
a2ddd841 210}\r
211\r
212\r
213/******************************************************************************/\r
214// Interrupt handler\r
215/******************************************************************************/\r
216\r
217void interrupt isr(void)\r
218{\r
a2ddd841 219 TMR1=0xffff-_XTAL_FREQ/F_INTERRUPTS; \r
220 TMR1IF=0; // clear timer 1 interrupt\r
2a774a84 221 \r
222 if (!irsnd_ISR())\r
223 {\r
224 irmp_ISR();\r
225 }\r
a2ddd841 226}\r
227\r
2a774a84 228\r
229IRMP_DATA irmp_data;\r
230\r
231void RC5(uint16_t addr,uint16_t cmd, uint8_t repetitions)\r
232{\r
233 irmp_data.protocol = IRMP_RC5_PROTOCOL; \r
234 irmp_data.address = addr;\r
235 irmp_data.command = cmd;\r
236 irmp_data.flags = repetitions;\r
237 irsnd_send_data (&irmp_data, FALSE); \r
238}\r
239\r
240void NEC(int addr,int cmd)\r
241{\r
242 irmp_data.protocol = IRMP_NEC_PROTOCOL; \r
243 irmp_data.address = addr;\r
244 irmp_data.command = cmd;\r
245 irmp_data.flags = 0;\r
246 irsnd_send_data (&irmp_data, FALSE); \r
247}\r
248\r
249\r
a2ddd841 250/******************************************************************************/\r
251// MAIN\r
252/******************************************************************************/\r
253\r
254int\r
255main (void)\r
256{\r
257 IRMP_DATA irmp_data;\r
2a774a84 258 char c;\r
259 InitApp(); \r
260\r
261 PWMoff();\r
a2ddd841 262 RS232init();\r
2a774a84 263 \r
a2ddd841 264 __delay_ms(200);\r
2a774a84 265 printf("IRMP PIC 12F1840 1.8 ws\r\n");\r
266 irmp_init(); // initialize irmp\r
a2ddd841 267 timer1_init(); // initialize timer1\r
268 ei(); // enable interrupts\r
269 TMR1ON=1; // start timer\r
270 \r
271 for (;;)\r
272 {\r
2a774a84 273 if (kbhit())\r
274 {\r
275 c=getch();\r
276 if (c>32 && c<127) putch(c);\r
277 putch(' ');\r
278 if (c=='.')\r
279 {\r
280 printf("MX115OFF ");\r
281 RC5(0x15,0x0c,2); // Philips MC115 AUX OFF\r
282 }\r
283 else if (c=='n')\r
284 {\r
285 printf("NEC ");\r
286 NEC(0x55,0xaa); \r
287 }\r
288 else\r
289 {\r
290 putch('?');\r
291 continue;\r
292 }\r
293 while (irsnd_is_busy ()) ;\r
294 printf("PR2 %d\r\n",PR2);\r
295 continue;\r
296 }\r
a2ddd841 297 if (irmp_get_data (&irmp_data))\r
298 {\r
299 printf("P ");\r
300 printf("%d a=0x%04x c=0x%04x f=0x%02x (",irmp_data.protocol, irmp_data.address,irmp_data.command,irmp_data.flags); \r
301 \r
a2ddd841 302#if IRMP_PROTOCOL_NAMES\r
303 printf(irmp_protocol_names[irmp_data.protocol]);\r
304#else \r
305 switch(irmp_data.protocol)\r
306 {\r
307 case 1:\r
308 printf("Sony");\r
309 break;\r
310 case 2:\r
311 printf("NEC");\r
312 break;\r
313 case 7:\r
314 printf("RC5");\r
315 break;\r
316 case 0x21:\r
317 printf("Ortek");\r
318 break;\r
319 }\r
320#endif\r
321 printf(")\r\n");\r
322 }\r
323 }\r
324}\r