Задача: Пытаюсь скомпилить следующий код для приёма байта по SPI в ATMega16 (код взят из даташита по 16ой меге - стр. 132).
Вот полный код программы:
Код
#include <mega16>
#define DDR_SPI DDRB
#define DD_MISO PORTB.6
#define CMD1 0x01
#define CMD2 0x02
#define CMD3 0x03
#define CMD4 0x04
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1 << DD_MISO);
/* Enable SPI */
SPCR = (1 << SPE);
}
unsigned char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1 << SPIF)))
;
/* Return data register */
return SPDR;
}
void main (void){
SPI_SlaveInit();
while (1){
switch(SPI_SlaveReceive())
{
case CMD1:
PORTA = 1;
break;
case CMD2:
PORTA = 2;
break;
case CMD3:
PORTA = 3;
break;
case CMD4:
PORTA = 4;
break;
default:
PORTA = 250;
break;
}
};
}
#define DDR_SPI DDRB
#define DD_MISO PORTB.6
#define CMD1 0x01
#define CMD2 0x02
#define CMD3 0x03
#define CMD4 0x04
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1 << DD_MISO);
/* Enable SPI */
SPCR = (1 << SPE);
}
unsigned char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1 << SPIF)))
;
/* Return data register */
return SPDR;
}
void main (void){
SPI_SlaveInit();
while (1){
switch(SPI_SlaveReceive())
{
case CMD1:
PORTA = 1;
break;
case CMD2:
PORTA = 2;
break;
case CMD3:
PORTA = 3;
break;
case CMD4:
PORTA = 4;
break;
default:
PORTA = 250;
break;
}
};
}
Ошибки, вылазящие при компилязции, указывают на то, что в стандартных header'ах идущих с CVAVR не прописаны описания регистров: SPSR (и бит SPIF в частности), SPDR.
Порылся в сети - эти регстры описаны в хедерах, идущих с WinAVR.
Но при попытке, дописать недостоющие:
Код
#define SPCR _SFR_IO8(0x0D)
#define SPR0 0
#define SPR1 1
#define CPHA 2
#define CPOL 3
#define MSTR 4
#define DORD 5
#define SPE 6
#define SPIE 7
#define SPSR _SFR_IO8(0x0E)
#define SPI2X 0
#define WCOL 6
#define SPIF 7
#define SPR0 0
#define SPR1 1
#define CPHA 2
#define CPOL 3
#define MSTR 4
#define DORD 5
#define SPE 6
#define SPIE 7
#define SPSR _SFR_IO8(0x0E)
#define SPI2X 0
#define WCOL 6
#define SPIF 7
взятые из папки WinAVR'a avr\iom16.h в мой заголовок mega16.h получаю теперь ошибку, что компилятор ругается на определение _SFR_IO8(0x0E)
Как исправить это? ) И правильно ли я вообще копаю?
* Я знаю первое что преходит на ум - "Парень, брось и скомпиль в WinAVR" - у мну очень много уже есть в CVAVR и хочу заставить работать его.
Может просто у кого нибудь есть нормальные заголовочные файлы для 16ой меги?