Add lss file for cpp_obj program
[avr_serial_lcd.git] / serial_lcd.h
1 /*****************************************************************************\r
2 ** FILE IDENTIFICATION\r
3 **\r
4 **   Name:          serial_lcd.h\r
5 **   Purpose:       Common header file for serial_lcd.c and serial_lcd.cpp\r
6 **   Programmer:    Kevin Rosenberg <kevin@rosenberg.net> (AVR Freaks member kmr)\r
7 **   Date Started:  Dec 2007\r
8 **\r
9 **   Copyright (c) 2007-2008 by Kevin Rosenberg\r
10 *******************************************************************************/\r
11 \r
12 #ifndef __SERIAL_LCD_H__\r
13 #define __SERIAL_LCD_H__ 1\r
14 \r
15 #ifndef F_CPU\r
16 #define F_CPU 14745600UL\r
17 #endif\r
18 \r
19 #define CONSERVATIVE_ENABLE_DURATION 0\r
20 #define USE_CTS 0\r
21 \r
22 // Set STANDALONE_SOURCE as 1 to compile without KMR's standard header files, using\r
23 // the below excerpts from these files\r
24 #define STANDALONE_SOURCE 1\r
25 #if STANDALONE_SOURCE\r
26 \r
27 #if defined(__GNUC__)\r
28 #include <avr/io.h>\r
29 #include <avr/pgmspace.h>\r
30 #include <avr/sleep.h>\r
31 #include <avr/interrupt.h>\r
32 #include <avr/wdt.h>\r
33 #include <util/delay.h>\r
34 \r
35 typedef struct\r
36 {\r
37   unsigned bit0:1;\r
38   unsigned bit1:1;\r
39   unsigned bit2:1;\r
40   unsigned bit3:1;\r
41   unsigned bit4:1;\r
42   unsigned bit5:1;\r
43   unsigned bit6:1;\r
44   unsigned bit7:1;\r
45 } _io_reg;\r
46 #define REGISTER_BIT(rg,bt) ((volatile _io_reg*)_SFR_MEM_ADDR(rg))->bit##bt\r
47 \r
48 #define FLASH_DECLARE(x) const x __attribute__((progmem))\r
49 #define NO_INIT_DECLARE(x) x __attribute__((section (".noinit")))\r
50 #define INLINE_FUNC_DECLARE(x) inline x __attribute__((always_inline))\r
51 #define PGM_READ_BYTE(x) pgm_read_byte(x)\r
52 #define NOP() asm volatile("nop");\r
53 #define REGISTER_VAR(V,GNU,IAR) register volatile V asm(GNU)\r
54 #define NO_RETURN_FUNC(fn) fn __attribute__((noreturn));        \\r
55 fn\r
56 #define MAIN_FUNC() int main(void) __attribute__((OS_main)); \\r
57 int main(void)\r
58 #define MAIN_FUNC_LAST() return 0\r
59 \r
60 #elif defined(__ICCAVR__)\r
61 #include <ioavr.h>\r
62 #include <intrinsics.h>\r
63 \r
64 // Ensure that register/vector definitions match datasheet/GCC\r
65 #if defined(__ATtiny2313__)\r
66   #if !defined(WDTCSR)\r
67     #define WDTCSR WDTCR\r
68   #endif\r
69   #if defined(USART0_RX_vect) && !defined(USART_RX_vect)\r
70     #define USART_RX_vect USART0_RX_vect\r
71   #endif\r
72 #endif\r
73 \r
74 #define FLASH_DECLARE(x) __flash x\r
75 #define PRAGMA(x) _Pragma(#x)\r
76 #define NO_INIT_DECLARE(x) __no_init x\r
77 #define INLINE_FUNC_DECLARE(x) PRAGMA(inline=forced) \\r
78 inline x\r
79 #define PGM_READ_BYTE(x) (*(x))\r
80 #define NOP() __no_operation();\r
81 #define REGISTER_BIT(rg,bt) rg##_Bit##bt\r
82 #define REGISTER_VAR(V,GNU,IAR) __regvar __no_init V @ ## IAR\r
83 #define ISR(x) PRAGMA(vector=x) \\r
84 __interrupt void x##_handler(void);  \\r
85 __interrupt void x##_handler(void)\r
86 #define NO_RETURN_FUNC(fn) __C_task fn\r
87 #define MAIN_FUNC() __task void main(void)\r
88 #define MAIN_FUNC_LAST()\r
89 #define cli() __disable_interrupt()\r
90 #define sei() __enable_interrupt()\r
91 #define wdt_reset() __watchdog_reset()\r
92 #define _delay_us(us) __delay_cycles((unsigned long)(((us * F_CPU)/1e6) + 0.5))\r
93 #define _delay_ms(ms) __delay_cycles((unsigned long)(((ms * F_CPU)/1e3) + 0.5))\r
94 #define sleep_cpu() __sleep()\r
95 #if defined(__ATtiny2313__)\r
96 #define sleep_enable() MCUCR |= (1<<SE)\r
97 #define sleep_disable() MCUCR &= ~(1<<SE)\r
98 #endif\r
99 typedef __flash unsigned char prog_uint8_t;\r
100 typedef __flash unsigned int prog_uint16_t;\r
101 typedef __flash unsigned int prog_uint32_t;\r
102 \r
103 #elif defined(__IMAGECRAFT__)\r
104 \r
105 // Below #include requires ICC v7.16+\r
106 #include <iccioavr.h>\r
107 \r
108 #define NOP() asm("nop");\r
109 // ImageCraft does not support inline functions\r
110 #define inline\r
111 #define INLINE_FUNC_DECLARE(x) x\r
112 #define NO_RETURN_FUNC(fn) fn\r
113 #define MAIN_FUNC() void main(void)\r
114 #define MAIN_FUNC_LAST()\r
115 // __flash keyword was introduced in Imagecraft v7.15\r
116 #define FLASH_DECLARE(x) __flash x\r
117 #define PGM_READ_BYTE(x) (*(x))\r
118 #define cli() asm("cli")\r
119 #define sei() asm("sei")\r
120 #define wdt_reset() asm("wdr")\r
121 #define sleep_cpu() asm("sleep")\r
122 // Below two definition specific for ATTiny2313 compatible sleep enable\r
123 #define sleep_enable() MCUCR |= (1<<SE)\r
124 #define sleep_disable() MCUCR &= ~(1<<SE)\r
125 \r
126 // CodeVision Compiler\r
127 #elif defined(__CODEVISIONAVR__)\r
128 \r
129 #include <io.h>\r
130 #include <delay.h>\r
131 #include <sleep.h>\r
132 \r
133 #if defined(_CHIP_ATTINY2313_) || defined(_CHIP_ATTINY2313V_)\r
134   #if !defined(WDTCSR)\r
135     #define WDTCSR WDTCR\r
136   #endif\r
137 // Below are bit position definitions for the ATtiny2313\r
138   #define UCSZ0   1\r
139   #define UCSZ1   2\r
140   #define TXEN    3\r
141   #define RXEN    4\r
142   #define DOR     3\r
143   #define FE      4\r
144   #define RXC     7\r
145   #define RXCIE   7\r
146   #define PD1     1\r
147   #define PD2     2\r
148   #define PD3     3\r
149   #define PD4     4\r
150   #define PD5     5\r
151   #define PD6     6\r
152   #define PB7     7\r
153   #define CS02    2\r
154   #define WGM01   1\r
155   #define OCIE0A  0\r
156   #define WDP0    0\r
157   #define WDP1    1\r
158   #define WDP2    2\r
159   #define WDE     3\r
160   #define WDCE    4\r
161   #define WDP3    5\r
162   #define WDRF    3\r
163   #define SM0     4\r
164   #define SM1     6\r
165   #define SE      5\r
166   #define USART_RX_vect USART_RXC\r
167   #define TIMER0_COMPA_vect TIM0_COMPA\r
168 #endif\r
169 \r
170 #define FLASH_DECLARE(x) flash x\r
171 #define ASM(a) #asm(a)\r
172 #define NOP() #asm("nop")\r
173 #define cli() #asm("cli")\r
174 #define sei() #asm("sei")\r
175 #define wdt_reset() #asm("wdr")\r
176 #define sleep_cpu() #asm("sleep")\r
177 #define REGISTER_VAR(V,GNU,IAR) register V\r
178 #define inline\r
179 #define INLINE_FUNC_DECLARE(x) x\r
180 #define NEAR_VAR(x) x\r
181 #define NO_RETURN_FUNC(fn) fn\r
182 #define MAIN_FUNC() void main(void)\r
183 #define MAIN_FUNC_LAST()\r
184 #define PGM_READ_BYTE(x) (*(x))\r
185 \r
186 #define NO_INIT_DECLARE(x) x\r
187 #define ISR(vec) interrupt [ ## vec ## ] void vec ## _handler(void)\r
188 \r
189 #define _delay_us(us) delay_us(us)\r
190 #define _delay_ms(ms) delay_ms(ms)\r
191 \r
192 #else\r
193 #error Unsupported compiler\r
194 #endif\r
195 \r
196 #else\r
197 // Use local cross-compiler compability files\r
198 #include "kavr_compat.h"\r
199 #include "ksleep.h"\r
200 #include "kdelay.h"\r
201 #endif\r
202 \r
203 \r
204 /*************************************************************/\r
205 /*************************************************************/\r
206 \r
207 /*      //// From the LCD perspective \\\\\r
208         RxD --> PORTD:0\r
209         LED <-- PORTD:1 // High = ON, Low = OFF\r
210         J_1 --> PORTD:2 // BAUD rate select\r
211         J_2 --> PORTD:3 // BAUD rate select\r
212         LCD:R/W <-- PORTD:4\r
213         LCD:RS <-- PORTD:5\r
214         LCD:E <-- PORTD:6\r
215         N/A <-> PORTD:7\r
216 \r
217         LCD:R/W <-- PORTD:4\r
218         LCD:RS <-- PORTD:5\r
219         LCD:E <-- PORTD:6\r
220         LCD:Vee <-- CONTRAST\r
221         LCD:DB0 <-- PORTB:0\r
222         LCD:DB1 <-- PORTB:1\r
223         LCD:DB2 <-- PORTB:2\r
224         LCD:DB3 <-- PORTB:3\r
225         LCD:DB4 <-- 4.7K Ohm <-- PORTx:4\r
226         LCD:DB5 <-- 4.7K Ohm <-- PORTx:5\r
227         LCD:DB6 <-- 4.7K Ohm <-- PORTx:6\r
228         LCD:DB7 <-- 4.7K Ohm <-- PORTx:7\r
229 \r
230         //// From the I/O PORTx perspective \\\\\r
231         PORTD:0 <--RxD\r
232         PORTD:1 --> LED // High = ON, Low = OFF\r
233         PORTD:2 <-- J_1 // BAUD rate select\r
234         PORTD:3 <-- J_2 // BAUD rate select\r
235         PORTD:4 --> LCD:R/W\r
236         PORTD:5 --> LCD:RS\r
237         PORTD:6 --> LCD:E\r
238         PORTD:7 <-> N/A\r
239 \r
240         PORTB:0 --> LCD:DB0\r
241         PORTB:1 --> LCD:DB1\r
242         PORTB:2 --> LCD:DB2\r
243         PORTB:3 --> LCD:DB3\r
244         PORTB:4 --> 4.7K Ohm --> LCD:DB4\r
245         PORTB:5 --> 4.7K Ohm --> LCD:DB5\r
246         PORTB:6 --> 4.7K Ohm --> LCD:DB6\r
247         PORTB:7 --> 4.7K Ohm --> LCD:DB7\r
248 */\r
249 \r
250 /*************************************************************/\r
251 /*************************************************************/\r
252 // If you want to use a different I/O port for LCD control & data,\r
253 // do it here!!!\r
254 #define LCD_DATA_PORT PORTB\r
255 #define LCD_DATA_PIN_REG PINB\r
256 #define LCD_DATA_DIR DDRB\r
257 \r
258 #define LCD_CONTROL_PORT PORTD\r
259 #define LCD_CONTROL_PIN_REG PIND\r
260 #define LCD_CONTROL_DIR DDRD\r
261 \r
262 // LED backlight control pin\r
263 #define LED_DIR DDRD\r
264 #define LED_PORT PORTD\r
265 #define LED_PIN PD1\r
266 \r
267 // LCD Read/Write Pin\r
268 #define LCD_RW PD4\r
269 // LCD Register Select Pin\r
270 #define LCD_RS PD5\r
271 // LCD Enable Pin\r
272 #define LCD_E PD6\r
273 /*************************************************************/\r
274 /*************************************************************/\r
275 \r
276 // LCD busy status pin\r
277 #define LCD_BUSY PB7\r
278 \r
279 // BAID rate setting pins\r
280 #define BAUD_PORT PORTD\r
281 #define BAUD_DIR  DDRB\r
282 #define BAUD_PIN_REG PIND\r
283 #define BAUD_J1 PD2\r
284 #define BAUD_J2 PD3\r
285 \r
286 #if USE_CTS\r
287 // Direction register for clear to send signal\r
288 #define CTS_DIR DDRA\r
289 // Output port for clear to send signal\r
290 #define CTS_PORT PORTA\r
291 // Pin for clear to send signal (RESET pin on Tiny2313)\r
292 // Ensure fuse is set to disable RESET function on RESET pin\r
293 #define CTS_PIN PA2\r
294 #endif\r
295 \r
296 \r
297 // PWeh must be 230nS minimum, nop = 67nS @ 14.7456MHz\r
298 // At 4 cycles, E = 271nS\r
299 // Some slow systems require 450ns, or 7 cycles at 14.7456MHz\r
300 #if defined(__ICCAVR__)\r
301   #if CONSERVATIVE_ENABLE_DURATION\r
302     #define ENABLE_WAIT() __delay_cycles(7);\r
303   #else\r
304     #define ENABLE_WAIT() __delay_cycles(4);\r
305   #endif\r
306 #elif defined(__GNUC__)\r
307   static __inline__ void _NOP1 (void) { __asm__ volatile ( "nop    " "\n\t" ); }\r
308   static __inline__ void _NOP2 (void) { __asm__ volatile ( "rjmp 1f" "\n\t"  "1:" "\n\t" ); }\r
309   #if CONSERVATIVE_ENABLE_DURATION\r
310     #define ENABLE_WAIT() _NOP2(); _NOP2(); _NOP2(); _NOP1();\r
311   #else\r
312     #define ENABLE_WAIT() _NOP2(); _NOP2();\r
313   #endif\r
314 #else\r
315   #if CONSERVATIVE_ENABLE_DURATION\r
316     #define ENABLE_WAIT() NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();\r
317   #else\r
318     #define ENABLE_WAIT() NOP(); NOP(); NOP(); NOP();\r
319   #endif\r
320 #endif\r
321 \r
322 #endif\r