Страница 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;
  }
  
}
с помощью данной проги я просто моргаю светодиодами............., почемуто светодиод который подключен к нулевому пину порта В все время горит :dont_know: что я не так написал ? :(

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".