Страница 42 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб сен 24, 2011 13:18:46
vitalik_1984
alexey6522 писал(а):Блииин, помогите! Спаял схему, до этого тестил на протеусе все работало, а в действительности вообще не принимаются не передаются данные, даже признаков жизни не подается, что делать, где капать, может кроме двух проводков еще нужно что-нибудь, куда-нибудь припоять, задействовано только 2 и 3 контакты Atmega8, на COM1 тоже 2 и 3.
Схему схемы в судию!!! какой корпус? На COM1 это что?Порт лпити или ком? Если ком, то еще бы о развязке сигналов подумать(на ком порту от+15 до-15 относительно общего).Так что возможно нужно мк будет поменять.
А вообще кроме входа выхода ещё и общий провод необходимо подключить...
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб сен 24, 2011 15:59:28
avreal
Ничегонеработает писал(а):Но ещё больше не понимаю, зачем это нужно.
Так цель та же самая
Ничегонеработает писал(а):свести на нет такой минус этого языка, как плохая читаемость исходника.
Только заход с другой стороны, минус как таковой пропадает
Ну и, например, становится не страшно использовать те же protothreads, машина Даффа не пугает

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб сен 24, 2011 17:08:38
Леонид Иванович
avreal писал(а):становится не страшно использовать те же protothreads, машина Даффа не пугает

Всё издеваетесь?

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб сен 24, 2011 18:55:45
Мастер Ломастер
avreal писал(а):Только заход с другой стороны, минус как таковой пропадает

Ну и, например, становится не страшно использовать те же protothreads, машина Даффа не пугает

когда знаешь слишком много, начинаешь использовать свои знания с целью доказать, что они не напрасно лежат в голове. и из этого порой рождаются вещи, которые не в сказке сказать, ни пером описать... а простые смертные после взгляда на это и говорят: "Си - это кошмар нерожденного". причем все гуру во всех книжках пишут "будьте проще, если от написания двух операторов в двух строках смысл становится понятнее - так и пишите" и т.д. и т.п. однако сами пишут с точностью до наоборот. причем друг друга удивить у них все равно не выходит, а у остальных это вызывает только ужас... эффект Мерлина Мэнсона, однако

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб сен 24, 2011 19:57:46
Леонид Иванович
Мастер Ломастер писал(а):когда знаешь слишком много, начинаешь использовать свои знания с целью доказать, что они не напрасно лежат в голове
Вот-вот. Я даже определение таким знаниям придумал: "Знания, наличие которых в голове может быть установлено только путём специального спрашивания, называются бесполезными". Меня не перестаёт удивлять, что все люди стараются казаться на фоне других крутыми. Причем это делается даже в тех ситуациях, когда конкуренции нет. Я даже пост удивлённый когда-то написал об этом:
http://leoniv.livejournal.com/110118.html Но мой друг, кандидат-психолог, отпостил на это дело простой ответ: мол, это глубинное свойство психологии, как плохих людей, так и хороших. Но я не прекращаю плохо одеваться, чтобы внешне соответствовать тому, что внутри.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб сен 24, 2011 23:08:56
urry
Отчасти образование подобно какой-то заразной болезни - человек образованный разом становится непригодным к большому числу работ - и ты не можешь держать свою болезнь (то есть знания) при себе.(С) Т. Пратчетт.
желание заразить - чем еще объяснить сидение на форумах ...

Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 11:50:47
Леонид Иванович
urry писал(а):Отчасти образование подобно какой-то заразной болезни
Забавно!
urry писал(а):желание заразить - чем еще объяснить сидение на форумах ...
Cидение на форумах - заболевание посильнее образования

Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 15:41:32
Necroteeth
Necroteeth писал(а):добрый день!
подскажите, пожалуйста, почему у меня какая-то хрень происходит:
Код: Выделить всё
#define F_CPU 1000000UL // óêàçûâàåì ÷àñòîòó â ãåðöàõ
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
volatile int state=0;
volatile int decimal, entier;
int main()
{
init();
while(1)
{
for (int i=0;i<=20;i++)
{
decimal=i/10;
entier=i%10;
switch(state)
{
case 0: PORTD=0b00100000; PORTA=convert(entier); break;
case 1: PORTD=0b01000000; PORTA=convert(decimal); break;
}
_delay_ms(250);
}
}
}
//***********************************************************************************
ISR(TIMER0_COMP) //îáðàáîò÷èê ïðåðûâàíèÿ òàéìåðà0
{
state=~(state);
}
//***********************************************************************************
int Timer0_prepare() //ïðîöåäóðà èíèöèàëèçàöèè òàéìåðà0
{
TIMSK|=(1<<OCIE0); //ðàçðåøèòü ïðåðûâàíèÿ ïî êîìïàðàòîðó òàéìåðà0
TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<CS00)|(1<<CS02);//CTC mode, prescaler 1/1024
TCCR0&=~(1<<CS01);
OCR0=0b00001010; //êîìïàðàòîð íàñòðîåí ñðàáàòûâàòü ðàç â 10ms
TCNT0=0b00000000;
}
//***********************************************************************************
int convert(int digit) //ïðîöåäóðà ïðåîáðàçîâàíèÿ ÷èñëà â ñèãíàë
{ //7-ñåãìåòíîãî èíäèêàòîðà
int result;
switch (digit)
{
case 0: result=0b11000000; break;
case 1: result=0b11111001; break;
case 2: result=0b10100100; break;
case 3: result=0b10110000; break;
case 4: result=0b10011001; break;
case 5: result=0b10010010; break;
case 6: result=0b10000010; break;
case 7: result=0b11111000; break;
case 8: result=0b10000000; break;
case 9: result=0b10010000; break;
case 10: result=0b01111111; break;
}
return result;
}
int init()
{
DDRA=0b11111111;
DDRD=0b01100000;
PORTD=0b00000000;
Timer0_prepare();
sei();
}
после входа в функцию convert программа переходит опять в начало функции main и в итоге ничего полезного не делает. где я допустил ошибку?
суть программы в том, чтобы на два индикатора АЛС321Б1 выводить число от 0 до 20. каунтер i должен перебирать число, а переменные decimal и entier хранить значения второго и первого разряда соответственно. текущий включенный индикатор должен определяться состоянием переменной state, которая изменяется (должна изменяться) по прерыванию таймера0.
может, кто-то все же уделит минутку внимания и скажет, почему после использования функции convert программа начинает выполняться с начала функции main, а не с места, где эта функция была вызвана? был бы крайне благодарен
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 16:10:34
demiurg301
Может функцию main "вниз спустить" под всю остальную писанино. У меня так вообще не компилися, т.к. в вышестоящей функции не увидело бы нижестоящие.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 16:27:43
Мастер Ломастер
Necroteeth писал(а):может, кто-то все же уделит минутку внимания и скажет, почему после использования функции convert программа начинает выполняться с начала функции main, а не с места, где эта функция была вызвана? был бы крайне благодарен
за отведенное вам время можно было методом удаления по одному всех операторов в программе разобраться, из-за которого у вас происходит кака
для макроса ISR необходимо указывать константы, оканчивающиеся на _vect - то, что указали вы не работает. правильно так:
ISR(TIMER0_COMPA_vect) - или как-то похоже (я же не в курсе, какой именно у вас МК и какие у него есть векторы прерываний)
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 17:30:14
urry
с разрядностью данных какие-то непонятки - инт все таки в большинстве случаев 16 битное...
Код: Выделить всё
#define F_CPU 1000000UL // o'e^a`c,u^a^a`a*i` ?a`n~o`i^o`o' a^ a~a*?o"a`o~
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned char state=0;
volatile unsigned char decimal, entier;
//-------------------------------------
void init(void);
unsigned char convert(unsigned char digit);
//-------------------------------------------
ISR(TIMER0_COMP_vect) //
{
state^=1;
}
//-------------------------------------------
int __attribute__((naked)) main (void)
{
char i;
init();
while(1)
{
for ( i=0;i<=20;i++)
{
decimal=i/10;
entier=i%10;
cli();
switch(state)
{
case 0:
PORTD=0b00100000;
PORTA=convert(entier);
break;
case 1:
PORTD=0b01000000;
PORTA=convert(decimal);
break;
}
sei();
_delay_ms(250);
}
}
}
//***********************************************************************************
//***********************************************************************************
void Timer0_prepare(void) //i"?i^o"a*a"o'?a` e`i'e`o"e`a`e"e`c,a`o"e`e` o`a`e'i`a*?a`0
{
//?a`c,?a*?e`o`u" i"?a*?u^a^a`i'e`y" i"i^ e^i^i`i"a`?a`o`i^?o' o`a`e'i`a*?a`0
TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<CS00)|(1<<CS02);//CTC mode, prescaler 1/1024
TCCR0&=~(1<<CS01);
OCR0=0b00001010; //e^i^i`i"a`?a`o`i^? i'a`n~o`?i^a*i' n~?a`a'a`o`u^a^a`o`u" ?a`c, a^ 10ms
TCNT0=0b00000000;
TIMSK|=(1<<OCIE0);
}
//***********************************************************************************
unsigned char convert(unsigned char digit) //i"?i^o"a*a"o'?a` i"?a*i^a'?a`c,i^a^a`i'e`y" ?e`n~e"a` a^ n~e`a~i'a`e"
{ //7-n~a*a~i`a*o`i'i^a~i^ e`i'a"e`e^a`o`i^?a`
volatile unsigned char result=0;
switch (digit)
{
case 0: result=0b11000000; break;
case 1: result=0b11111001; break;
case 2: result=0b10100100; break;
case 3: result=0b10110000; break;
case 4: result=0b10011001; break;
case 5: result=0b10010010; break;
case 6: result=0b10000010; break;
case 7: result=0b11111000; break;
case 8: result=0b10000000; break;
case 9: result=0b10010000; break;
case 10: result=0b01111111; break;
}
return result;
}
//-------------------------------------
void init(void)
{
DDRA=0b11111111;
DDRD=0b01100000;
PORTD=0b00000000;
Timer0_prepare();
}
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 17:47:01
Necroteeth
хм... спасибо за ответы, попробую...
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 21:18:51
avreal
Мастер Ломастер писал(а):avreal писал(а):Только заход с другой стороны, минус как таковой пропадает

когда знаешь слишком много
Вы мне льстите. Я считаю, что я знаю слишком мало (для того, чтобы писать С-компиляторы), поэтому только объясняю другим нюансы языка С и связанные с ними особенности поведения компиляторов.
Кстати, с точки зрения тусовки у меня под окном на лавочке -- боюсь, самый расчайниковый чайник с этого форума знает слишком много. Ну так что нам всем тут делать теперь?
А по поводу полезности-бесполезности...
Ну если объяснение нюансов С тутошним обитателям -- занятие бесполезное, то и применяемые для этого знания суть никому не нужная (тут) суета.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 21:25:22
Леонид Иванович
avreal писал(а):Кстати, с точки зрения тусовки у меня под окном на лавочке
Эх, жалко, далеко Ваша лавочка...
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 21:50:10
avreal
Ничегонеработает писал(а):avreal писал(а):Кстати, с точки зрения тусовки у меня под окном на лавочке
Эх, жалко, далеко Ваша лавочка...
Выслал бы почтой, если бы было возможно. Или с Сергеем передал бы, только ему фургончик побольше прикупить придётся

Как они надоели -- каждый день «от обеда до дождя» одно и то же «гы-гы». Прям Воннегутовские «Галапагосы».
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс сен 25, 2011 23:03:24
Transistor
Как сделать глобальную переменною в CCS pic чтоби она была выдна изовсех функций.
Да кстате как передать строку в функцию или масив из чисел в функцию.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 28, 2011 15:10:23
skader
В компиляторе H-Tech picc в упор неработает такая конструкция
while ( (TMR1H<100) || (!RCIF) )
пришлось обходить костылями из for и двух break-ов. Так и должно быть?
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 28, 2011 15:21:33
Мастер Ломастер
skader писал(а):В компиляторе H-Tech picc в упор неработает такая конструкция
while ( (TMR1H<100) || (!RCIF) )
пришлось обходить костылями из for и двух break-ов. Так и должно быть?
а что такое RCIF? если это НОМЕР БИТА в каком-то управляющем регистре - могут быть чудеса

Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 28, 2011 15:24:30
Аlex
skader писал(а):В компиляторе H-Tech picc в упор неработает такая конструкция
while ( (TMR1H<100) || (!RCIF) )
C чего Вы взяли что она не работает ? Скажите, что Вы ей пытаетесь сделать, и покажите код, привязанный к этой конструкции.
Re: Вопросы по С/С++ (СИ)
Добавлено: Ср сен 28, 2011 20:00:00
skader
RCIF - бит поднимаемый при приходе байта по юсарту.
Код: Выделить всё
while ( (TMR1H<100) || (!RCIF) )
{}
дальнейший код
В этом месте должна быть задержка или до прихода байта или до определенного превышением таймером определенного порога. По отдельности while ( TMR1H<100) и while (!RCIF) работали прекрасно.