Необходимо реализовать исходник, работающий на Меге128 и на Меге8515
У Мега8515 есть отличие - при использовании UART приходится дергать разряд URSEL.
Поэтому я решил при помощи препроцессора подставлять разную реализацию при компиляции, но...
Цитата
Build started 24.4.2011 at 00:26:16
avr-gcc -mmcu=atmega128 -Wl,-Map=AVR_Bootloader.map main.o Signal_UART.o -o AVR_Bootloader.elf
Signal_UART.o: In function `UART_WRITE_CTRL2':
D:\_Projects\AVR_Bootloader\default/../BootConfig.h:138: multiple definition of `UART_WRITE_CTRL2'
main.o:D:\_Projects\AVR_Bootloader\default/../BootConfig.h:138: first defined here
Signal_UART.o: In function `UART_READ_CTRL2':
D:\_Projects\AVR_Bootloader\default/../BootConfig.h:139: multiple definition of `UART_READ_CTRL2'
main.o:D:\_Projects\AVR_Bootloader\default/../BootConfig.h:139: first defined here
make: *** [AVR_Bootloader.elf] Error 1
Build failed with 1 errors and 0 warnings...
avr-gcc -mmcu=atmega128 -Wl,-Map=AVR_Bootloader.map main.o Signal_UART.o -o AVR_Bootloader.elf
Signal_UART.o: In function `UART_WRITE_CTRL2':
D:\_Projects\AVR_Bootloader\default/../BootConfig.h:138: multiple definition of `UART_WRITE_CTRL2'
main.o:D:\_Projects\AVR_Bootloader\default/../BootConfig.h:138: first defined here
Signal_UART.o: In function `UART_READ_CTRL2':
D:\_Projects\AVR_Bootloader\default/../BootConfig.h:139: multiple definition of `UART_READ_CTRL2'
main.o:D:\_Projects\AVR_Bootloader\default/../BootConfig.h:139: first defined here
make: *** [AVR_Bootloader.elf] Error 1
Build failed with 1 errors and 0 warnings...
Если эти эти функции реализовать как макрос - ошибок нет. Но я не представляю, как реализовать UART_READ_CTRL2() для Меги8515.
Код
#if defined( __AVR_ATmega128__) \
|| defined( __AVR_ATmega64__)
#ifndef UART_USE_SECOND
#define UART_BAUD_HIGH UBRR0H
#define UART_BAUD_LOW UBRR0L
#define UART_STATUS UCSR0A
#define UART_CTRL UCSR0B
#define UART_CTRL2 UCSR0C
#define UART_DATA UDR0
.
.
.
#else
#define UART_BAUD_HIGH UBRR1H
#define UART_BAUD_LOW UBRR1L
#define UART_STATUS UCSR1A
#define UART_CTRL UCSR1B
#define UART_CTRL2 UCSR1C
#define UART_DATA UDR1
.
.
.
#endif
volatile void UART_WRITE_CTRL2(u08 data){UART_CTRL2 = data; return;}
volatile u08 UART_READ_CTRL2(void){return UART_CTRL2;}
#elif defined( __AVR_ATmega8__) \
|| defined( __AVR_ATmega8515__)
#define UART_BAUD_HIGH UBRRH
#define UART_BAUD_LOW UBRRL
#define UART_URSEL URSEL
#define UART_CTRL2 UCSRC
volatile void UART_WRITE_CTRL2(u08 data){UART_CTRL2 = data | _BV(UART_URSEL); return;}
volatile u08 UART_READ_CTRL2(void){u08 tmp=UART_BAUD_HIGH; tmp=UART_URSEL; return tmp;}
#else
#error "Unknown"
#endif
|| defined( __AVR_ATmega64__)
#ifndef UART_USE_SECOND
#define UART_BAUD_HIGH UBRR0H
#define UART_BAUD_LOW UBRR0L
#define UART_STATUS UCSR0A
#define UART_CTRL UCSR0B
#define UART_CTRL2 UCSR0C
#define UART_DATA UDR0
.
.
.
#else
#define UART_BAUD_HIGH UBRR1H
#define UART_BAUD_LOW UBRR1L
#define UART_STATUS UCSR1A
#define UART_CTRL UCSR1B
#define UART_CTRL2 UCSR1C
#define UART_DATA UDR1
.
.
.
#endif
volatile void UART_WRITE_CTRL2(u08 data){UART_CTRL2 = data; return;}
volatile u08 UART_READ_CTRL2(void){return UART_CTRL2;}
#elif defined( __AVR_ATmega8__) \
|| defined( __AVR_ATmega8515__)
#define UART_BAUD_HIGH UBRRH
#define UART_BAUD_LOW UBRRL
#define UART_URSEL URSEL
#define UART_CTRL2 UCSRC
volatile void UART_WRITE_CTRL2(u08 data){UART_CTRL2 = data | _BV(UART_URSEL); return;}
volatile u08 UART_READ_CTRL2(void){u08 tmp=UART_BAUD_HIGH; tmp=UART_URSEL; return tmp;}
#else
#error "Unknown"
#endif
