the accompaning LICENSE file.\r
\r
\r
-Code/Data Sizes (for 20080318 release)\r
+Code/Data Sizes (for 20080320 release)\r
======================================\r
\r
-Compiler Code Data Notes\r
---------- ---- ---- -----\r
-AVR-GCC C 716 48 -Os\r
-AVR-GCC C++ 806 50 -Os\r
-AVR-GCC Obj 1574 72 -Os\r
-CV 2.02.6 808 48 Maximum size optimization\r
-IAR C 622 48 Size optimization high (+ 64 bytes stack)\r
-IAR C++ 762 49 Size optimization high (+ 64 bytes stack)\r
-IAR Obj 1112 65 Size optimization high (+ 63 bytes stack)\r
-ICC7 C Pro 812 48 Full optimizations (-O24)\r
+Compiler Code Data Notes\r
+--------- ---- ---- -----\r
+IAR 5.10A C 622 48 Size optimization high (+ 64 bytes stack)\r
+AVR-GCC 4.2.2 C 716 48 -Os\r
+IAR 5.10A C++ 762 49 Size optimization high (+ 64 bytes stack)\r
+Codevision 2.02.6 792 48 Maximum size optimization\r
+AVR-GCC 4.2.2 C++ 806 50 -Os\r
+ImageCraft 7.16 Pro C 808 48 Full optimizations (-O24)\r
+AVR-GCC 4.2.2 C++ Obj 1574 72 -Os\r
+IAR 5.10A C++ Obj 1112 65 Size optimization high (+ 63 bytes stack)\r
\r
I would appreciate submissions of suggestions, improvements, or bug\r
fixes.\r
#pragma global_register ledPwmCount:20 sUartRxHead:21 sUartRxTail:22 ledPwmCycling:23\r
unsigned char ledPwmCount, sUartRxHead, sUartRxTail, ledPwmCycling;\r
\r
-#elif defined(__CODEVISIONAVR__)\r
-#pragma regalloc-\r
-register unsigned char ledPwmCount, sUartRxHead, sUartRxTail, ledPwmCycling;\r
-#pragma regalloc+\r
-\r
// Use avr_compat register variables\r
#else\r
REGISTER_VAR(unsigned char ledPwmCount, "r4", 15);\r
#endif\r
}\r
\r
-#if defined(__IMAGECRAFT__) || defined(__CODEVISIONAVR__)\r
+#if defined(__IMAGECRAFT__)\r
// Clock cycle = 67nS @ 14.7456MHz\r
// Delay resolution ~ 1uS @ 14.7456MHz\r
// So this function is only accurate at near above frequency\r
void _delay_us (unsigned int d) {\r
while (d-- != 0);\r
-#if defined(__IMAGECRAFT__)\r
asm("nop");\r
-#elif defined(__CODEVISIONAVR__)\r
- #asm("nop")\r
-#endif\r
}\r
#endif\r
\r
MAIN_FUNC() {\r
MCUSR = 0; // clear all reset flags\r
\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("wdr");\r
-#else\r
- wdt_reset();\r
-#endif\r
+ wdt_reset();\r
WDTCSR |= (1<<WDCE)|(1<<WDE); // start timed sequence (keep old prescaler)\r
WDTCSR = (1<<WDE)|(1<<WDP3)|(1<<WDP0); // 1024K cycles, 8.0sec\r
MCUCR &= ~((1<<SM1)|(1<<SM0)); // use idle sleep mode\r
// Initialize the AVR USART\r
UsartInit ();\r
\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("sei");\r
-#else\r
sei();\r
-#endif\r
while (1) {\r
unsigned char tail = sUartRxTail; // explicitly set order of volatile access\r
if (tail != sUartRxHead) { // Check if UART RX buffer has a character\r
} else {\r
// No characters waiting in RX buffer\r
\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("cli");\r
-#else\r
cli();\r
-#endif\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("wdr");\r
-#else\r
wdt_reset();\r
-#endif\r
MCUSR &= ~(1<<WDRF); // clear any watchdog interrupt flags\r
WDTCSR |= (1<<WDCE)|(1<<WDE); // start timed sequence (keep old prescaler)\r
WDTCSR &= ~(1<<WDE); // watchdog timer off\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("sei");\r
-#else\r
sei();\r
-#endif\r
\r
sleep_enable();\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("sleep");\r
-#else\r
sleep_cpu();\r
-#endif\r
sleep_disable();\r
\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("cli");\r
-#else\r
cli();\r
-#endif\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("wdr");\r
-#else\r
wdt_reset();\r
-#endif\r
WDTCSR |= (1<<WDCE)|(1<<WDE); // start timed sequence (keep old prescaler)\r
WDTCSR &= ~(1<<WDCE);\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("sei");\r
-#else\r
sei();\r
-#endif\r
}\r
}\r
MAIN_FUNC_LAST();\r
void LcdWriteCmd (unsigned char Cmd) {\r
LcdBusyWait();\r
LCD_DATA_PORT = Cmd; // BusyWait leaves RS low in "Register mode"\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("nop");\r
-#else\r
NOP();\r
-#endif\r
LCD_CONTROL_PORT |= (1<<LCD_E);\r
-#if defined(__CODEVISIONAVR__)\r
- #if CONSERVATIVE_ENABLE_DURATION\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #else\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #endif\r
-#else\r
ENABLE_WAIT();\r
-#endif\r
LCD_CONTROL_PORT &= ~(1<<LCD_E);\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("nop");\r
-#else\r
NOP();\r
-#endif\r
LCD_CONTROL_PORT |= (1<<LCD_RS); // Set display to "Character mode"\r
}\r
\r
LcdBusyWait();\r
LCD_CONTROL_PORT |= (1<<LCD_RS); // Set display to "Character Mode"\r
LCD_DATA_PORT = c;\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("nop");\r
-#else\r
NOP();\r
-#endif\r
LCD_CONTROL_PORT |= (1<<LCD_E);\r
-#if defined(__CODEVISIONAVR__)\r
- #if CONSERVATIVE_ENABLE_DURATION\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #else\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #endif\r
-#else\r
ENABLE_WAIT();\r
-#endif\r
LCD_CONTROL_PORT &= ~(1<<LCD_E);\r
}\r
\r
LCD_DATA_DIR = 0x00; // Set LCD data port to inputs\r
LCD_CONTROL_PORT &= ~(1<<LCD_RS); // Set display to "Register mode"\r
LCD_CONTROL_PORT |= (1<<LCD_RW); // Put the display in the read mode\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("nop");\r
-#else\r
NOP();\r
-#endif\r
do {\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("wdr");\r
-#else\r
wdt_reset();\r
-#endif\r
LCD_CONTROL_PORT |= (1<<LCD_E);\r
-#if defined(__CODEVISIONAVR__)\r
- #if CONSERVATIVE_ENABLE_DURATION\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #else\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #asm("nop")\r
- #endif\r
-#else\r
- ENABLE_WAIT();\r
-#endif\r
+ ENABLE_WAIT();\r
LCDStatus = LCD_DATA_PIN_REG;\r
LCD_CONTROL_PORT &= ~(1<<LCD_E);\r
} while (LCDStatus & (1<<LCD_BUSY));\r
unsigned char tail;\r
do {\r
tail = sUartRxTail; // explicitly set order of volatile variable access\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("wdr");\r
-#else\r
- wdt_reset();\r
-#endif\r
+ wdt_reset();\r
} while (sUartRxHead == tail); // while buffer is empty\r
\r
#if USE_CTS\r
// turn off interrupts so that if UART char ready to be stored, then storage\r
// will occur after CTS pin is set active. This allows UART ISR to set\r
// CTS inactive if byte fills buffer after we remove current byte\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("cli");\r
-#else\r
cli();\r
-#endif\r
#endif\r
\r
// increment tail position\r
\r
#if USE_CTS\r
CTS_PORT |= (1<<CTS_PIN); // Ensure CTS is active since just removed a byte\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("sei");\r
-#else\r
sei(); // Allow UART ISR to read character and change potentially change CTS\r
-#endif\r
#endif\r
\r
return sUartRxBuf[sUartRxTail];\r
#if defined(__IMAGECRAFT__)\r
#pragma interrupt_handler timer0_compa_handler:iv_TIMER0_COMPA\r
void timer0_compa_handler(void)\r
-#elif defined(__CODEVISIONAVR__)\r
-interrupt [TIM0_COMPA] void timer0_compa_handler(void)\r
#else\r
ISR(TIMER0_COMPA_vect)\r
#endif\r
{\r
-#if defined(__CODEVISIONAVR__)\r
- #asm("sei");\r
-#else\r
sei(); // Okay to allow USART interrupts while controlling LED PWM\r
-#endif\r
\r
// Set current LED state based on cycling variable\r
if (ledPwmCycling & 0x01) {\r
// CodeVision Compiler\r
#elif defined(__CODEVISIONAVR__)\r
\r
-#if __CODEVISIONAVR__ >= 2\r
#include <io.h>\r
-#else\r
-#include <tiny2313.h>\r
-#endif\r
+#include <delay.h>\r
+#include <sleep.h>\r
\r
#if defined(_CHIP_ATTINY2313_) || defined(_CHIP_ATTINY2313V_)\r
#if !defined(WDTCSR)\r
#define SM0 4\r
#define SM1 6\r
#define SE 5\r
- #define sleep_enable() MCUCR |= (1<<SE)\r
- #define sleep_disable() MCUCR &= ~(1<<SE)\r
#define USART_RX_vect USART_RXC\r
+ #define TIMER0_COMPA_vect TIM0_COMPA\r
#endif\r
\r
#define FLASH_DECLARE(x) flash x\r
-#define ASM(a) asm(a)\r
-#define NOP() asm("nop");\r
+#define ASM(a) #asm(a)\r
+#define NOP() #asm("nop");\r
+#define cli() #asm("cli")\r
+#define sei() #asm("sei")\r
+#define wdt_reset() #asm("wdr")\r
+#define sleep_cpu() #asm("sleep")\r
+#define REGISTER_VAR(V,GNU,IAR) register V\r
#define inline\r
#define INLINE_FUNC_DECLARE(x) x\r
#define NEAR_VAR(x) x\r
#define PGM_READ_BYTE(x) (*(x))\r
\r
#define NO_INIT_DECLARE(x) x\r
-#define REGISTER_VAR(V,GNUR,IAR) register V\r
-\r
#define ISR(vec) interrupt [ ## vec ## ] void vec ## _handler(void)\r
\r
+#define _delay_us(us) delay_us(us)\r
+#define _delay_ms(ms) delay_ms(ms)\r
+\r
#else\r
#error Unsupported compiler\r
#endif\r