Страница 165 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср дек 21, 2011 23:03:05
FreshMan
Код: Выделить всё
#include <mega8.h>
#include <delay.h> // подключаем библиотеку задержки
char n;
void main (void)
{
DDRD=255; // Data Direction Register Все пины порта D сконфигурированы на выход
DDRB=0b11111111;
n=0;
while(n<3)
{
PORTB=0b00000001;
delay_ms(500);
PORTD=0b00000001;
delay_ms(500);
PORTD=0b00000010;
delay_ms(500);
PORTD=0b00000100;
delay_ms(500);
PORTD=0b00001000;
delay_ms(500);
PORTD=0b00010000;
delay_ms(500);
PORTD=0b00100000;
delay_ms(500);
PORTD=0b01000000;
delay_ms(500);
PORTD=0b10000000;
delay_ms(500);
n=n+1;
}
}
с помощью данной проги я просто моргаю светодиодами............., почемуто светодиод который подключен к нулевому пину порта В все время горит

что я не так написал ?

Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср дек 21, 2011 23:05:17
Apparatchik
Ну дык Вы его строкой PORTB=0b00000001; засветили и больше нигде не гасите, вот он и горит

Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср дек 21, 2011 23:06:39
FreshMan
точно, СПАСИБО......, ща закошачу

Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср дек 21, 2011 23:14:01
FreshMan
а почему когда в вышеприведенной программе я ставлю n<300 то мен выскакивает такое
Warning: C:\Documents and Settings\User\Рабочий стол\Управление портом ATmega8\Управление портом ATmega8.c(13): pointless integer comparison with an out of range constant
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 00:49:17
vitalik_1984
FreshMan писал(а):а почему когда в вышеприведенной программе я ставлю n<300 то мен выскакивает такое
Warning: C:\Documents and Settings\User\Рабочий стол\Управление портом ATmega8\Управление портом ATmega8.c(13): pointless integer comparison with an out of range constant
бессмысленное сравнение целое сравнение с константой вне пределов
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 00:52:08
Apparatchik
FreshMan писал(а):а почему когда в вышеприведенной программе я ставлю n<300 то мен выскакивает такое
Warning: C:\Documents and Settings\User\Рабочий стол\Управление портом ATmega8\Управление портом ATmega8.c(13): pointless integer comparison with an out of range constant
так, как n типа char, то она не может быть больше 255 и она всегда будет меньше 300, зачем тогда такое условие?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 06:45:54
FreshMan
просто захотелось попробывать будет ли так работать.........

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 12:57:53
wellcom
уВажаемые коты, подскажите такую С конструкцию: нужно, что бы часть программы выполнялась при совпадении условия в цикле, не выходя из него, но только 1 раз!, что бы при следующих совпадениях условия часть программы уже НЕ выполнялась (т.е. единоразово)
вот то, что я налепил, мож у кого будут какие идеи?
Код: Выделить всё
while ((Data_SICK < Li)||(Data_SICK >Ui)) //пока пришедшие данные вне диапазоне +/-0,01 (работаю только с Float)
{
Sick_data_Correct (_Sick,&Data_SICK); //ПРОВЕРИТЬ РЕАЛЬНЫЕ данные во время движения
if ((fabs(fl_Point_Speed1 - Data_SICK))<0.2) //если разница реального знач.и расчетной Точкой 1<0.2 (для устранения дребезга)
{
SPI_SendBits(_AD5260,CLK_AD5260,Speed_2); //сбросим скорость до 50%. ВОТ СЮДА МНЕ НУЖНО ЗАЙТИ ВСЕГО ОДИН РАЗ!, но по скольку у меня float, и реальное значение может меняться
}; //+/-0,01 при малой скорости движения я сюда могу попасть не один раз, а при большой скорости могу и проскочить, что тоже очень плохо.
if ((fabs(fl_Point_Speed2 - Data_SICK))<0.2) //если разница реального знач.и расчетной Точкой 2<0.2
{
SPI_SendBits(_AD5260,CLK_AD5260,Speed_3); //сбросим скорость до 20%. ЗДЕСЬ АНАЛОГИЧНО.
}
//Здесь оставшаяся часть программы (проверка других датчиков, отправка и прием данных по усарту), при частоте кварца 11059, 1 проход цикла занимает немало времени (точно не
//измерял)
};
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 13:09:26
pyzhman
Спросите у автора программы.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 13:15:34
ibiza11
wellcom, заведите флаг, который проверяется в if. если не установлен и выполнилось условие ((fabs(fl_Point_Speed1 - Data_SICK))<0.2), выполняете действие SPI_SendBits(_AD5260,CLK_AD5260,Speed_2); и выставляете этот флаг. более это действие не выполнится. очищаете флаг при выходе из цикла.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 13:37:13
wellcom
Автор проги я, про флаг тоже думал, не хочется выделять память еще на 2 флага...у меня и так 40 глобальных переменных разного типа....проц - атмега 128
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 13:41:01
pyzhman
2 флага - 2 бита. Памяти уйдет в наихудшем случае один байт.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 13:44:38
wellcom
pyzhman писал(а):2 флага - 2 бита. Памяти уйдет в наихудшем случае один байт.
если делать битовые флаги, то упадает скорость обработки, так как извлечение/запись бита в байт займет большее время доступа чем сразу к байту
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 13:50:42
ibiza11
можно использовать маски, не обязательно битовое поле.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 13:56:42
wellcom
да, все таки наверное без ввода флагов не обойтись....
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 13:58:25
pyzhman
Даже возрастет скажу вам. При байтной величине извлекается байт, сравнивается с величиной, осуществляется переход/не переход. При битовой сразу переход/непереход. Посмотрите, что в компилированном файле.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 14:06:39
wellcom
pyzhman писал(а):Даже возрастет скажу вам. При байтной величине извлекается байт, сравнивается с величиной, осуществляется переход/не переход. При битовой сразу переход/непереход. Посмотрите, что в компилированном файле.
я пока АСМ не очень понимаю, но думаю мож так прокатит?
Код: Выделить всё
BitTemp=0x03;
if (fl_Point_Speed1 < Data_SICK)&&(0b00000001&BitTemp))
{
.......
BitTemp = 0x2;
}
if (fl_Point_Speed2 < Data_SICK)&&(0b00000010&BitTemp))
{
.......
BitTemp = 0x0;
}
или так быстрее будет выполнятся?
if( (0b00000010&BitTemp) &&(fl_Point_Speed2 < Data_SICK))
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 14:09:10
pyzhman
Битовая переменная "0" или "1".
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 14:11:04
wellcom
pyzhman писал(а):Битовая переменная "0" или "1".
ет был вопрос или утверждение?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт дек 22, 2011 17:25:54
pyzhman
Точка в конце текста. Не вопросительный знак.

Битовая переменная может принимать значения "0" или "1".