| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
Код для обработки CAN сообщений AT90CAN128
02.08.2010, 16:01
|
|
|
Частый гость
Регистрация: 16.09.2006
Сообщений: 15
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Код для обработки CAN сообщений AT90CAN128
|
|
|
|
02.08.2010, 16:26
|
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Re: Код для обработки CAN сообщений AT90CAN128
А что у Вас за компилятор?
|
|
|
|
02.08.2010, 16:57
|
|
|
Частый гость
Регистрация: 16.09.2006
Сообщений: 15
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Код для обработки CAN сообщений AT90CAN128
CodeVisionAVR
Если я скопирую это библиотеку из WinAVR в CodeVisionAVR inc это будет корректно?
|
|
|
|
02.08.2010, 16:58
|
|
|
Частый гость
Регистрация: 16.09.2006
Сообщений: 15
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Код для обработки CAN сообщений AT90CAN128
Вот код для 16Мгц варианта, в WinAVR работает, его сложно портировать на CodeVision?
|
Цитата:
|
#define F_CPU 16000
#define DLC_MAX 8
#define PAGE_MAX 16
#define BRP_100_16 9
#define SJW_100_16 0
#define PRS_100_16 6
#define PHS2_100_16 3
#define PHS1_100_16 3
#define SMP_100_16 1
#include ‹avr/io.h›
#include ‹avr/interrupt.h›
#include ‹util/delay.h›
#include ‹string.h›
typedef struct {
uint32_t IDT; /* Nachrichten ID Tag */
uint8_t DLC; /* DATA LENGTH CODE */
uint8_t data[8];
}CAN_Message_t;
void CAN_INIT(){
CANGCON |= (1‹‹SWRES); /* Reset */
CANGCON = 0x00; /* DISABLE CAN */
while(CANGSTA&(1‹‹ENFG)); /* AUF DISABLE WARTEN */
CANGIT = 0x00; CANSIT2 = 0x00;CANSIT1 = 0x00; /* Aufgetretene Interrupts Lцschen */
for (uint8_t PAGE_INDEX=0;PAGE_INDEX‹PAGE_MAX;PAGE_INDEX++){ /* FOR ALL MOBS DO */
CANPAGE = PAGE_INDEX ‹‹ 4; /* SELESCT MOB*/
CANCDMOB=0x00; /* DISABLE MOB*/
CANSTMOB=0x00; /* CLEAR STATUS*/
for (uint8_t MSG_INDEX=0;MSG_INDEX‹DLC_MAX;MSG_INDEX++){CANMSG= 0x00;};} /* CLEAR MESSAGE*/
CANBT1 = (BRP_100_16 ‹‹ 1); /* BIT TIMING*/
CANBT2 = (PRS_100_16 ‹‹ 1) | (SJW_100_16 ‹‹ 5);
CANBT3 = (PHS2_100_16 ‹‹ 4) | (PHS1_100_16 ‹‹ 1) | (SMP_100_16);
CANGIE = (1‹‹ENIT) | (1‹‹ENRX) | (1‹‹ENBX) ; /* ENABLE Interrupt Eingдnge*/
CANIE1 = 0x7F; CANIE2 = 0xFF;
CANGCON = (1‹‹1); /* ENABLE CAN*/
while(!(CANGSTA&(1‹‹ENFG))); /* AUF ENABLE WARTEN*/
}
int CAN_SEND (CAN_Message_t Nachricht){
uint8_t Error=0;
cli(); /* Interrupts Aus*/
/* 1. Freien MOB suchen */
for (uint8_t PAGE_INDEX=0;PAGE_INDEX‹PAGE_MAX;PAGE_INDEX++){ /* FOR ALL MOBS DO */
uint8_t Error=1;
CANPAGE = PAGE_INDEX ‹‹ 4;
if (!(CANCDMOB)) { /* MOB Disabled ergo frei */
Error=0; /* No Error, wir hams gefunden */
break;};}; /* einfach for verlassen, page bleibt erhalten */
if (Error) {sei();return Error;} /* Im Fehlerfall funktion verlassen */
CANSTMOB = 0x00; /* Status Lцschen*/
/* 2. IDE und IDT*/
if (Nachricht.IDT‹=0x7FF) { /* 11 Bit*/
CANCDMOB &= ~(0‹‹IDE);
CANIDT4=0x00;
CANIDT3=0x00;
CANIDT2=(uint8_t)(Nachricht.IDT ‹‹ 5);
CANIDT1=(uint8_t)(Nachricht.IDT ›› 3);
}
else if (Nachricht.IDT‹=0x1FFFFFFF) { /* 29 Bit*/
CANCDMOB |= (1‹‹IDE);
CANIDT4=(uint8_t)(Nachricht.IDT ‹‹ 3);
CANIDT3=(uint8_t)(Nachricht.IDT ›› 5);
CANIDT2=(uint8_t)(Nachricht.IDT ›› 13);
CANIDT1=(uint8_t)(Nachricht.IDT ›› 21);
}
else {Error=2;}
if (Error) {sei();return Error;} /* Im Fehlerfall funktion verlassen */
/* 3. DLC und Daten Setzen */
if (Nachricht.DLC ‹= 0) {Error=3;}
else if (Nachricht.DLC ‹ DLC_MAX){
CANCDMOB |= DLC_MAX;
for (uint8_t MSG_INDEX=0;MSG_INDEX‹DLC_MAX;MSG_INDEX++){
CANMSG = Nachricht.data[MSG_INDEX];};}
else {
CANCDMOB |= Nachricht.DLC;
for (uint8_t MSG_INDEX=0;MSG_INDEX‹DLC_MAX;MSG_INDEX++){
if (MSG_INDEX‹Nachricht.DLC){
CANMSG = Nachricht.data[MSG_INDEX];}
else {CANMSG = 0x00;};};}; /* Sicherheitshalber den Rest mit Nullen zuschreiben*/
if (Error) {sei();return Error;} /* Im Fehlerfall funktion verlassen */
CANCDMOB |= (1‹‹CONMOB0); /* Sendeauftrag */
while (CANGSTA & (1‹‹TXBSY)); /* Abwarten solange Busy */
if (CANSTMOB & (1‹‹TXOK)){} /* ALLES IST GUT WOOHOOOO */
else if (CANSTMOB) {Error = 4;} /* Irgendein Fehler Error 4 */
else {Error = 5;}; /* Status immer noch Null Error 5 */
CANSTMOB = 0x00;
CANCDMOB = 0x00;
sei();
return Error;
}
int main (void){
CAN_Message_t MyMessage;
MyMessage.IDT = 0x0F7AF0F4;
MyMessage.DLC = 5;
strncpy (&MyMessage.data[0], "Hallo", MyMessage.DLC);
CAN_INIT();
while(1){CAN_SEND (MyMessage);};
return 0;
}
|
Последний раз редактировалось LexaryStyle; 02.08.2010 в 20:16.
|
|
|
|
02.08.2010, 18:10
|
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Re: Код для обработки CAN сообщений AT90CAN128
Скомпилил в кодевижене 2.04, работоспособность не проверял!
|
|
|
|
02.08.2010, 19:49
|
|
|
Частый гость
Регистрация: 16.09.2006
Сообщений: 15
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Код для обработки CAN сообщений AT90CAN128
Не хватает чего то... (CV 2.03.4)
Последний раз редактировалось LexaryStyle; 02.08.2010 в 21:19.
|
|
|
|
02.08.2010, 21:26
|
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Re: Код для обработки CAN сообщений AT90CAN128
А зачем Вы заменили
|
PHP код:
|
typedef struct
{
uint32_t IDT; /* Nachrichten ID Tag */
uint8_t DLC; /* DATA LENGTH CODE */
uint8_t data[8];
}CAN_Message_t;
|
на
|
PHP код:
|
typedef struct
{
uint32_t IDT; /* Nachrichten ID Tag */
uint8_t DLC; /* DATA LENGTH CODE */
uint8_t data[8];
CAN_Message_t;
}
|
Почитайте Программирование на языке С для AVR и PIC микроконтроллеров (Ю.А. Шпак, 2006), C Programming for microcontrollers (Joe Pardue, 2005), Липпман - С++ для начинающих.
В данном случае CAN_Message_t это имя структуры и записано оно правильно:
|
PHP код:
|
typedef struct _struct_name
{
int param1;
int param2;
}
STRUCT_NAME;
|
Скриншоты лучше не менять, а добавлять в новом посте!
Дабы избежать глупых ситуаций.
Проблема не в коде, а в настройках компилятора. У меня компилится без ошибок.
Как вариант поставьте версию 2.04 evaluation
Последний раз редактировалось harchenko_pavel; 02.08.2010 в 21:32.
|
|
|
|
Сказали "Спасибо" harchenko_pavel
|
|
|
02.08.2010, 22:08
|
|
|
Частый гость
Регистрация: 16.09.2006
Сообщений: 15
Сказал спасибо: 3
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Код для обработки CAN сообщений AT90CAN128
Все компилируется без ошибок, подскажите в чем заключалось портирование?
Осциллографом проверил, сигнал на Tx бегает...
Последний раз редактировалось LexaryStyle; 02.08.2010 в 22:16.
|
|
|
|
02.08.2010, 22:23
|
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Re: Код для обработки CAN сообщений AT90CAN128
Сообщение от LexaryStyle
|
|
Все компилируется без ошибок, подскажите в чем заключалось портирование?
|
В проекте есть macros.h - Кроссплатформенная библиотека макросов для обеспечения совместимости компиляторов CVAVR, IAR, IMAGECRAFT, SDCC, FEDPICC с проектами написанными на WinAVR (AVR GCC), скачанная с http://www.avrfreaks.net/ и дополненная.
Плюс подключение стандартных библиотек кодевижна и устранение мелких несоотвествий, например конструкция
|
PHP код:
|
for (uint8_t MSG_INDEX=0;MSG_INDEX‹DLC_MAX;MSG_INDEX++)
|
здесь не работает.
Надо объявлять переменную вне оператора for
|
PHP код:
|
uint8_t MSG_INDEX;
for (MSG_INDEX=0;MSG_INDEX‹DLC_MAX;MSG_INDEX++)
|
|
|
|
|
02.08.2010, 22:26
|
|
|
Гражданин KAZUS.RUN
Регистрация: 17.08.2008
Сообщений: 770
Сказал спасибо: 52
Сказали Спасибо 450 раз(а) в 202 сообщении(ях)
|
Re: Код для обработки CAN сообщений AT90CAN128
В Протеусе или еще где проект можно смоделировать?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:31.
|
|