Страница 1 из 1

Подружить CodeVisionAVR с кусочком кодом

Добавлено: Пн апр 06, 2009 12:52:43
zi4rox
Народ подтолкните пожалуйста в нужном направлении:

Задача: Пытаюсь скомпилить следующий код для приёма байта по 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;
}

         };
}
Ошибки, вылазящие при компилязции, указывают на то, что в стандартных 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
взятые из папки WinAVR'a avr\iom16.h в мой заголовок mega16.h получаю теперь ошибку, что компилятор ругается на определение _SFR_IO8(0x0E)
Как исправить это? ) И правильно ли я вообще копаю?

* Я знаю первое что преходит на ум - "Парень, брось и скомпиль в WinAVR" - у мну очень много уже есть в CVAVR и хочу заставить работать его.

Может просто у кого нибудь есть нормальные заголовочные файлы для 16ой меги?

Добавлено: Пн апр 06, 2009 13:14:17
ibiza11

Код: Выделить всё

.equ	SPSR	= 0x0e
.equ	SPIF	= 7	; SPI Interrupt Flag
.equ	SPDR	= 0x0f
если правильно понимаю, то в С надо писать так:

Код: Выделить всё

#define SPSR 0x0e 
#define SPIF  0x07 
#define SPDR 0x0f 
попробуйте

Добавлено: Пн апр 06, 2009 14:09:40
YKolomiets
Частенько сталкиваюсь с такой проблемой.
Выхожу из этой ситуации копируя из IAR.
Копирую только :
#define SPR0 0
#define SPR1 1
#define CPHA 2
#define CPOL 3
#define MSTR 4
#define DORD 5
#define SPE 6
#define SPIE 7

А адрес регистра если я не ошибаюсь уже прописан в *.h.
Если нет (хотя такого у меня еще не было) то сделай:
#define SPCR _SFR_IO8(0x0D) измени #define SPCR 0x0D - это адрес регистра (по поводу скобок не помню нужны или нет открой *.h и посмотри как другие регистры заявлены).
Тоже самое и с этим:
#define SPSR _SFR_IO8(0x0E)

Добавлено: Пн апр 06, 2009 15:04:53
ikarab
Регистры все прописаны в CVAVR а битов нет. В IAR кстати тоже биты отключены по умолчанию.

Добавлено: Пн апр 06, 2009 15:53:25
YKolomiets
Вы не правы ikarab. В IAR регистры разложены по битно (может мы разговариваем о разных вещах). Возьмите откройте iom16.h (если не ошибаюсь то так называется).

Добавлено: Пн апр 06, 2009 16:07:27
ikarab
YKolomiets писал(а):Вы не правы ikarab.
Я прав АБСОЛЮТНО ! так как писал о том что писал. Я не писал что битов нет в заголовках IAR.

Я написал что в свойствах проекта IAR по-умолчанию - галочка "элау бит дефенишенс" не отмечена.

Добавлено: Пн апр 06, 2009 18:39:40
zi4rox
Всем спасибо за ответы, помогло, разобрался.