Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение DX168B »

Ну, это понятно. Это же условие. :) Это я так, для самообразования. :)
На Си под AVR пока не особо пытался программировать. А сейчас пытаюсь спрыгнуть с ассемблера.
Последний раз редактировалось DX168B Сб июн 16, 2012 21:53:09, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение AI_Disable »

DX168B писал(а):А, ну теперь понятно. :)
А такая запись будет верна?

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

if((PINC&(1<<PC0)) == 0x01){a=1;}

Да, но можно проще:

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

if(PINC&(1<<PC0)){a=1;}

т.к. после накладывания маски будет всё рано либо 1, либо 0.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение DX168B »

А да. Точно. :beer: Так же тоже можно. :)
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Вопросы по С/С++ (СИ)

Сообщение hybroid »

Это вообще годная запись. Вывих мозга менее вероятен.
А кодевижн от PC0 не помрёт? Я им не пользовался ни разу, только GCC.

Я обычно создаю какой-никакой hw.h и в нём дефайню ноги переферии. Удобнее чуть-что в одном месте поменять, а не ползать по всей портянке. Да и вообще абстракция и разделение на куски рулит, если оно в меру, разумеется.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

DX168B не знаю что вы так паритесь так то слабо написать?

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


 if 
(PINC&0x01){ start = 1;}
 

так меньше писать,чем в вашем варианте.и результат компиляции я думаю тоже меньше будет как минимум на одно слово кода.
А такая запись будет верна?

да можно и так написать,но читайте строчку выше.

тут получается сдвиг компилятором превратится в константу 0x01
далее идет команда и константы с рон
после команда перехода.
а в вашем случае еще добавляется команда сравнения опять же с константой и потом уже только переход.

компилируйте оба и сравните.
Я обычно создаю какой-никакой hw.h и в нём дефайню ноги переферии. Удобнее чуть-что в одном месте поменять, а не ползать по всей портянке.

+1 согласен полностью и понятнее будет что к чему что за нога

простите немного на жирафе сижу- на телефоне долго набирать
В поисках истины человек развивается.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение DX168B »

Про CW не знаю. Я им тоже никогда не пользовался. Лучше сразу осваивать чистый стандартный Си.
Но если CW от этого загнется, то думаю, что спасет это:

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

#define PC0 (1<<0)
#define PC1 (1<<1)
........

vitalik_1984 Сейчас компилятора нет под рукой, но обязательно проверю. :beer:
Интересно, а как компилятор сделает это на АСМе?
Так наверное:

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

in r16, PINC
andi r16, 0x01
cpi r16, 0x01
breq Label

Но можно и так:

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

sbic PINC, 0
rjmp Label
Последний раз редактировалось DX168B Сб июн 16, 2012 22:26:34, всего редактировалось 2 раза.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

неправильно
его

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

#define PC0 1

спасет

а то (1<<(1<<0)) после компиляции как то странно будет выглядеть.
В поисках истины человек развивается.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

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

DX168B писал(а):думаю, что спасет это:

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

#define PC0 (1<<0)
#define PC1 (1<<1)
........
Не совсем. Наверное всё-таки так :

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

#define PC0    0
#define PC1    1
#define PC2    2
........
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение DX168B »

Я предполагал, что компилятор сразу переведет (1<<1) в 0x02 и потом вставит константу в запись.
А запись (1<<3) != 0х03 Ошибся я. :oops: :oops: :oops:
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

перевести то он и так переведет,но ведь у вас в программе сдвиг стоит.а против Вашей команды компилятор не попрет.Он выполняет команды без возражений безошибочно,всегда.

а вот какие команды он будет выполнять это уже от вас зависит
В поисках истины человек развивается.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение DX168B »

Ну разве что если и без ошибок, но те #define могут вызвать предупреждения, если мы обратимся к ноге большей по порядку, чем четвертая (PC4).
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

решил я попрактиковаться с ШИМ, мне нужно лавно зажигать одну цифру и в это время плавно тушить другую......, МК ATmega8....., цифры вывожу на газорязрядные индикаторы через ИД1......., вот код:

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

#include <mega8.h>
#include <delay.h>

unsigned char var;
unsigned char x;

// Declare your global variables here

// Timer2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
PORTD=0x24; // зажигаю цифру 4 и тушу цифру 8
}

// Timer2 output compare interrupt service routine
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
PORTD=0x18;// зажигаю цифру 8 и тушу цифру 4
}

void main(void)
{
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 15,625 kHz
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x04;
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0xC0;
// Global enable interrupts
#asm("sei")

while (1)
      {
       for (var=250;var>=3;var--)
           {
            OCR2=var;
            delay_ms(50);
            };
           
            delay_ms(1000);
           
        for (x=4;x<=250;x++)
           {
            OCR2=x;
            delay_ms(50);
            };
        }
}


в реале цифра 4 медленно тухнет и медленно набирает яркость до 100%, в это время 8 горит на все 100%, потом все на оборот....., в чем моя ошибка ? как сделать чтобы ОДНОВРЕМЕННО одна циыра набирала яркость, а другая медленно тухла ?
Tell Me The Truth
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

вроде должно правильно работать. то что в таймере прописано никакого другого варианта не предполагает.

сначала две цифры тухнут,а другие загораются,потом через паузу наоборот.

у вас ошибок там никаких не показывает?а то может старую версию прошивки заливаем?

можно попробовать через паузу
назначать три значения сравнения таймера.начало середина конец и будет видно что там на самом деле.
если в середине все одинаково горят,по краям по разному,то все нормально.
хотя вроде и так все ок.
В поисках истины человек развивается.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Вопросы по С/С++ (СИ)

Сообщение FreshMan »

vitalik_1984 писал(а):у вас ошибок там никаких не показывает?а то может старую версию прошивки заливаем?

да нет, сэтим все ок.
вот почему не работает я не пойму :dont_know:
Tell Me The Truth
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: Вопросы по С/С++ (СИ)

Сообщение Совесть »

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

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Компильнул, все правильно работает, не знаю, что у вас там за глюк.

PS.В проте так ржачно медленно промаргивает, но понятно, как это должно выглядеть.Прошивка верна.
12.hex
(623 байт) 252 скачивания
В поисках истины человек развивается.
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: Вопросы по С/С++ (СИ)

Сообщение БАТАРЕЙКУС »

Мужики, вот знаю такой вопрос здесь звучал, но найти ответ на него сейчас практически невозможно.
как мне в Си компиляторе МСС18 на пике передать грамотно переменную типа long (здесь она 4 байтная) через SPI.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

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

Разделить её на 4 байта и передавать. :)
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Вопросы по С/С++ (СИ)

Сообщение isx »

Добрый вечер) Что то с кодом моим не понятное. Сделал чтоб переменная koord каждый раз при выполнении подчёркнутого условия приравнивалась к RAZMER, но она сбрасывается на 0 почему то. В остальном коде переменная koord встречается только в процессе инициализации. (подчёркнутое условие ТОЧНО выполняется, но koord сбрасывается в "0")
if ((koord + atoi(RAZMER)) <= 999) {
if (c == 0) {PORTC = PORTC + 0b00000100;}
if (b == 0) {
if ((PINC&0b00000001) == 0x01){ b = 1; schet = schet + 1; }}

if (b == 1) {
if ((PINC&0b00000001) != 0x01) {b = 0;}

if (koord + schet == koord + atoi(RAZMER)) {start = 0; koord = koord + atoi(RAZMER);
c = 0; PORTC = PORTC - 0b00000100; RAZMER[0] = ' '; RAZMER[2] = ' '; RAZMER[3] = ' '; goto exit; }}

Не подскажете что может быть?
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: Вопросы по С/С++ (СИ)

Сообщение БАТАРЕЙКУС »

Аlex писал(а):Разделить её на 4 байта и передавать. :)


гениально самбы не догодался.
а как его разделить чтоб в машинных циклах это вышло пошустрей.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Ответить

Вернуться в «Разные вопросы по МК»