реклама на сайте
подробности

 
 
> Изменение текста программы при смене компилятора и чипа
RW6MKA
сообщение Oct 25 2010, 11:58
Сообщение #101


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401



Привет всем. rolleyes.gif
Есть исходник программы написаный в IAR C v.3.10C для AT90S2313P, но такого камня уже не достать поэтому нужно переписать исходник для ATTINY2313V-10PU. Проблема в том,что IAR C v.3.10C триал или ломаная без библиотек и многого другого,поэтому изменять текст придётся в AVR Studio,но некоторые функции,как я понимаю,свойственны только IAR C v.3.10C(в частности h-файлы типа inavr.h и др.) Вообщем HELP!!! help.gif
Проще говоря нужно чтобы прога работала и компилировалась в AVR Studio или Code Vision AVR под камень ATTINY2313V-10PU. Вот сам исходник(чёт не получается файлом выложить)
/*
Компилировать IAR C v.3.10C
*/
#include <2313.h>
#include <inavr.h>

//#define DEBUG 1

// Подручные макросы
#define SetBit(address,bit) (address|=(1<<bit))
#define ClrBit(address,bit) (address&=~(1<<bit))
#define InvBit(address,bit) (address^=(1<<bit))
#define BitOn(address,bit) (address&(1<<bit))
#define BitOff(address,bit) (!(address&(1<<bit)))
#define NOP __no_operation()
#define IE __enable_interrupt()
#define DI __disable_interrupt()

#define DEBOUNCE 300
#define RUN 6 // Управление реле хода
#define REV 7 // Управление реле реверса
#define PRESC 2 // Прескалер таймера 0 (CLK/8)
#define AIN0 0
#define AIN1 1
#define T 7
#define SUM 50
#define YES 1
#define NO 0
#define REVPAUSE 800

typedef enum {Idle, RotL, RotR, LStop, RStop} State;


// Определения собственных типов данных
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long ulong;

// Объявления прототипов функций
#ifdef DEBUG
void sb(byte data);
void phex(byte ch);
#define CRLF sb(13); sb(10)
#endif

byte GetKey(void);
byte KbdRotate(byte m);
byte KbdTest(void);
void ShiftReg(void);
void ShiftOne(byte r);
void RegClk(void);
void Strobe_1(void);
void Strobe_2(void);
void delayms (unsigned count);
unsigned getcount(void);
void RotCW(void);
void RotCCW(void);
void Stop(void);
word measure(void);
byte gp(void);
void Convert(byte data);
void Alarm(void);


__eeprom word dummy[8]= {0,0,0,0,0,0,0,0};
__eeprom State ee_stat;
__eeprom byte ee_angle;

// Таблица перевода количества импульсов, соответствующих входному
// напряжению в номер группы и номер светодиода в группе.
__flash byte LedPos[] = {
0x00,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,
0x07,0x07,
0x10,0x10,0x10,0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x14,0x14,0x15,0x15,0x15,0x16,
0x16,0x17,
0x17,0x17,0x20,0x20,0x21,0x21,0x21,0x22,0x22,0x23,0x23,0x23,0x24,0x24,0x25,0x25,
0x26,0x26,
0x26,0x27,0x27,0x30,0x30,0x30,0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x34,0x34,0x35,
0x35,0x35,
0x36,0x36,0x37,0x37,0x37,0x40,0x40,0x41,0x41,0x41,0x42,0x42,0x43,0x43,0x43,0x44,
0x44,0x45,
0x45,0x46,0x46,0x46,0x47,0x47,0x50,0x50,0x50,0x51,0x51,0x52,0x52,0x52,0x53,0x53,
0x54,0x54,
0x54,0x55,0x55,0x56,0x56,0x57};

__flash byte Mask[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

// Определение переменных программы
volatile word SysmS;
byte Regs[2];
byte Btn;
byte cnt;
volatile byte TH;
State Status;
byte Merge;
byte Angle;

// Начало основного модуля программы
__C_task void main(void){

// Настройка последовательного порта. Для настройки.
#ifdef DEBUG
UBRR = 25;
SetBit(UCR,TXEN);
#endif
Regs[1]=Regs[0]=0;
DDRD=0x71; PORTD=0x0E; // Настройка портов ввода/вывода
KbdRotate(0xFF); // Очистка регистра кнопок
ShiftReg(); // Очистка сдвигового регистра
// Настройка системного таймера на прерывания раз в 1 мсек
TCCR1B=0x0A;
OCR1=500;
TCNT1=0;
SetBit(TIMSK,OCIE1A);
SetBit(TIMSK,TOIE0);
ClrBit(DDRB,T); // Выключить транзистор
SetBit(DDRB,AIN0); // Разрядить конденсатор
delayms(1);
IE; // Разрешить глобальные прерывания
Merge = NO;
Status = ee_stat;
if ((Status==RotL) || (Status==RotR)) Alarm();
else Convert(Angle = ee_angle);
ee_stat = Status;

// ---------------------------------------------------------------
// Главная петля программы
while(1){
if ((Status==RotL)||(Status==RotR)){
Angle = gp();
Convert(Angle);
if (((Angle == 0x00)&&(Status==RotL)) || ((Angle == 0x57)&&(Status==RotR))){
Merge = YES;
Stop();
}
}
cnt = 0;
switch(Btn=GetKey()){
case 0x04: RotCW(); break;
case 0x08: Stop(); break;
case 0x10: RotCCW(); break;
}
}
}

void Alarm(void){
// Прокрутка трех кругов
byte c,i,j;
for (c=0; c!=3; c++)
for (j=0; j!=6; j++)
for (i=0; i!=8; i++){
Convert(i + (j<<4));
delayms(25);
}
Regs[0] = 0xFF;
Regs[1] = 0x00;
ShiftReg();
Status = Idle;
}

byte gp(void){
// Накопление и округление
word m = 0; byte i = SUM;
while(i--) m += measure();
i = m / SUM;
return((LedPos[i-20] & 0x77));
}

// Применение компаратора при измерении аналоговых величин.
word measure(void){
ClrBit(DDRB,AIN0); // Перевести в Z-состояние
TCNT0 = TH = 0; // Очистить счетчик-накопитель
TCCR0 = PRESC; // Включить Таймер 0
SetBit(DDRB,T); // Включить транзистор
while(BitOff(ACSR,ACO)); // Ждать изменения состояния компаратора
TCCR0 = 0; // Выключить Таймер 0
ClrBit(DDRB,T); // Выключить транзистор
SetBit(DDRB,AIN0); // Разрядить конденсатор
delayms(2); // Время для разряда
return(TH<<8 | TCNT0); // Возвращаем результат замера времени
}

#pragma vector = TIMER0_OVF0_vect
// Обработчик прерывания системного таймера
// Периодичность прерывания = 1 мсек
__interrupt void MeasureTick(void){
TH++;
}

void RotCW(void){
// Вращение по часовой стрелке
if (Status == RStop) return;
Merge = NO;
if (Status == RotL){
Stop();
delayms(REVPAUSE);
}
ClrBit(Regs[1],REV); // Выключить реле реверса
SetBit(Regs[1],RUN); // Включить реле хода
ShiftReg(); // Вывести в регистр
delayms(DEBOUNCE);
ee_stat = Status = RotR;
}

void RotCCW(void){
// Вращение против часовой стрелки
// Аналогично предыдущей функции
if (Status == LStop) return;
Merge = NO;
if (Status == RotR){
Stop();
delayms(REVPAUSE);
}
SetBit(Regs[1],REV); // но реле реверса включить
SetBit(Regs[1],RUN);
ShiftReg();
delayms(DEBOUNCE);
ee_stat = Status = RotL;
}

void Stop(void){
// Останов вращения
if ((Status==RotR)||(Status==RotL)){
ClrBit(Regs[1],REV);
ClrBit(Regs[1],RUN);
ShiftReg();
switch (Merge){
case YES: { if (Status==RotR)
Status = RStop; else
Status = LStop; break;}
case NO : Status = Idle; break;
}
Merge = NO;
ee_stat = Status;
ee_angle = Angle;
//CRLF; sb('S');sb('=');phex(Status);sb(' '); CRLF;
}
}

void Convert(byte data){
byte led, group;
static byte old;
if (data != old){
old = data;
led = data & 0x0F;
group = (data & 0x70)>>4;
Regs[0] = ~Mask[led];
Regs[1] &= 0xC0;
Regs[1] |= Mask[group];
ShiftReg();
}
}

void ShiftReg(void){
// Загрузка сдвигового регистра
ShiftOne(Regs[1]);
ShiftOne(Regs[0]);
Strobe_1();
}
void ShiftOne(byte r){
// Загрузка одного байта в регистр
char i=8;
while(i--){
if(!(r & 0x80)) ClrBit(PORTD,5); else SetBit(PORTD,5);
RegClk(); r <<=1;
}
}

byte GetKey(void){
// Сканирование кнопок с возвратом кода нажатой
byte Mask, temp = 0;
Mask = 0x3E; temp |= KbdRotate(Mask);
Mask = 0x3D; temp |= KbdRotate(Mask);
Mask = 0x3B; temp |= KbdRotate(Mask);
Mask = 0x37; temp |= KbdRotate(Mask);
Mask = 0x2F; temp |= KbdRotate(Mask);
Mask = 0x1F; temp |= KbdRotate(Mask);
return(temp & 0x3F);
}

byte KbdRotate(byte m){
// Вспомогательная функция для опроса кнопок
byte i=6, n = m;
while (i--){
if(!(m & 0x20)) ClrBit(PORTD,5); else SetBit(PORTD,5);
RegClk(); m <<=1;
}
Strobe_2();
if (BitOff(PIND,3)) return(~n);
return(0);
}

void RegClk(void){
// Формирование импульса тактировки регистра
SetBit(PORTD,4); ClrBit(PORTD,4);
}

void Strobe_1(void){
// Формирование строба первого регистра
SetBit(PORTD,6); ClrBit(PORTD,6);
}

void Strobe_2(void){
// Формирование строба второго регистра
SetBit(PORTD,0); ClrBit(PORTD,0);
}


#pragma vector = TIMER1_COMP1_vect
// Обработчик прерывания системного таймера
__interrupt void DelayTick(void){
++SysmS;
}

unsigned getcount(void){
// Возвращает значение системного счетчика (мсек)
unsigned t;
IE; t = SysmS; DI;
return (t);
}

void delayms (unsigned count){
// Функция формирования задержки в мсек
unsigned t = getcount();
while ((getcount() - t) <= count){}
}

#ifdef DEBUG
void phex(byte ch){
// Выводит байт в шестнадцатиричном формате
byte n;
n = (ch >> 4) + 0x30;
if (n > 0x39) n += 7;
sb(n);
n = (ch & 0x0F) + 0x30;
if (n > 0x39) n += 7;
sb(n);
}

void sb(byte data){
// Передача одного байта по последовательному порту
while ( !(USR & (1<<UDRE)) );
UDR = data;
}
#endif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- RW6MKA   Изменение текста программы при смене компилятора и чипа   Oct 25 2010, 11:58
- - sigmaN   Цитатане меняются, а дата без разницы какая. Прико...   Dec 21 2010, 14:42
- - RW6MKA   Во второй регистр в нужный бит заталкиваем 0 а вос...   Dec 22 2010, 12:00
- - RW6MKA   Ну вообщем с регистрами я более-менее разобрался и...   Dec 22 2010, 16:35
- - sigmaN   ЦитатаЯ поменял возвращаемое значение Analog() на ...   Dec 22 2010, 23:27
- - RW6MKA   Цитатану надо же!! )) кажется оно там всег...   Dec 23 2010, 01:11
- - sigmaN   ЦитатаДа нет, не всегда. В предыдущей версии кодау...   Dec 23 2010, 04:47
- - RW6MKA   Вот нужен совет по дальнейшему алгоритму действий....   Dec 23 2010, 07:03
- - sigmaN   50 замеров....как по мне - это как-то многовато.. ...   Dec 23 2010, 07:30
- - RW6MKA   Т.е. вы предлагаете по полученным данным построить...   Dec 24 2010, 01:39
- - RW6MKA   Опа. Дошел до измерения напряжения при котором тик...   Dec 24 2010, 03:12
- - sigmaN   Я уже говорил, что таймер конфигурировать надо. А ...   Dec 24 2010, 05:29
- - RW6MKA   О, пардон. Опять даташит на русском сыграл злую ...   Dec 24 2010, 06:21
- - sigmaN   Забудьте о русских даташитах. Это вам здесь любой...   Dec 24 2010, 07:16
- - RW6MKA   Чёт я впал в затуп.Не могу никак обмыслить как при...   Dec 25 2010, 16:28
- - sigmaN   посоветую для начала снять характеристику и постро...   Dec 25 2010, 19:49
- - RW6MKA   Ну вот это Цитатаповорот ручки резистора на угол =...   Dec 26 2010, 02:40
- - sigmaN   смысл как раз в том, чтобы не делать массив   Dec 26 2010, 10:40
- - RW6MKA   Вот что у меня получилось CODE #include <stdint...   Dec 26 2010, 15:40
- - sigmaN   вы издеваетесь? ЦитатаThe contents of the objectf...   Dec 26 2010, 17:56
- - RW6MKA   Цитатавы издеваетесь? Цитата The contents of the ...   Dec 27 2010, 02:11
- - sigmaN   .map файл приведите. я не знаю что там у вас за пр...   Dec 27 2010, 08:07
- - RW6MKA   Что то я такого файла не наблюдаю.Вот на всякий сл...   Dec 27 2010, 14:51
- - sigmaN   ну так скомпилить надо, чтоб появился )) да тут и...   Dec 27 2010, 22:38
- - RW6MKA   ЦитатаИ вообще, кажется вы тут чё-то немного забур...   Dec 28 2010, 02:09
- - sigmaN   Я канеш неграмотный и тупой, но мне до сих пор не ...   Dec 28 2010, 06:41
- - RW6MKA   Я читал эту статью,ссылку на неё вы давали ранее, ...   Dec 28 2010, 08:00
- - sigmaN   Сколько ноликов и еденичек )) Ручной труд ценится ...   Dec 28 2010, 10:14
- - RW6MKA   ЦитатаВот не знаю я...какие-то странные результаты...   Dec 28 2010, 13:29
- - sigmaN   В приведенном Вами коде использовать TH и TCNT0 в ...   Dec 28 2010, 14:28
- - RW6MKA   ЦитатаВ приведенном Вами коде использовать TH и TC...   Dec 30 2010, 14:35
- - sigmaN   Всё в Ваших руках ))   Dec 30 2010, 14:36
- - RW6MKA   Всем с Новым годом! Вот,столкнулся с банальной...   Jan 1 2011, 16:11
- - sigmaN   Что-то вот никак у Вас не получается мыслить ...   Jan 1 2011, 21:29
- - RW6MKA   ЦитатаЧто-то вот никак у Вас не получается мыслить...   Jan 2 2011, 04:16
- - sigmaN   PIND6 создан для того, чтобы не писать магических ...   Jan 2 2011, 13:14
- - RW6MKA   Всё, башка больше не рубит. Объясните мне тупому...   Jan 3 2011, 14:20
- - sigmaN   для начала проверьте отключена ли у вас оптимизаци...   Jan 3 2011, 14:44
- - RW6MKA   ЦитатаФорматирование кода у вас никуда не годится....   Jan 3 2011, 16:32
- - sigmaN   Организуйте для начала нормальный отладочный вывод...   Jan 3 2011, 18:08
- - XVR   Цитатахотя прыжок сразу на else if(N>48)Прыжок ...   Jan 4 2011, 06:56
- - RW6MKA   ЦитатаПереформатируйте код, как советовал sigmaN, ...   Jan 4 2011, 15:43
- - sigmaN   ЦитатаПоясните,как это сделать в студии?также как ...   Jan 4 2011, 18:20
- - RW6MKA   Вот, вроде всё привёл к нормальному стилю(ежели чт...   Jan 5 2011, 15:51
- - XVR   'Нормальный стиль' - это КодN = Datchik_Po...   Jan 5 2011, 16:16
- - sigmaN   обязательно скурить: http://easyelectronics.ru/avr...   Jan 5 2011, 17:26
- - RW6MKA   ЦитатаПо крайней мере не будет неопределенности с ...   Jan 6 2011, 10:46
- - sigmaN   ЦитатаЭто я так понимаю к вопросу о гистерезисе? П...   Jan 6 2011, 11:48
- - RW6MKA   Вот проекты, povorot к Протеусу,povorot2 код.   Jan 6 2011, 13:04
- - XVR   Это работа оптимизатора (посмотрите ассемблер). Он...   Jan 6 2011, 16:55
- - RW6MKA   ЦитатаЭто работа оптимизатора (посмотрите ассембле...   Jan 7 2011, 12:54
|- - XVR   Цитата(RW6MKA @ Jan 7 2011, 18:54) Так и ...   Jan 7 2011, 14:01
- - sigmaN   Во время работы отладчика Vew->Disassembler. А ...   Jan 7 2011, 14:58
- - RW6MKA   Когда выполняется if (N > 48) { Povorot = R...   Jan 7 2011, 16:16
- - sigmaN   Ну вы же состояние не выставляете, что уже дальше ...   Jan 7 2011, 21:40
- - sigmaN   Блин, надо вам подарок Рождественский сделать ))   Jan 8 2011, 00:48
- - RW6MKA   Вот последний результат моего мучения. Прогонял ...   Jan 9 2011, 16:11
- - RW6MKA   Вот. Свершилось. Поменял PIN6 на PIN5(S0 на S1) ...   Jan 9 2011, 17:12
- - sigmaN   рад за вас )) и что, даже нормально отслеживает по...   Jan 9 2011, 18:13
- - sigmaN   может как-то так его подключим??   Jan 9 2011, 23:45
- - RW6MKA   Код........... OnBit(DDRB,7); //включ...   Jan 10 2011, 00:31
- - sigmaN   кстати да, я тут подумал - транзистор же до опреде...   Jan 10 2011, 00:43
- - RW6MKA   Цитата(sigmaN @ Jan 10 2011, 05:45) может...   Jan 10 2011, 00:48
- - sigmaN   ЦитатаНа счёт задержки я с вами согласен, можно об...   Jan 10 2011, 01:04
- - sigmaN   Как-то что-то я не пойму, оно под отладчиком всег...   Jan 12 2011, 07:43
- - RW6MKA   Да-а-а! А стоило ли так всё усложнять? Схема и...   Jan 12 2011, 16:53
- - sigmaN   Нет там никакого усложнения и особых прямо усилий ...   Jan 12 2011, 22:04
- - RW6MKA   ЦитатаТакже, я думаю нужно добавить таймаут на пов...   Jan 13 2011, 12:21
- - sigmaN   Так так так... без паники )) 1. Правлю код motor_...   Jan 14 2011, 08:35
- - RW6MKA   Приветствую.Вот по приезду сразу занялся кодом и с...   Feb 2 2011, 16:55
- - sigmaN   Ну надо в железе проверить. То, что они в протеусе...   Feb 2 2011, 19:52
- - RW6MKA   Да, учится мне ещё и учится. Воощем я понимаю логи...   Feb 3 2011, 16:35
|- - _Pasha   Цитата(RW6MKA @ Feb 3 2011, 20:35) просто...   Feb 3 2011, 18:25
- - RW6MKA   Вот изменённый проект протеуса Сегодня подкорректи...   Feb 4 2011, 18:44
- - sigmaN   А зачем нам измененный проект протеуса? ЦитатаКо...   Feb 4 2011, 19:39
- - sigmaN   Порядок в проекте начинается с порядка в именах фа...   Feb 5 2011, 11:13
- - RW6MKA   ЦитатаА зачем нам измененный проект протеуса?Дело ...   Feb 6 2011, 16:25
- - sigmaN   В ближайшие два-три дня посмотрю что там к чему......   Feb 6 2011, 17:17
- - RW6MKA   Тут, по ходу пьесы возникли небольшие вопросы. Впр...   Feb 7 2011, 09:01
- - sigmaN   ЦитатаПочему переменной присваиваем инвертируемое ...   Feb 7 2011, 13:39
- - RW6MKA   Вот, собрал я переходник UART-USB и теперь вижу вс...   Feb 7 2011, 15:50
- - sigmaN   Лично у меня в протеусе проблема только одна - ино...   Feb 7 2011, 18:41
- - sigmaN   что ж, похоже надо у народа спросить. Как-то похож...   Feb 7 2011, 20:29
- - sigmaN   Предыдущие вопросы снимаются. Разглючил сам ) На ...   Feb 8 2011, 10:16
- - RW6MKA   Так, чисто познавательные вопросы.Код#define SENSO...   Feb 8 2011, 11:39
- - sigmaN   ЦитатаНе совсем понимаю использования типа double ...   Feb 8 2011, 12:36
- - RW6MKA   Значит так. этот файл работа железа с #define WALK...   Feb 8 2011, 12:45
- - sigmaN   ну CAPTURE.TXT мне нравится. левых замеров не наб...   Feb 8 2011, 13:03
- - RW6MKA   Вот читаю код, а врубится до конца не могу как про...   Feb 8 2011, 13:05
- - sigmaN   Ладно, потом разбираться будем. Давайте добьёмся ...   Feb 8 2011, 13:08
- - RW6MKA   Ну ёлы-палы, в тот раз хоть с трудом но удалось ус...   Feb 8 2011, 13:34
- - sigmaN   Наверное это ещё от того, что тактируется мк от в...   Feb 8 2011, 13:43
- - RW6MKA   Фу, заработала. Пока без сбоев но крайние положени...   Feb 8 2011, 13:48
- - sigmaN   ЦитатаПока без сбоев означает, что ничего из этого...   Feb 8 2011, 20:59
- - RW6MKA   Да-а-а, дело было не в бобине... Вообщем я дико и...   Feb 9 2011, 08:45
- - sigmaN   очень хорошо. Пока поработаем только с WALKING_LED...   Feb 9 2011, 12:14
- - RW6MKA   Индикация на WALKING_LED_TEST работает нормально. ...   Feb 9 2011, 15:01
- - sigmaN   Вот это самое главное. Сейчас вставлю пару костыле...   Feb 9 2011, 19:53
|- - ILYAUL   Цитата(sigmaN @ Feb 9 2011, 22:53) ...про...   Feb 9 2011, 20:15
- - sigmaN   ЦитатаА Вы его запретили в начале программы , он п...   Feb 9 2011, 21:34
- - RW6MKA   Ну, к сожалению это не последняя версия кода)) Вот...   Feb 11 2011, 11:59
4 страниц V  < 1 2 3 4 >


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 15:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016