Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Silabs IDE + SDCC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
SergNovg
Кому приходилось совместить?
Программирую микропроцессоры silabs C8051F320 в Silabs IDE. Свободное программное обеспечение.
Пока проект был небольшой, все хорошо.
Начал более серьезный проект на этом процессоре и столкнулся с проблемой ограничения размера кода. Почитав умных людей решил подключить бесплатный компилчтор SDCC в оболочку прграммирования. Все включилось сразу, но не работает. Подробнее:
Тестовый проект (при подключении ограниченого Keil в IDE)


#include "hard.h"
#include "proc.h"


sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter


#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hz

void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (void);
void Timer2_ISR (void);

void init (void) {

// disable watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)

SYSCLK_Init (); // Initialize system clock to
// 24.5MHz
PORT_Init (); // Initialize crossbar and GPIO
Timer2_Init (); // Init Timer2
EA = 1; // enable global interrupts

}


void SYSCLK_Init (void)
{
OSCICN = 0x80; // 1,5ÌÃö (SYSCLK)
RSTSRC = 0x04; // Ñáðîñ ïðîöåññîðà ïðè îòñóòñòâèè òàêòîâîé ÷àñòîòû
}

void PORT_Init (void)
{
XBR1 = 0xC0; // Enable crossbar and weak pull-ups

}

void Timer2_Init (void)
{
unsigned int per = 1250; // 1 òàêò = 1,5ÌÃö/12 = 125 000 Ãö (100 ãö)
TMR2CN = 0x00; // Stop Timer2; Clear TF2;
// use SYSCLK/12 as timebase
CKCON &= ~0x30; // Timer2 clocked based on T2XCLK;

TMR2RL = -per; // Init reload values
TMR2 = 0xffff; // set to reload immediately
ET2 = 1; // enable Timer2 interrupts
TR2 = 1; // start Timer2
}



void Timer2_ISR (void) interrupt 5
{
TF2H = 0; // clear Timer2 interrupt flag
}


Компилирует без ошибок.

Тот же проект SDCC компилятор генерит ошибку
Hard.c:58: syntax error: token -> 'interrupt' ;
В документации на компилятор:
/* External Interrupt 0 */
void external0_ISR(void) interrupt 0
{
P3_1 = 0; /* change state of PIO 3, bit 1 */
}

_Pasha
Там в доке неточности, надо __interrupt
а они на одних архитектурах так, на других - эдак...
И using() не указали вектор. В общем, RTFM еще раз.
SergNovg
Спасибо! вечером попробую. Using() это для банка памяти. В silabs нет.
SergNovg
Да, так и оказалось, __interrupt работает. Где бы почитать RTFM?
_Pasha
Цитата(SergNovg @ Aug 16 2012, 02:44) *
Да, так и оказалось, __interrupt работает. Где бы почитать RTFM?

TFM, который надо R, находится в инсталляхе SDCC, либо из их снапшота здесь
Более "правильного", увы, не существует. sad.gif Только метод научного тыка.
SergNovg
Спасибо за ссылки. Уже смотрел, но это надолго :-(
Проект надо делать сейчас.
Докладаю для тех, кто еще не пробовал. В оболочке silabs IDE есть настройки для разных компиляторов (в том числе и для SDCC). А в примерах для микропроцессоров silabs есть варианты построения так же для разных компиляторов. В этих примерах основные отличия можно посмотреть ( до изучения полной документации). У меня, спасибо, все заработало. Для меня описания стандартных (почти) определений и библиотечных функций в компиляторе Keil намного привычнее (например битовые переменные), поэтому для скорости работаю в другой конфигурации - Компилятор Keil с таблеткой. Но обязательно перейду на SDCC (чуть попозже).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.