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

 
 
21 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Изменение текста программы при смене компилятора и чипа
RW6MKA
сообщение Oct 25 2010, 11:58
Сообщение #1


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

Группа: Участник
Сообщений: 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
sigmaN
сообщение Oct 26 2010, 02:46
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
нужно чтобы прога работала и компилировалась в AVR Studio или Code Vision AVR под камень ATTINY2313V-10PU. Вот сам исходник(чёт не получается файлом выложить)
Ну а так вообще чего там...обычное портирование... если не ставить целью перелазить на GNU(WinAVR) то будет не так уж и сложно. Кода не много...Работы, соответственно, тоже )
Ну вы же не ждете, что я сейчас полезу в даташиты и буду сравнивать названия регистров и номера байтов одного и другого контроллера и указывать Вам на конкретные изменения в коде?
Эту работу Вам придётся проделать самостоятельно.
Перелезть с IAR на GNU будет ещё чуть более хлопотно, т.к. слыхал, что IAR имеет(впрочем как и все компиляторы) немного своих специфичных примочек(не знаю используются ли они в вашем коде)..


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Oct 27 2010, 12:28
Сообщение #3


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

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



Кода действительно немного и переделать эту программку тоже, я думаю, не составит большого труда опытному программеру,но...ОПЫТНОМУ! wink.gif Я в этом деле чайник и поэтому и прошу помощи у клуба знатоков. help.gif
Есть,как мне кажется, два пути решения этой проблемы:1-выставить фьюзы для tyni2313 и прошить его прошивкой для 90s2313,по идее это должно сработать.2(более длинный путь)-переделка исходника и его компиляция в CodeVisionAVR под tyni2313.Это более трудный путь,но более предпочтительный.Если бы кто взялся помоч в этом хотя бы советами и комментариями к исходнику я был бы очень признателен. a14.gif Простая вставка текста в проект CodeVisionAVR даёт кучу ошибок начиная с заголовочных файлов <2313.h> <inavr.h>,которые видимо используются только в IAR,но если с первым понятно то чем заменить <inavr.h>вообще не понимаю и всё в таком духе... crying.gif Вообщем нужны коменты по строчкам какая что делает и совет как это написать в CodeVisionAVR help.gif
По этому адресу описание устройства http://www.ut1wpr.newmail.ru/DirAnt/dir.htm а схему устройства и файл исходника вкладываю.
Прикрепленное изображение
Прикрепленный файл  _________.txt ( 10.44 килобайт ) Кол-во скачиваний: 221
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 28 2010, 17:52
Сообщение #4


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Не волоку в специфике CodeVisionAVR, я от WinAWR и Атмеловской студии тащусь wink.gif

Лично я начал бы с разбора существующего исходника. Нужно добиться того, чтобы каждая строка была понятна вам. Что куда и зачем. Это должно быть в голове.

Как вариант, я бы таки поставил кряканый IAR и поглядел бы во все эти заголовки. А может быть даже компильнул бы из IARа данный исходник, а потом в симуляторе глянул бы что к чему(это поможет реально понять программу). Ну а дальше надо начинать портировать. Если вы будете понимать каждую строчку - это перестанет быть сложной задачей.
Ну а в WinAVR всё начинается с выбора правильного камня и частоты в свойствах проекта и инкуда
Код
#include <avr/io.h>
ну и привыкаем сразу к
Код
#include <stdint.h>
а также может пригодиться
Код
#include <util/delay.h>


И с этого момента вся переферия будет доступна вам!
Код
//конфигурируем пины, управляющие дисплеем как OUTPUT
    DDRB = (1 << 0) | (1 << 6) | (1 << 7);
    DDRD = (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7);
    //порт С весь используется как OUTPUT(на нем строки и спикер)
    DDRC = 0xFF;
    /*
    * включаем pull-up резисторы на пинах с кнопками
    * внешних резисторов нет и кнопки иначе работать небудут
    */
    PORTD |= (1 << 2) | (1 << 3);
как-то так.....

Ну и даташит придётся полистать, а что делать что делать, кому щас легко? )

Блин, а программу маньяк какой-то писал))
Одно только
Код
Convert(Angle = ee_angle)
чего стоит )) Но ничего, заодно и Си подучите ))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Oct 29 2010, 17:08
Сообщение #5


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

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



Цитата
Не волоку в специфике CodeVisionAVR, я от WinAWR и Атмеловской студии тащусь

Да я сам не волоку,но это чуть ли не едиственный компилятор по которому есть неплохие книги на русском blush.gif

Цитата
Лично я начал бы с разбора существующего исходника. Нужно добиться того, чтобы каждая строка была понятна вам. Что куда и зачем. Это должно быть в голове.

Вот и я хочу разобраться с кодом,хотя честно сказать в С полный чайник. smile3046.gif Есть и hex этого исходника сделаный в IAR т.е.залить его в чип и дело с концом,но автор не уверен что это рабочая версия программы(за давностью разработки файлы перепутались и мне скинул что нашел)и поэтому желательно сначала проверить её на работоспособность.

Наверно я всё таки не правильно подхожу к проблеме.Попытаюсь сформулировать свою просьбу по другому.1)Народ,скажите кто может проверить,это рабочая программа?2)Если выставить фьюзы на tiny2313 и прошить прошивкой с этой прогой(которая писалась напомню под 90s2313) будет ли tiny2313 работать правильно?Это что касается практической стороны вопроса(ну в самом деле отступать поздно,схема материализована и ждёт прошивки). rolleyes.gif В теории же хочется разобраться какой кусок программы за что отвечает и имеющихся в проге коментов для меня явно маловато,поскольку повторюсь чайник я в этом. Посему прошу, если найдётся добрая душа, согласная помочь страждущему новичку,то пусть вооружится терпением и маркером и пометит разными цветами куски проги отвечающие за:
1.включение реле2,реле1 т.е.вращение двигателя
2.индикацию
3.прекращение поворота дальше определённого положения датчика(кстати я так понимаю происходит сравнение падения напряжения на датчике с эталонным?)
4.занесения показаний индикации в память и чтение оттуда
и т.д.
И может кто подсказать где посмотреть готовые куски программ с реализацией схожих задачь?

Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 29 2010, 18:22
Сообщение #6


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Давайте разберемся какая у вас цель то?
1. Вам нужен просто рабочий девайс? Тогда реально один действенный выход: найти программера(практически любого программера, имющего опыт работы с микроконтроллерами) и он здесь разберется. Заплатите ему денег и все будут довольны. Тем более, что железо уже есть. А может заплатить тому человеку у которого взяли исходник?

2. Проект образовательный, вам надоело быть чайником и вы твёрдо решили разобраться и готовы потратить на это столько времени, сколько будет необходимо.
На этот вариант будет свой roadmap(предложу, если интересно) и вы всё сможете.

И поймите же наконец, ну не станет никто копаться в этом коде и что-то там выяснять и выделять цветами.
Тем более при такой постановке вопросоа. Вы по сути просите за вас выполнить работу.
На этом форуме большинство людей ценит своё время, у каждого есть свои проекты начиная от хобби и заканчивая халтурами...
Что-то реальное подсказать - всегда подскажут или направят, но работать придётся всё равно Вам.

Я просмотрел код по диагонали и мне он вообще не нравится! ИМХО тут хорошо бы заново сформулировать задачу и переписать всё по человечески.

И поймите, если времени нет и девайс реально нужен работающий - вы ничего не успеете и на много правильнее будет дать денег кому-нибудь.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Oct 30 2010, 17:27
Сообщение #7


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

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



Цитата
1. Вам нужен просто рабочий девайс?

Да,мне нужен рабочий девайс и эту проблему я решу,не заморачивайтесь.

Цитата
Проект образовательный, вам надоело быть чайником и вы твёрдо решили разобраться и готовы потратить на это столько времени, сколько будет необходимо.
На этот вариант будет свой roadmap(предложу, если интересно) и вы всё сможете.

Да,скорее так,не люблю когда что то не понятно и буду рад любой помощи.Я бы с радостью написал программу заново,если бы знал как.Если вы согласитесь изредко просматривать куски моей проги и корректировать их,то буду премного благодарен,но это наверно лучше уже через личку,а эту тему наверно стоит прикрыть поскольку не несёт ничего полезного.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Oct 30 2010, 17:50
Сообщение #8


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Насчёт лички не согласен )
Прокомментировать ваш код и ответить на конкретные вопросы - без проблем.

Недавно тут(в разделе начинающих) кому-то помогали ссылками и литературой по Си, найдите топик, скачайте и читайте.
В общем начинать неплохо с Кернигана и Ричи Язык Си 2е издание. Именно 2е, не 1е!
А также в Сети найдете многго чего по AVR на русском.


Удачи!


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 1 2010, 17:54
Сообщение #9


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

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



Спасибо,эта книга у меня есть её и читаю.Литературы действительно много.
Программу начну писать заново,схема таже,но задачи,я думаю лучше разбить на куски.
Сначала написать прогу по повороту при нажатии соответствующей кнопки вправо, влево, стоп.При этом если после поворота в одну сторону нажать не стоп а сразу поворот в другую сторону, то включение поворота должно происходить всё равно после остановки на 2с.
Потом нужно реализовать функцию остановки вращения при достижении датчиком определённого сопротивления при этом кнопка вращения в эту сторону должна блокироваться.
Потом добавить индикацию угла поворота датчика.
Потом запись последних показаний в память.Как такая последовательность?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 2 2010, 16:16
Сообщение #10


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Хорошо.
Вот с этого и начните.
Делаем пустой проект, инициализируем нужные порты как выход( RUN и REV на вашей схеме) нужные на вход(кстати где там кнопки то?).
Программа получится строк на 10 макс. Кнопки для начала можно опрашивать прямо в цикле типа вот так:
Код
//если нажата кнопка 2 - стоп
            if( !(PIND & 0x8) )
            {
              PORTB &= ~0x0С; //очистить биты 2 и 3 порта B. Таким образом двигатель останавливается
            }
Тут кнопка коротит порт на землю. Т.е. если кнопка нажата - соответствующий бит порта ставится в 0.
В этом примере мы проверяем бит 3 порта D микроконтроллера. Именно на этот пин подключена кнопка.
Ну а на B2 и B3 допустим подключены RUN и REV.
Соответственно, в обработчике другой кнопки(RUN) будет установка соответствующего бита порта B.

Подставьте свои значения из схемы и всё будет )


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 4 2010, 16:15
Сообщение #11


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

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



Вот кусочек моих стараний smile3046.gif ,при компиляции ошибок нет,но в протеусе не работает,что не так?
Код
#include <tiny2313.h> //загрузка библиотеки ATtiny2313
#include <delay.h>    

void main(){
                 // инициализация порта D
                  //PD1-2 func=out,state=0
                  //PD4-6 func=in,state=P
   PORTD=0x70;    //установка битов порта D в 0 или 1
   DDRD=0x06;     //установка порта D на in или out
   ACSR=0x80;     //настройки аналогового компаратора
  while (PIND.6==0){      //если кнопка S0(см.схему) нажата
     PORTD.2=1;           //включить поворот вправо(RUN)
    }                     //цикл выполняется пока действительно условие
  while (PIND.4==0){      //если кнопка S2 нажата
     PORTD.1=1;           //включить поворот влево(REV)
    }
}
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 4 2010, 17:06
Сообщение #12


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Ну конечно не будет работать.
Всё дело в том, что Ваша программа пробегает отдин раз(за доли секунды) и выходит из функции main.

Вам нужно организовать бесконечный цикл и уже в нем проверять условие нажатия кнопок и выдавать соответствующие сигналы.
Код
while (1)
{
  if (PIND.6==0)
  {      //если кнопка S0(см.схему) нажата
     PORTD.2=1;           //включить поворот вправо(RUN)
  }                     //цикл выполняется пока действительно условие
  if (PIND.4==0)
  {      //если кнопка S2 нажата
     PORTD.1=1;           //включить поворот влево(REV)
  }
}


Кстати, судя по схеме, у вас RUN 1/0 задаёт работает ли двигатель в принципе(старт/стоп), а вот REV 1/0 задаёт направление вращения.

P.S. инициализацию
PORTD=0x70; //установка битов порта D в 0 или 1
DDRD=0x06; //установка порта D на in или out
ACSR=0x80; //настройки аналогового компаратора
не проверял. Оставлю проверку битов Вам в качестве домашнего задания ))

P.P.S. Это только мне кажется, что там на кнопках диоды не в ту сторону стоят?
Дело в том, что из Вашей программы следует, что нажатие кнопки приводит к установке низкого уровня на порте(проверка на == 0).
Т.е. кнопка должна цепляться на общий провод, а высокий уровень при размыкании контактов кнопки, по идее устанавливается за счёт внутренних подтяжек(pull-up резисторов) контроллера.
Кстати не забудьте, что их можно случайно отключить и вообще я бы поставил ещё внешние для увеличения помехозащищенности.
Таким образом, если кнопка нажата - ток через pull-up резистор вытекает из микроконтроллера и уходит в общий провод.
Однако диоды установлены неправильно и при таком сценарии окажутся запертыми и ток не потечет. А значит лог. 0 на ноге контроллера установлен не будет.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 4 2010, 20:53
Сообщение #13


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

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



Цитата
Ну конечно не будет работать.
Всё дело в том, что Ваша программа пробегает отдин раз(за доли секунды) и выходит из функции main.

Я об этом думал,но никто не пишет о таких простых вещах,поэтому не нашел подтверждения своим мыслям.

Цитата
Кстати, судя по схеме, у вас RUN 1/0 задаёт работает ли двигатель в принципе(старт/стоп), а вот REV 1/0 задаёт направление вращения.

Нет,включается какое то одно реле и их переключение меняет полярность питания двигателя и соответственно направление его вращения.

Цитата
P.P.S. Это только мне кажется, что там на кнопках диоды не в ту сторону стоят?

Знаете,у меня подозрение что это типа матричной клавы(строка PD3,столбцы - PD4-6) и диоды включены правильно,но тогда сопротивление R3 должно быть 470Ом.Если это не так,то я тогда не понимаю назначение вывода RET?
На протеусе я моделировал без диодов кнопкой на землю(при включённых подтягивающих резисторах)
Кстати вы не пользуетесь протеусом?Если пользуетесь подскажите как поменять номинал VCC.

Цитата
Кстати, судя по схеме, у вас RUN 1/0 задаёт работает ли двигатель в принципе(старт/стоп), а вот REV 1/0 задаёт направление вращения.

Именно так,я сначала написал потом взглянул на схему,так что алгоритм работы поменяю на
Код
while(){
  
     while (PIND.6==0){    //если кнопка S0(см.схему) нажата
     PORTD.2=1;            //включить поворот (RUN)
     PORTD.1=0;            //реверс не включать
     }                     //цикл выполняется пока действительно условие
     while (PIND.4==0){    //если кнопка S2 нажата
     PORTD.2=1;            //включить поворот
     PORTD.1=1;            //включить реверс(REV)
     }
    
   }

}
так я думаю правильно?Вот я ещё слышал как то дребезг контактов кнопок компенсируют?Да,и думаю от кнопки стоп вообще отказаться(используя не фиксируемые кнопки при таком алгоритме "пока держишь-крутится" я думаю стоп лишняя функция)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 5 2010, 07:03
Сообщение #14


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Цитата
Кстати, судя по схеме, у вас RUN 1/0 задаёт работает ли двигатель в принципе(старт/стоп), а вот REV 1/0 задаёт направление вращения.


Нет,включается какое то одно реле и их переключение меняет полярность питания двигателя и соответственно направление его вращения.
Ну я хоть и программер, но по схеме же видно, что нижние по схеме контакты - это RUN. Когда они замкнуты на двигатель - он вращается в направлении, которое определяется положением верхних контактов, а следовательно: уровнем на выводе REV.

Цитата
Знаете,у меня подозрение что это типа матричной клавы(строка PD3,столбцы - PD4-6) и диоды включены правильно,но тогда сопротивление R3 должно быть 470Ом.Если это не так,то я тогда не понимаю назначение вывода RET?
Как-то странно всё это....честное слово.... какой тут смысл во всех этих матрицах? В общем надо бы смотреть исходник тот оригинальный....

В протеусе там что-то типа Design->Power rails....кажется.В общем ищите Power rails. Сейчас протеус не установлен - точно сказать не смогу.


Цитата
Именно так,я сначала написал потом взглянул на схему,так что алгоритм работы поменяю на.....
Вы кажется игнорируете то, что я вам говорю.
Найдите 10 отличий между Вашим кодом и тем, что я привел в предыдущем сообщении.
Ну не нужны там while, там if же! А в главном цикле нужно while(1) !
1 в скобках означает истину. А while, как известно, исполняется пока значение в скобках истинно. В Си логический тип интерпретируется следующим образом: 0 - ложь; Не 0 - истина;
т.е. запись while(1) создаёт бесконечный цикл, в котором мы непрепывно проверяем нажатие кнопок и меняем состояние пинов RUN и REV.
Конечно, Ваши while (PIND.6==0){ тоже будут работать, но вообще if там более корректно.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
RW6MKA
сообщение Nov 5 2010, 12:56
Сообщение #15


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

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



Цитата
Вы кажется игнорируете то, что я вам говорю.
Найдите 10 отличий между Вашим кодом и тем, что я привел в предыдущем сообщении.
Ну не нужны там while, там if же! А в главном цикле нужно while(1) !


Я видел что у вас выражено через оператор if,но честно говоря не понимаю разницы.И там и там проверяется условие и если оно правильно работает тело,а 1 я просто забыл написать,потом то исправил когда при компиляции получил ошибку.Сам код я так понимаю правильный?
Код
while(1){
  
     if (PIND.6==0){    //если кнопка S0(см.схему) нажата
     PORTD.2=1;            //включить поворот (RUN)
     PORTD.1=0;            //реверс не включать
     }                     //цикл выполняется пока действительно условие
     if (PIND.4==0){    //если кнопка S2 нажата
     PORTD.2=1;            //включить поворот
     PORTD.1=1;            //включить реверс(REV)
     }
    
   }

Теперь такой вопрос.Мне не понятна реализация измерения напряжения датчика угла поворота.Как это делается и где можно почитать об этом?
Go to the top of the page
 
+Quote Post

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

 


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


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