Страница 290 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 01:18:46
oleg110592
Flasher писал(а):Почему до ноп не дойдет?
потому что по умолчанию char unsigned
с signed char дойдет
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 01:26:36
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]==1 || hour[0]==17) {puts("ok_t");}
}
break;
case 6 : case 7:
{
if (hour[0]==22 || hour[0]==9) {puts("ok_g");}
if (hour[0]==1 || hour[0]==17) {puts("ok_t");}
}
break;
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 01:30:20
Аlex
На всякий случай. А то там чувствуется в программе может переменная доинкрементироваться хрен знает до чего

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 01:33:51
vitalik_1984
А кстати так и не понял с чего это до ноп не дойдет, он ведь безусловно стоит... Может хотели сказать, что по условию cnt в ноль не сбросится?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 01:36:28
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
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 01:53:14
Flasher
Паникеры, занятые софистикой.
i>=0 при i беззнаковой целой всегда истинно. Проблема в тупом программисте, а не в беззнаковости. А вот сравнивать знаковые и беззнаковые нужно весьма осторожно.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 02:08:24
Аlex
Flasher писал(а):сравнивать знаковые и беззнаковые нужно весьма осторожно.
всё также:
Flasher писал(а):Проблема в тупом программисте, а не в беззнаковости

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 10:17:23
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");}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 10:40:56
Flasher
В кодвижине постоянно совершенствуют синтаксический анализатор.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 11:48:56
oleg110592
есть такое - раньше не предупреждал, сейчас поправили:

Гайдуку пора на АРМы переключиться - это актуальнее

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 12:50:07
Volgol_555
Аlex писал(а):На всякий случай. А то там чувствуется в программе может переменная доинкрементироваться хрен знает до чего

инкрементация строго по прерыванию таймера...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 -учту в будущем)
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 13:11:27
oleg110592
проблема в глючности версии - это версия 2.05.6

рекомендую перейти на IAR
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 13:14:47
Volgol_555
Ну теперь все прояснилось...Единственная причина использования именно этой версии...это плохо взломанные последующие ( при добавлении какой-то из встроенных библиотек, компилятор "вылетал"). Может скинете cсылочку на скачку нормальной взломанной новой версии?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 13:22:48
oleg110592
Уж не знаю какую советовать, 2.05.6 не помню где качал - ломанная eval версия, антивирус ругается, ломалка подозрительная, ставил на виртуальной машине (от греха подальше). Последняя более мене нормальная версия запомнилась 1.25.9, потом полностью на IAR и WinAVR перешел.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 13:31:20
a_skr
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 08, 2013 13:37:16
Volgol_555
Спасибо, значит действительно у меня версия глючит

Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн дек 09, 2013 11:19:22
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; //порт Б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; //порт Б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;
}
}
}
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн дек 09, 2013 13:28:26
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);
}
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн дек 09, 2013 13:45:34
pashaumnov
блин не фига не понятно,((( я как бы начинающий и не вкуриваю в некоторые строки(( можно поподробнее пожалуйста.?
void put_byte(char b) тут вот мы что делаем присваиваем b put_byte, а вместо put_byte можно ведь что угодно написать??
я думал надо масив создавать , а тут вот как все просто получилось.
можно с коментариями код , и жеательно с коментами для чайника)))
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пн дек 09, 2013 14:01:19
a_skr
Добавил комментарии