Страница 97 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 21:51:57
DX168B
Ну, это понятно. Это же условие.

Это я так, для самообразования.

На Си под AVR пока не особо пытался программировать. А сейчас пытаюсь спрыгнуть с ассемблера.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 21:52:15
AI_Disable
DX168B писал(а):А, ну теперь понятно.
А такая запись будет верна?
Да, но можно проще:
т.к. после накладывания маски будет всё рано либо 1, либо 0.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 21:54:08
DX168B
А да. Точно.

Так же тоже можно.

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 21:55:02
hybroid
Это вообще годная запись. Вывих мозга менее вероятен.
А кодевижн от PC0 не помрёт? Я им не пользовался ни разу, только GCC.
Я обычно создаю какой-никакой hw.h и в нём дефайню ноги переферии. Удобнее чуть-что в одном месте поменять, а не ползать по всей портянке. Да и вообще абстракция и разделение на куски рулит, если оно в меру, разумеется.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 21:57:00
vitalik_1984
DX168B не знаю что вы так паритесь так то слабо написать?
так меньше писать,чем в вашем варианте.и результат компиляции я думаю тоже меньше будет как минимум на одно слово кода.
А такая запись будет верна?
да можно и так написать,но читайте строчку выше.
тут получается сдвиг компилятором превратится в константу 0x01
далее идет команда и константы с рон
после команда перехода.
а в вашем случае еще добавляется команда сравнения опять же с константой и потом уже только переход.
компилируйте оба и сравните.
Я обычно создаю какой-никакой hw.h и в нём дефайню ноги переферии. Удобнее чуть-что в одном месте поменять, а не ползать по всей портянке.
+1 согласен полностью и понятнее будет что к чему что за нога
простите немного на жирафе сижу- на телефоне долго набирать
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 22:03:45
DX168B
Про CW не знаю. Я им тоже никогда не пользовался. Лучше сразу осваивать чистый стандартный Си.
Но если CW от этого загнется, то думаю, что спасет это:
Код: Выделить всё
#define PC0 (1<<0)
#define PC1 (1<<1)
........
vitalik_1984 Сейчас компилятора нет под рукой, но обязательно проверю.

Интересно, а как компилятор сделает это на АСМе?
Так наверное:
Код: Выделить всё
in r16, PINC
andi r16, 0x01
cpi r16, 0x01
breq Label
Но можно и так:
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 22:08:27
vitalik_1984
неправильно
его
спасет
а то (1<<(1<<0)) после компиляции как то странно будет выглядеть.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 22:08:53
Аlex
DX168B писал(а):думаю, что спасет это:
Код: Выделить всё
#define PC0 (1<<0)
#define PC1 (1<<1)
........
Не совсем. Наверное всё-таки так :
Код: Выделить всё
#define PC0 0
#define PC1 1
#define PC2 2
........
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 22:10:09
DX168B
Я предполагал, что компилятор сразу переведет (1<<1) в 0x02 и потом вставит константу в запись.
А запись (1<<3) != 0х03 Ошибся я.

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 22:14:30
vitalik_1984
перевести то он и так переведет,но ведь у вас в программе сдвиг стоит.а против Вашей команды компилятор не попрет.Он выполняет команды без возражений безошибочно,всегда.
а вот какие команды он будет выполнять это уже от вас зависит
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб июн 16, 2012 22:22:23
DX168B
Ну разве что если и без ошибок, но те #define могут вызвать предупреждения, если мы обратимся к ноге большей по порядку, чем четвертая (PC4).
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс июн 17, 2012 12:38:56
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%, потом все на оборот....., в чем моя ошибка ? как сделать чтобы ОДНОВРЕМЕННО одна циыра набирала яркость, а другая медленно тухла ?
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс июн 17, 2012 13:33:59
vitalik_1984
вроде должно правильно работать. то что в таймере прописано никакого другого варианта не предполагает.
сначала две цифры тухнут,а другие загораются,потом через паузу наоборот.
у вас ошибок там никаких не показывает?а то может старую версию прошивки заливаем?
можно попробовать через паузу
назначать три значения сравнения таймера.начало середина конец и будет видно что там на самом деле.
если в середине все одинаково горят,по краям по разному,то все нормально.
хотя вроде и так все ок.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс июн 17, 2012 13:46:45
FreshMan
vitalik_1984 писал(а):у вас ошибок там никаких не показывает?а то может старую версию прошивки заливаем?
да нет, сэтим все ок.
вот почему не работает я не пойму

Re: Вопросы по С/С++ (СИ)
Добавлено: Вс июн 17, 2012 14:44:26
Совесть
Код рабочий. Проверьте железо.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс июн 17, 2012 15:05:31
vitalik_1984
Компильнул, все правильно работает, не знаю, что у вас там за глюк.
PS.В проте так ржачно медленно промаргивает, но понятно, как это должно выглядеть.Прошивка верна.
- 12.hex
- (623 байт) 257 скачиваний
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс июн 17, 2012 23:41:33
БАТАРЕЙКУС
Мужики, вот знаю такой вопрос здесь звучал, но найти ответ на него сейчас практически невозможно.
как мне в Си компиляторе МСС18 на пике передать грамотно переменную типа long (здесь она 4 байтная) через SPI.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс июн 17, 2012 23:43:44
Аlex
Разделить её на 4 байта и передавать.

Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июн 18, 2012 18:46:28
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; }}
Не подскажете что может быть?
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июн 18, 2012 19:24:15
БАТАРЕЙКУС
Аlex писал(а):Разделить её на 4 байта и передавать.

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