Added functionality for configuring crystal or external clock source.
authorJ. Hendrix <gitweb@localhost>
Mon, 23 Dec 2013 18:20:48 +0000 (19:20 +0100)
committerJ. Hendrix <gitweb@localhost>
Mon, 23 Dec 2013 18:20:48 +0000 (19:20 +0100)
Added project.cpp template with clock fuse configurations

Makefile
project.cpp [new file with mode: 0644]

index 84afb04..0148cfa 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,13 @@
-### VERSION: Wed Jul 17 10:56:08 CEST 2013
+### VERSION: ma dec 23 19:15:16 CET 2013
 
 ###
 ### (C) copyright by J.P. Hendrix
 ###
 
 baudrate=19200
-avrType=attiny2313
-avrFreq=20000000
+avrType=attiny45
+avrFreq=16000000
+xtal=true
 programmerDev=/dev/ttyUSB003
 programmerType=arduino
 src=project
@@ -18,7 +19,15 @@ src=project
 # -Werror=overflow     uint8_t n = ( uint8_t ) ~ 0xf5; uint8_t n = ~ 0xf5;
 # -Werror=narrowing    char n = ( char ) ~ 0xf5;       char n = ~ 0xf5;
 
-cflags=-g -DF_CPU=$(avrFreq) -Wall -Os -Werror -Wextra
+cflags=-g -DF_CPU=$(avrFreq) -Wall -Os -Werror -Wextra -ffunction-sections -fdata-sections
+ifeq ($(xtal),true)
+cflags += -D__XTAL__
+else
+ifneq ($(xtal),false)
+$(error xtal must be either 'true' or 'false')
+endif
+endif
+
 memoryTypes=calibration eeprom efuse flash fuse hfuse lfuse lock signature application apptable boot prodsig usersig
 
 SHELL := /bin/bash
@@ -60,10 +69,6 @@ clean:
        date
 
 object:
-       # *** BEGIN project specific lines ***
-       #avr-gcc $(cflags) -mmcu=$(avrType) -S -fdump-tree-original -fdump-tree-optimized -c $(src).cpp 
-       #grep -E '^[ \t]*uint16_t (ubrr|ocr1a)' $(src).cpp.003t.original
-       # *** END project specific lines ***
        avr-gcc $(cflags) -mmcu=$(avrType) -Wa,-ahlmns=$(src).lst -c -o $(src).o $(src).cpp 
 
 memory: object
diff --git a/project.cpp b/project.cpp
new file mode 100644 (file)
index 0000000..902fc81
--- /dev/null
@@ -0,0 +1,116 @@
+// VERSION: 
+
+/*
+ *     (c) copyright by J.P. Hendrix
+ *
+ *     More information on http://blog.linformatronics.nl/
+ */
+
+#include <avr/io.h>
+
+#define _BS(bit) ( 1 << ( bit ) )
+#define _BC(bit) ( 0 << ( bit ) )
+
+#ifndef F_CPU
+       #error "F_CPU not defined."
+#endif
+
+#pragma message "****************************"
+#pragma message "*"
+
+#if defined( __AVR_ATtiny25__ ) or defined( __AVR_ATtiny45__ ) or defined( __AVR_ATtiny85__ )
+       #pragma message "* Setting fuses for ATtiny45"
+       #ifdef __XTAL__
+               #if     ( ( F_CPU >= 400000 ) and ( F_CPU < 900000 ) )
+                       #pragma message "* External crystal oscillator @ 0.4 - 0.9MHz"
+                       #error "The F_CPU CPU frequency bricks the controller unless a low speed programmer is available."
+                       // 400-900kHz                   CKSEL[3:0] = 1001       CKDIV8 = 0
+                       FUSES = { .low = 0xe9   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #elif   ( ( F_CPU >= 900000 ) and ( F_CPU < 3000000 ) )
+                       #pragma message "* External crystal oscillator @ 0.9 - 3MHz"
+                       #error "The F_CPU CPU frequency bricks the controller unless a low speed programmer is available."
+                       // 0.9-3MHz                     CKSEL[3:0] = 1011       CKDIV8 = 0
+                       FUSES = { .low = 0xeb   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #elif   ( ( F_CPU >= 3000000 ) and ( F_CPU < 8000000 ) )
+                       #pragma message "* External crystal oscillator @ 3 - 8MHz"
+                       // 3-8MHz                       CKSEL[3:0] = 1101       CKDIV8 = 0
+                       FUSES = { .low = 0xed   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #elif   ( ( F_CPU >= 8000000 ) and ( F_CPU <= 20000000 ) )
+                       #pragma message "* External crystal oscillator @ > 8MHz"
+                       // > 8MHz                       CKSEL[3:0] = 1111       CKDIV8 = 0
+                       FUSES = { .low = 0xef   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #else
+                       #pragma message "* Configuring for external clock"
+                       // ext. CLK                     CKSEL[3:0] = 0000       DIV8 = 0
+                       FUSES = { .low = 0x60   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #endif
+       #else
+               #if     ( F_CPU == 16000000 )
+                       #pragma message "* @ 16|64MHz internal RC|PLL oscillator"
+                       // 16MHz        64MHz / 4       CKSEL[3:0] = 0001       CKDIV8 = 0
+                       FUSES = { .low = 0xe1   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #elif   ( F_CPU == 1000000 )
+                       #pragma message "* @ 1MHz internal RC oscillator"
+                       // 1MHz         8MHz / 8        CKSEL[3:0] = 0010       CKDIV8 = 1
+                       FUSES = { .low = 0x62   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #elif   ( F_CPU == 8000000 )
+                       #pragma message "* @ 8MHz internal RC oscillator"
+                       // 8MHz         8MHz / 1        CKSEL[3:0] = 0010       CKDIV8 = 0
+                       FUSES = { .low = 0xe2   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #elif   ( F_CPU == 1600000 )
+                       #pragma message "* @ 1.6MHz internal RC oscillator"
+                       #pragma message " ATtiny15 compatibility mode!"
+                       // 1.6MHz       6.4MHz / 4      CKSEL[3:0] = 0011       CKDIV8 = 0
+                       FUSES = { .low = 0xe3   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #elif   ( F_CPU == 128000 )
+                       #pragma message "* @ 128kHz internal RC oscillator"
+                       #error "The F_CPU CPU frequency bricks the controller unless a low speed programmer is available."
+                       // 128kHz       128kHz / 1      CKSEL[3:0] = 0100       CKDIV8 = 0
+                       FUSES = { .low = 0xe4   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #elif   ( F_CPU == 32768 )
+                       #pragma message "* Low frequency external crystal oscillator @ 32768Hz"
+                       #error "The F_CPU CPU frequency bricks the controller unless a low speed programmer is available."
+                       // 32768kHz     32768kHz / 1    CKSEL[3:0] = 0101       CKDIV8 = 0
+                       FUSES = { .low = 0xe5   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+               #else
+                       #error "F_CPU CPU frequency setting not recognized. Configuring for external clock."
+       #endif
+#endif
+
+#elif __AVR_ATtiny2313__
+       #pragma message "* Setting fuses for ATtiny2313"
+       #if   ( F_CPU == 500000 )
+               // 500kHz       4MHz / 8        CKSEL[3:0] = 0010       DIV8 = 1
+               #error "The F_CPU CPU frequency bricks the controller unless a low speed programmer is available."
+               FUSES = { .low = 0x62   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+       #elif ( F_CPU == 1000000 )
+               #pragma message "* @ 1MHz"
+               // 1MHz         8MHz / 8        CKSEL[3:0] = 0100       DIV8 = 1        (default)
+               FUSES = { .low = 0x64   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+       #elif ( F_CPU == 4000000 )
+               #pragma message "* @ 4MHz"
+               // 4MHz         4MHz / 1        CKSEL[3:0] = 0010       DIV8 = 0
+               FUSES = { .low = 0xe2   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+       #elif ( F_CPU == 8000000 )
+               #pragma message "* @ 16MHz"
+               // 8MHz         8MHz / 1        CKSEL[3:0] = 0100       DIV8 = 0
+               FUSES = { .low = 0xe4   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+       #else
+               #warning "F_CPU CPU frequency setting not recognized. Configuring for external clock."
+               #pragma message "* Configuring for external clock"
+               // ext. CLK                     CKSEL[3:0] = 0000       DIV8 = 0
+               FUSES = { .low = 0xe0   , .high = HFUSE_DEFAULT , .extended = EFUSE_DEFAULT , };
+       #endif
+#endif
+
+#pragma message "*"
+#pragma message "****************************"
+
+void setup( void ) {
+}
+
+int main( void ) {
+       setup();
+       while ( 1 ) {
+       }
+}