роботы робототехника микроконтроллеры


 Страниц (17): В начало « ... 9 10 11 12 13 [14] 15 16 17 »   

> Без описания
1_ulyanovsk Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  



Прикрепил архивчик. На симуляторе с условием PINС0 тоже кстати почему то не робит.
Скачать файл: my_test.rar
Скачан раз: 356
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



что то вообще по прошивке несуразное ...

а так :
CODE:
while(1)
{
if (PINC & (1<<PINC0)) ; // проверяю еденицу на С0 (вход кстати инверсный ???)
{
PORTD=Dig[N]; // Посылаю на порт D перменную Dig ну и цифру на сегменты соотв.
}
N=N+1 ;
if (N==10) N=0; // ограничиваю счет до девятки
}
}
?


вообще ... посмотрите примеры на свой компилятор... наверняка где то в хэлпе есть или ещё где ....
 
 Top
1_ulyanovsk Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  



Огромное спаибо за подсказку. Но я поступил по американски. У них при старте апполона неисправность была но она не влияла на работу системы в целом. И апполон полетел с ней а они так в ней и не разобралис. Та же ситуация и у меня. .ВОТ ТАК ВСЕ РАБОТАТЕ ))) слава else
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#define a 1
#define b 8
#define c 128
#define d 16
#define e 4
#define f 2
#define g 32
#define h 64

int N;
unsigned char DigNumber = 0;
unsigned char Dig[10];
N=0;

int main(void)
{

DDRD = 0xff;
DDRC = 0x00;
PORTC=0x01;

Dig[0] = (a+b+c+d+e+f);
Dig[1] = (b+c);
Dig[2] = (a+b+g+e+d);
Dig[3] = (a+b+g+c+d);
Dig[4] = (f+g+b+c);
Dig[5] = (a+f+g+c+d);
Dig[6] = (a+f+g+c+d+e);
Dig[7] = (a+b+c);
Dig[8] = (a+b+c+d+e+f+g);
Dig[9] = (a+b+c+d+f+g);

while(1)
{
if(PINC & (1<<PINC0));
else N=N+1;
PORTD=Dig[N];
if (N==10) N=0;
}
}
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



1_ulyanovsk
а разве не так правильно :
if (условие){
; чё нить делаем...
}

?
вот эти фигурные скобки при условиях разве не принято использовать ?
 
 Top
1_ulyanovsk Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  



nest пишет:
1_ulyanovsk
а разве не так правильно :
if (условие){
; чё нить делаем...
}

?
вот эти фигурные скобки не принято использоват ?

Что бы не соврать приведу пример из Шпака по варианту написания if-else на Си.
if (условие) блок_кода_1; else блок_кода_2;
можно заменить услвным вырадением:
(условие) ? блок_кода_1 : блок_кода_2;
Вообще да. Нужно скобки ставить но как я понимаю для легкости ориентации.
А так после ; можно переносить (в примере скобок нет) значит и скобки можно не стаить. Как то так.
(Добавление)
Еще раз спасибо за оживление кнопки. Суббота воскресенье и целый понедельник на нее ушли.
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



не надо Шпака.
надо смотреть доку на тот компилятор, которым польуетесь.
у них там у каждого свои грабли.
 
 Top
1_ulyanovsk Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  



nest пишет:
не надо Шпака.
надо смотреть доку на тот компилятор, которым польуетесь.
у них там у каждого свои грабли.

Безусловно. Поэтому в CodeVisionAVR я даже не суюсь потому что пока не разобрался в нем. А на WinAVR и AvrStudio 4 данное написание работает. И как видно из трехдневных поисков главное правильно задать условие )
 
 Top
1_ulyanovsk Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  



Хыыы... эта ветка чата работает по типу Последний вошл- первый вышел ? ))
Последний вопрос задал вчера- первый и сегодня спрашиваю...
Почему же EEPROM не работает ??
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#define a 1
#define b 8
#define c 128
#define d 16
#define e 4
#define f 2
#define g 32
#define h 64

int N, adress;
unsigned char DigNumber = 0;
unsigned char Dig[10];
N=0;
// ЗАПИСЬ В EEPROM =========================
void EEPROM_write(int adress, int N)
{
while(EECR & (1<<EEWE))
;
EEAR=adress;
EEDR=N;
EECR|=(1<<EEMWE);
EECR|=(1<<EEWE);
}
// ЧТЕНИЕ EEPROM ============================
void EEPROM_read(int adress)
{
while(EECR & (1<<EEWE))
;
EEAR=adress;
EECR|=(1<<EERE);
N=EEDR;
return EEDR;
}

int main(void)
{

DDRD = 0xff;
DDRC = 0x00;
PORTC=0x01;

Dig[0] = (a+b+c+d+e+f);
Dig[1] = (b+c);
Dig[2] = (a+b+g+e+d);
Dig[3] = (a+b+g+c+d);
Dig[4] = (f+g+b+c);
Dig[5] = (a+f+g+c+d);
Dig[6] = (a+f+g+c+d+e);
Dig[7] = (a+b+c);
Dig[8] = (a+b+c+d+e+f+g);
Dig[9] = (a+b+c+d+f+g);

while(1)
{
EEPROM_read(0x010); // читаю N из еепром (ранее запсано перед прошлым выключении)
if (N>=0||N<10) EEPROM_read(0x010); else N=0; // это фильтр нечитаемого бреда из ЕЕПРОМ на случай если там записано не знай что.
if(PINC & (1<<PINC0)); //проверяю кнопку
else N=N+1, EEPROM_write(0x010, N); // N=N+1 и записываю N в ЕЕПРОМ
PORTD=Dig[N]; // цыфры на сегменты
if (N==10) N=0;
}
}
Функции записи и чтения из EEPROM взяты из стандартного Датиша на мой Mega8.

(Отредактировано автором: 10 Ноября, 2009 - 21:19:08)

 
 Top
1_ulyanovsk Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  



А еще . . параллельный вопрос функция _delay - ЗАДЕРЖКА. Во время нее возможны прерывания ? Чето где то краем глаза слышал что ээто задержка намертво. Никаких прерываний ничего , тупо ждет . .
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



смотря как написана функция.

посмотрите в файле delay.h
если там выключены прерывания ("cli"), то прерывания при её вызове не работают.
 
 Top
1_ulyanovsk Post Id



Маршал


Сообщений всего: 126
Дата рег-ции: Сент. 2009  



Вот ! Нашел правильное выражение. Что бы считать нажатие кнопки на ПИН входа С0
нужно следущее условие if( (PINC & (1<<PINC0) ) == 0 ) работает наконец то правильно, без else.
 
 Top
mctim Post Id



Маршал


Сообщений всего: 109
Дата рег-ции: Нояб. 2009  



Привет!
Помогите пожалуйста разобраться.

Выводы PC2-5 - выходы управления двигателями, PD2 - вход.
Вот код:
CODE:

// ехать вперед
PORTC |= 0b00100100;
PORTC &= ~0b00011000;
while((PIND & 0b00000100) != 0b100)
{ // ожидание сигнала
}
PORTC &= ~0b00111100; // стоп

по идее робот должен ехать пока не поступит сигнал на PD2, но получается что он только дернуться успевает как будто сигнал поступает уже(на самом деле нет).
Если написать так:
CODE:

// ехать вперед
PORTC |= 0b00100100;
PORTC &= ~0b00011000;
while((PIND & 0b00000100) != 0b100)
{ // ожидание сигнала
PORTC |= 0b00000010;
_delay_ms(1);
PORTC &= ~0b00000010;
_delay_ms(1);
}
PORTC &= ~0b00111100; // стоп

работает правильно. В чем тут секрет?

ЗЫ. Комплировал WinAVR и AVR Studio.
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



mctim, постарайтесь комментировать все строки вашего кода, например так:
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D.
это поможет и вам не потеряться в нём, и другим будет легче найти ошибки.
Заодно это просто придаёт солидности.

mctim пишет:
пока не поступит сигнал на PD2

:) что есть тут "сигнал" ? сигнал тут обычно бывает либо "логическая единица" (высокий уровень), либо "логический нуль" (низкий уровень).
Всегда важно указывать, какой именно логический уровень проверяется.
 
 Top
mctim Post Id



Маршал


Сообщений всего: 109
Дата рег-ции: Нояб. 2009  



Такой код в МК живет своей жизнью.
CODE:

// ехать вперед
PORTC |= 0b00100100; // на PINC2 и PINC5 подаем высокий уровень сигнала - 5В
PORTC &= ~0b00011000; // на PINC3 и PINC4 подаем низкий уровень сигнала - 0В
while((PIND & 0b00000100) != 0b100) // пока на PIND2 низкий уровень сигнала
{ // ожидание сигнала логической 1
}
PORTC &= ~0b00111100; // стоп - на PINC2-5 подаем низкий уровень

По идее робот должен ехать пока не поступит сигнал логической 1 на PD2, но получается что он только дернуться успевает как будто сигнал поступает уже(на самом деле на PD2 логический 0).
Если, ничего в схеме не меняя, написать так:
CODE:

// ехать вперед
PORTC |= 0b00100100; // на PINC2 и PINC5 подаем высокий уровень сигнала - 5В
PORTC &= ~0b00011000; // на PINC3 и PINC4 подаем низкий уровень сигнала - 0В
while((PIND & 0b00000100) != 0b100) // пока на PIND2 низкий уровень сигнала
{ // ожидание сигнала логической 1
PORTC |= 0b00000010; // подать лог 1 на PC1
_delay_ms(1); // подождать 1 мс
PORTC &= ~0b00000010; // подать лог 0 на PC1
_delay_ms(1);
}
PORTC &= ~0b00111100; // стоп - на PINC2-5 подаем низкий уровень

то работает нормально: дождавшись логической 1 на PC1 "обнуляет" PC2-5.
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



может быть какие то настройки оптимизации в компиляторе ...

а если так :
CODE:
// ехать вперед
PORTC |= 0b00100100; // на PINC2 и PINC5 подаем высокий уровень сигнала - 5В
PORTC &= ~0b00011000; // на PINC3 и PINC4 подаем низкий уровень сигнала - 0В
while((PIND & 0b00000100) != 0b100) // пока на PIND2 низкий уровень сигнала
{ // ожидание сигнала логической 1
asm "nop";
}
PORTC &= ~0b00111100; // стоп - на PINC2-5 подаем низкий уровень


asm "nop" ; - посмотрите точнее в своём компиляторе, как там точно асм-вставки делать.
 
 Top
Страниц (17): В начало « ... 9 10 11 12 13 [14] 15 16 17 »
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru