CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

Flasher писал(а):Почему до ноп не дойдет?

потому что по умолчанию char unsigned
с signed char дойдет
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

Volgol_555 писал(а): Ведь в проекте я инкрементирую "вручную"....я с char явно не смогу написать вот так ++day;

А вы пробовали???
Можно даже так вот :)))

Код: Выделить всё

  switch (day) {
        case 1:  case 2 : case 3 : case 4: case 5 : 
         
{
            if (hour[0]==22 || hour[0]==12) {puts("ok_g");} 
            if 
(hour[0]==|| hour[0]==17) {puts("ok_t");}
         }
        break;
        case 6 : case 7:
        {
            if (hour[0]==22 || hour[0]==9) {puts("ok_g");}
            if (hour[0]==|| hour[0]==17) {puts("ok_t");}
        }
        break;
    } 
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Код: Выделить всё

default:
  day=1;
На всякий случай. А то там чувствуется в программе может переменная доинкрементироваться хрен знает до чего :))
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение vitalik_1984 »

А кстати так и не понял с чего это до ноп не дойдет, он ведь безусловно стоит... Может хотели сказать, что по условию cnt в ноль не сбросится?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

Неправильное использование беззнаковых целых может приводить к неочевидным ошибкам из-за возникающего переполнения[4]. В приведённом ниже примере использование беззнаковых целых в цикле в C и C++ превращает этот цикл в бесконечный:

Код: Выделить всё

char ar[N];
for (unsigned int i = N-1; i >= 0; --i)
      ar[i] = i;

http://ru.wikipedia.org/wiki/%D0%A6%D0% ... B%D1%85%29
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Re: CodeVision AVR в вопросах и ответах

Сообщение Flasher »

Паникеры, занятые софистикой.
i>=0 при i беззнаковой целой всегда истинно. Проблема в тупом программисте, а не в беззнаковости. А вот сравнивать знаковые и беззнаковые нужно весьма осторожно.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Аlex »

Flasher писал(а):сравнивать знаковые и беззнаковые нужно весьма осторожно.
всё также:
Flasher писал(а):Проблема в тупом программисте, а не в беззнаковости
:)
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

Flasher писал(а):Проблема в тупом программисте, а не в беззнаковости

вы не поняли (при чем тут тупые программисты) - компилятор при тупом программисте тоже тупит, древний старичок C++ Builder 6 и то предупреждает:
СпойлерИзображение

это в C++ Builder 6 правильно работает:

Код: Выделить всё

if (day>5) {
if (hour[0]==22 || hour[0]==12) {puts("ok_g");}
if (hour[0]==1 || hour[0]==17) {puts("ok_t");} //***
}

if (day<6) {
if (hour[0]==22 || hour[0]==9) {puts("ok_g");}
if (hour[0]==1 || hour[0]==17) {puts("ok_t");}
}
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Re: CodeVision AVR в вопросах и ответах

Сообщение Flasher »

В кодвижине постоянно совершенствуют синтаксический анализатор.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

есть такое - раньше не предупреждал, сейчас поправили:
Изображение
Гайдуку пора на АРМы переключиться - это актуальнее :))
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Volgol_555 »

Аlex писал(а):

Код: Выделить всё

default:
  day=1;
На всякий случай. А то там чувствуется в программе может переменная доинкрементироваться хрен знает до чего :))

инкрементация строго по прерыванию таймера...day=1 - это я делал, не помогло...проверяю когда строго day=6....даже Proteus это показывает... Чтобы развеять все сомнения по поводу всей программы, я создал новый проект, где просто настроил UART, объявил 2 переменные:
unsigned char hour[5];
unsigned char day;
Задал day=6; hour[0]=22;
Написал следующее:

while (1)
{

if (day==1) {
if (hour[0]==22 || hour[0]==9) {puts("ok_g");} //выключение
if (hour[0]==1 || hour[0]==17) {puts("ok_t");} //включение *****
}


if (day==6) {
if (hour[0]==22 || hour[0]==12) {puts("ok_g");} //выключение
if (hour[0]==1 || hour[0]==17) {puts("ok_t");} //включение
}

};
}

И....проблема осталась!!! по прежнему отрабатывает команда puts("ok_t") из строки со звездочками....но ведь самое условие этой строки не выполняется (я это проверил)...так где же косяк?
Прикрепляю проект в CVavr + модель Proteus... (если не уверены в корректности Proteus, то я скажу, что проверяю и в реальности на плате - тоже самое выходит!)
А на счет unsigned char - да! действительно с ним можно работать как и с int -учту в будущем)
Вложения
Project Prob.rar
(63.9 КБ) 127 скачиваний
Самое гениальное - всегда самое простое
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

проблема в глючности версии - это версия 2.05.6
Изображение
рекомендую перейти на IAR
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Volgol_555 »

Ну теперь все прояснилось...Единственная причина использования именно этой версии...это плохо взломанные последующие ( при добавлении какой-то из встроенных библиотек, компилятор "вылетал"). Может скинете cсылочку на скачку нормальной взломанной новой версии?
Самое гениальное - всегда самое простое
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: CodeVision AVR в вопросах и ответах

Сообщение oleg110592 »

Уж не знаю какую советовать, 2.05.6 не помню где качал - ломанная eval версия, антивирус ругается, ломалка подозрительная, ставил на виртуальной машине (от греха подальше). Последняя более мене нормальная версия запомнилась 1.25.9, потом полностью на IAR и WinAVR перешел.
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: CodeVision AVR в вопросах и ответах

Сообщение a_skr »

http://sunduk.radiokot.ru/loadfile/?load_id=1299612587&turbo=1 2.05.0
Volgol_555, Ваш пример работает как надо.
Аватара пользователя
Volgol_555
Потрогал лапой паяльник
Сообщения: 301
Зарегистрирован: Пт сен 23, 2011 13:13:51
Откуда: Минск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Volgol_555 »

a_skr писал(а):http://sunduk.radiokot.ru/loadfile/?load_id=1299612587&turbo=1 2.05.0
Volgol_555, Ваш пример работает как надо.

Спасибо, значит действительно у меня версия глючит :))
Самое гениальное - всегда самое простое
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

помогите переписать точнее уменьшить программу . алгоритм работы программы следующий
//при включении мк начинают поочередно загораться 6 светодиодов с интервалом 500мс потом тухнуть в обратном порядке
// затем при подачи на пин Б4 единицы снова загораются 6 светодиодов но с интервалом в 200мс потом пауза 6 сек и тухнут в обратном порядке
мк использую тини 13 , и у него не хватает ног на 6 светиков, решил сдвиговый регистр присобачить 74ch595,и к 6ти ногам по светодиоду, вывожу на него ну скажем грубо от 1 до 6 ( в программе реализовано только вывод 3 символов поочередно) но уже занимает 40 процентов памяти . все не влезит
помогите переписать код по компактнее я могу только так ...
Спойлер#include <tiny13.h>
#include <delay.h>
#define ZASELKA PORTB.2 //нужно подать 1 для защелкивания
#define ZAPIS_BIT PORTB.1 // на вход DS одновременно с тактовыми импульсами на
#define DI_VXOD_DANYX PORTB.0 //вход SH_CP, с каждым новым импульсом мы записываем в регистр 1 бит, сдвигая все записанные ранее

#define RS PORTB.3

unsigned char data[8]= {0,0,0,0,0,0,1,0,}; //хранит числа от 0 до 255 (байт
unsigned int i; // хранит числа от 0 до 65535 (слово == 2 байта)

unsigned char data_2[8]= //хранит числа от 0 до 255 (байт)
{
0,0,0,0,0,1,0,0,
};
int k;
unsigned char data_0[8]= { 0,0,0,0,1,0,0,0,}; //хранит числа от 0 до 255 (байт)
int s;

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x0F;



while (1)
{
PORTB.2=0;
i=0;
while(i<8)
{
DI_VXOD_DANYX=data[i]; //порт Б0 вход данных переписываем при изменении "и"
ZAPIS_BIT = 1; //порт Б1 =1
// порт Б3 =1
delay_ms(5); //пауза 10сек
DI_VXOD_DANYX=0; // порт Б0 = 0
ZAPIS_BIT = 0; // порт Б1 = 0
//порт Б3 = 0
delay_ms(5);
i++;
};
ZASELKA = 1; // выводим на дисплей, защелкиваем
delay_ms(500);
PORTB.2=0;
{
k=0;
while(k<8)
{
DI_VXOD_DANYX=data_2[k]; //порт Б0 вход данных переписываем при изменении "и"
ZAPIS_BIT = 1; //порт Б1 =1
// порт Б3 =1
delay_ms(5); //пауза 10сек
DI_VXOD_DANYX=0; // порт Б0 = 0
ZAPIS_BIT = 0; // порт Б1 = 0
//порт Б3 = 0
delay_ms(5);
k++;
};
ZASELKA = 1; // выводим на дисплей, защелкиваем
delay_ms(500);
PORTB.2=0;

{
s=0;
while(s<8)
{
DI_VXOD_DANYX=data_0[s]; //порт Б0 вход данных переписываем при изменении "и"
ZAPIS_BIT = 1; //порт Б1 =1
// порт Б3 =1
delay_ms(5); //пауза 10сек
DI_VXOD_DANYX=0; // порт Б0 = 0
ZAPIS_BIT = 0; // порт Б1 = 0
//порт Б3 = 0
delay_ms(5);
s++;
};
ZASELKA = 1; // выводим на дисплей, защелкиваем
delay_ms(500);
PORTB.2=0;
}
}
}
}
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: CodeVision AVR в вопросах и ответах

Сообщение a_skr »

22.3% (char - 8 бит). Кто меньше? :)
Спойлер

Код: Выделить всё

#include <tiny13.h>
#include <delay.h>

#define CLK  PORTB.0
#define DATA PORTB.1
#define ENA  PORTB.2

// функция выдачи одного байта в 74595
void put_byte(char b)
{
  char i=8;
  // выводим все 8 бит по одному, начиная со старшего
  do
  {
    DATA = b & 0x80; // выставляем в порт старший бит
    CLK = 1; CLK = 0; // строб sck
    b <<= 1; // сдвигаем наш байт влево на 1 бит
  }
  while(--i); // и так 8 раз
  ENA = 1; ENA = 0; // строб защелки
}

// основная функция
void main(void)
{
  char a;
 
  DDRB = 7; // PB0-2 на выход

  a = 0;  // обнуляем переменную a
  // зажигаем светодиоды
  // в этом цикле a будет принимать значения:
  // 00000001     
  // 00000011     
  // 00000111     
  // 00001111     
  // 00011111     
  // 00111111     
  do
  {
    a = (a<<1) | 1; // сдвигаем a влево на 1 бит и устанавливаем младший бит в 1
    put_byte(a); // выводим a в 74595
    delay_ms(500); // задержка 500 мс
  }
  while(a != 0x3F); // пока a не станет равной 00111111 = 0x3F

  // гасим по аналогии
  do
  {
    a >>= 1;
    put_byte(a);
    delay_ms(500);
  }
  while(a);
 
  // ждем единицы на PB4
  while(PINB.4 == 0);             

  // зажигаем
  do
  {
    a = (a<<1) | 1;
    put_byte(a);
    delay_ms(200);
  }
  while(a != 0x3F);
 
  // задержка 6 секунд
  delay_ms(6000);           
 
  // гасим
  do
  {
    a >>= 1;
    put_byte(a);
    delay_ms(200);
  }
  while(a);

}
Вложения
1.zip
(10.78 КБ) 130 скачиваний
Последний раз редактировалось a_skr Пн дек 09, 2013 14:24:40, всего редактировалось 2 раза.
Аватара пользователя
pashaumnov
Прорезались зубы
Сообщения: 236
Зарегистрирован: Чт июн 25, 2009 16:00:25
Откуда: нижний новгород

Re: CodeVision AVR в вопросах и ответах

Сообщение pashaumnov »

блин не фига не понятно,((( я как бы начинающий и не вкуриваю в некоторые строки(( можно поподробнее пожалуйста.?
void put_byte(char b) тут вот мы что делаем присваиваем b put_byte, а вместо put_byte можно ведь что угодно написать??
я думал надо масив создавать , а тут вот как все просто получилось.
можно с коментариями код , и жеательно с коментами для чайника)))
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: CodeVision AVR в вопросах и ответах

Сообщение a_skr »

Добавил комментарии
Ответить

Вернуться в «AVR»