На Си под AVR пока не особо пытался программировать. А сейчас пытаюсь спрыгнуть с ассемблера.
Вопросы по С/С++ (СИ)
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ну, это понятно. Это же условие.
Это я так, для самообразования. 
На Си под AVR пока не особо пытался программировать. А сейчас пытаюсь спрыгнуть с ассемблера.
На Си под 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: Вопросы по С/С++ (СИ)
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: Вопросы по С/С++ (СИ)
А да. Точно.
Так же тоже можно. 
Так же тоже можно. I am DX168B and this is my favourite forum on internet!
Re: Вопросы по С/С++ (СИ)
Это вообще годная запись. Вывих мозга менее вероятен.
А кодевижн от PC0 не помрёт? Я им не пользовался ни разу, только GCC.
Я обычно создаю какой-никакой hw.h и в нём дефайню ноги переферии. Удобнее чуть-что в одном месте поменять, а не ползать по всей портянке. Да и вообще абстракция и разделение на куски рулит, если оно в меру, разумеется.
А кодевижн от PC0 не помрёт? Я им не пользовался ни разу, только GCC.
Я обычно создаю какой-никакой hw.h и в нём дефайню ноги переферии. Удобнее чуть-что в одном месте поменять, а не ползать по всей портянке. Да и вообще абстракция и разделение на куски рулит, если оно в меру, разумеется.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
DX168B не знаю что вы так паритесь так то слабо написать?
так меньше писать,чем в вашем варианте.и результат компиляции я думаю тоже меньше будет как минимум на одно слово кода.
да можно и так написать,но читайте строчку выше.
тут получается сдвиг компилятором превратится в константу 0x01
далее идет команда и константы с рон
после команда перехода.
а в вашем случае еще добавляется команда сравнения опять же с константой и потом уже только переход.
компилируйте оба и сравните.
+1 согласен полностью и понятнее будет что к чему что за нога
простите немного на жирафе сижу- на телефоне долго набирать
Код: Выделить всё
if (PINC&0x01){ start = 1;}
так меньше писать,чем в вашем варианте.и результат компиляции я думаю тоже меньше будет как минимум на одно слово кода.
А такая запись будет верна?
да можно и так написать,но читайте строчку выше.
тут получается сдвиг компилятором превратится в константу 0x01
далее идет команда и константы с рон
после команда перехода.
а в вашем случае еще добавляется команда сравнения опять же с константой и потом уже только переход.
компилируйте оба и сравните.
Я обычно создаю какой-никакой hw.h и в нём дефайню ноги переферии. Удобнее чуть-что в одном месте поменять, а не ползать по всей портянке.
+1 согласен полностью и понятнее будет что к чему что за нога
простите немного на жирафе сижу- на телефоне долго набирать
В поисках истины человек развивается.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Про CW не знаю. Я им тоже никогда не пользовался. Лучше сразу осваивать чистый стандартный Си.
Но если CW от этого загнется, то думаю, что спасет это:
vitalik_1984 Сейчас компилятора нет под рукой, но обязательно проверю.
Интересно, а как компилятор сделает это на АСМе?
Так наверное:
Но можно и так:
Но если CW от этого загнется, то думаю, что спасет это:
Код: Выделить всё
#define PC0 (1<<0)
#define PC1 (1<<1)
........
vitalik_1984 Сейчас компилятора нет под рукой, но обязательно проверю.

Интересно, а как компилятор сделает это на АСМе?
Так наверное:
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
неправильно
его
спасет
а то (1<<(1<<0)) после компиляции как то странно будет выглядеть.
его
Код: Выделить всё
#define PC0 1спасет
а то (1<<(1<<0)) после компиляции как то странно будет выглядеть.
В поисках истины человек развивается.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Не совсем. Наверное всё-таки так :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: Вопросы по С/С++ (СИ)
Я предполагал, что компилятор сразу переведет (1<<1) в 0x02 и потом вставит константу в запись.
А запись (1<<3) != 0х03 Ошибся я.

А запись (1<<3) != 0х03 Ошибся я.
I am DX168B and this is my favourite forum on internet!
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
перевести то он и так переведет,но ведь у вас в программе сдвиг стоит.а против Вашей команды компилятор не попрет.Он выполняет команды без возражений безошибочно,всегда.
а вот какие команды он будет выполнять это уже от вас зависит
а вот какие команды он будет выполнять это уже от вас зависит
В поисках истины человек развивается.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ну разве что если и без ошибок, но те #define могут вызвать предупреждения, если мы обратимся к ноге большей по порядку, чем четвертая (PC4).
I am DX168B and this is my favourite forum on internet!
Re: Вопросы по С/С++ (СИ)
решил я попрактиковаться с ШИМ, мне нужно лавно зажигать одну цифру и в это время плавно тушить другую......, МК ATmega8....., цифры вывожу на газорязрядные индикаторы через ИД1......., вот код:
в реале цифра 4 медленно тухнет и медленно набирает яркость до 100%, в это время 8 горит на все 100%, потом все на оборот....., в чем моя ошибка ? как сделать чтобы ОДНОВРЕМЕННО одна циыра набирала яркость, а другая медленно тухла ?
Код: Выделить всё
#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: Вопросы по С/С++ (СИ)
вроде должно правильно работать. то что в таймере прописано никакого другого варианта не предполагает.
сначала две цифры тухнут,а другие загораются,потом через паузу наоборот.
у вас ошибок там никаких не показывает?а то может старую версию прошивки заливаем?
можно попробовать через паузу
назначать три значения сравнения таймера.начало середина конец и будет видно что там на самом деле.
если в середине все одинаково горят,по краям по разному,то все нормально.
хотя вроде и так все ок.
сначала две цифры тухнут,а другие загораются,потом через паузу наоборот.
у вас ошибок там никаких не показывает?а то может старую версию прошивки заливаем?
можно попробовать через паузу
назначать три значения сравнения таймера.начало середина конец и будет видно что там на самом деле.
если в середине все одинаково горят,по краям по разному,то все нормально.
хотя вроде и так все ок.
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
vitalik_1984 писал(а):у вас ошибок там никаких не показывает?а то может старую версию прошивки заливаем?
да нет, сэтим все ок.
вот почему не работает я не пойму

Tell Me The Truth
Re: Вопросы по С/С++ (СИ)
Код рабочий. Проверьте железо.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Компильнул, все правильно работает, не знаю, что у вас там за глюк.
PS.В проте так ржачно медленно промаргивает, но понятно, как это должно выглядеть.Прошивка верна.
PS.В проте так ржачно медленно промаргивает, но понятно, как это должно выглядеть.Прошивка верна.
В поисках истины человек развивается.
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: Вопросы по С/С++ (СИ)
Мужики, вот знаю такой вопрос здесь звучал, но найти ответ на него сейчас практически невозможно.
как мне в Си компиляторе МСС18 на пике передать грамотно переменную типа long (здесь она 4 байтная) через SPI.
как мне в Си компиляторе МСС18 на пике передать грамотно переменную типа long (здесь она 4 байтная) через SPI.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Разделить её на 4 байта и передавать. 
Re: Вопросы по С/С++ (СИ)
Добрый вечер) Что то с кодом моим не понятное. Сделал чтоб переменная 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 байта и передавать.
гениально самбы не догодался.
а как его разделить чтоб в машинных циклах это вышло пошустрей.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.