0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
1 | |
Помогите с СИ (Проблемы написания программ)04.05.2010, 23:03. Показов 25872. Ответов 54
Метки нет (Все метки)
Помогите пожалуйста...
Как вытащить переменную с обработчика прерываний? Например с АЦП. Вот код. #include <avr/io.h> #include <avr/interrupt.h> // доступ к функции sei #include <avr/syknal.h> // доступ к макросу interrupt #define sei() unsykned int ADCdata; // буф переменная хранения INTERRUPT(SIG_ADC) //Обработчик прерывания от АЦП { ADCdata = ADCW; //результата преобразования ADCSR=ADCSR | 0x40; //Устанавливаем разряд ADSC в регистре //ADCSR, чтобы начать новое преобразование } int main (void) { DDRD = 7; // Три младших разряда порта В - выходы ADMUX = 1; // Назначаем в качестве аналогового входа PC3 ADCSR = 0xCE /* 0b11001110 - активизируем АЦП с коэффициентом деления 64, разрешаем прерывание от АЦП и начинаем преобразование */ sei(); //Общее разрешение прерываний while(1); //Бесконечный цикл в ожидании прерывания от АЦП return 0; } Вот. Мне значение переменной ADCdata надо вытащить в int main (void). Помогите срочно нужно.
0
|
04.05.2010, 23:03 | |
Ответы с готовыми решениями:
54
Задачи для написания программ ПО для написания программ на Java. Оцените стоимость написания программ Правила написания Java-программ |
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
07.05.2010, 00:01 | 21 |
0
|
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
|
|
07.05.2010, 00:04 | 22 |
ну например при сдвиге вправо он даст значение младшего бита.
как-то так: Код
value>>=1; if(SREG&1) { //идиничко } else { //нолег }
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
07.05.2010, 00:19 | 23 |
Спасибо. Буду пробовать. А первая строчка че делает?
0
|
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
|
|
07.05.2010, 00:22 | 24 |
первая строчка сдвигает значение переменной на 1 разряд вправо (можно сказать делит на 2, остаток идет во флаг переноса, который собсно и проверяется дальше)
0
|
0 / 0 / 0
Регистрация: 24.04.2010
Сообщений: 108
|
|
07.05.2010, 00:24 | 25 |
Сообщение от Витилий
вообще числа в конроллере все двоичные... нужно сделать вывод на семисегментник? или выплюнут последовательно? или параллельно? а может паралельно, но с преобразованием?
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
07.05.2010, 00:29 | 26 |
Последовательно вывести на передачу.
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
07.05.2010, 00:30 | 27 |
Ладно хорошо будем пробовать.
0
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
07.05.2010, 01:14 | 28 |
Вывод битов на один пин. Типа серриалайзер:
Код
char i = 8; while(i--) { if( Value & 0x01) { // output one sbi(PORT,PIN); } else { //output zerro cbi(PORT,PIN); } Value >>= 1; }
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
07.05.2010, 22:47 | 29 |
А почему этот код не работает. (Для справки(Кодирую манчестерским кодом, там инф. несет не уровень, а фронт, спадающий или поднем.)) Здесь все идет как будто все биты 1.
Несмотря на условие которые заданы. DDRC |= 1 << PC2 ; m = 1; n = 1; b = 0; v = 1; c = 1; x = 0; z = 1; l = 0; k = 1; PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); if (m=1) { PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); } if (m=0) { PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); } if (n=1) { PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); } if (n=0) { PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); } if (b=1) { PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); } if (b=0) { PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); } if (v=1) { PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); } if (v=0) { PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); } if (c=1) { PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); } if (c=0) { PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); } if (x=1) { PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); } if (x=0) { PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); } if (z=1) { PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); } if (z=0) { PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); } if (l=1) { PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); } if (l=0) { PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); } if (k=1) { PORTC = 1 << PC2 ; _delay_ms(3); PORTC = 0 << PC2 ; _delay_ms(3); } if (k=0) { PORTC = 0 << PC2 ; _delay_ms(3); PORTC = 1 << PC2 ; _delay_ms(3); }
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
07.05.2010, 22:52 | 30 |
Т.е. условия выполняются на все переменные одинаковое как если бы они все 1.
0
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
07.05.2010, 23:07 | 31 |
Крутая программка :)
Ну во-первых вы НЕ проверяете условия, а присваиваете значения переменным, так как у вас там везде один символ = стоит вместо двух ==. В операторе сравнения должно стоять ДВА символа ==. А у вас стоит один, что для С языка ошибкой не является, так как выполняются фактически две операции - первая - присваивание, и второе - сравнение переменной с нулем. Т.е. если то, что стоит в скобках оператора if() не равно нулю, то оно выполняется.
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
07.05.2010, 23:30 | 32 |
Во как. А я и гляжу, что почти на всех сравнениях я встал на месте. И даже не думал что двойное равно надо. То есть если в условии везде поставлю ==, то все как надо будет?
0
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
07.05.2010, 23:46 | 33 |
Сообщение от Витилий
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
07.05.2010, 23:52 | 34 |
Почему этот код не работает? Он должен делать своего разбиение переменной (schc) по битам и распихивать по(m,n,b) переменным значения битов. А она не работает. И еще че значит (schc >>= 1;- я пологаю здвигает биты и SREG&1(че здесь означает & и 1) )
unsykned int schc; unsykned int m; unsykned int n; unsykned int b; void PreobrVDV(void) { schc >>= 1; if(SREG&1) { m=1; //идиничко } else { m=0; //нолег } schc >>= 1; if(SREG&1) { n=1; //идиничко } else { n=0; //нолег } schc >>= 1; if(SREG&1) { b=1; //идиничко } else { b=0; //нолег } } int main( void ) { schc = 7; PreobrVDV(); }
0
|
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
|
|
08.05.2010, 00:53 | 35 |
Сообщение от Витилий
Или используй пример от MostirOtyxiy, он в какой-то мере лишен этого недостатка.
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
08.05.2010, 22:52 | 36 |
Спасибо. Все получилось как положено.
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
08.05.2010, 22:56 | 37 |
А как можно получать прерывание только то какое надо. А то после выставления флага глобального прерывания, может сработать любое прерывание. У меня и АЦП и прерывание по фронту с INT0. Как при ожидании прерывания от INT0 обезопасить от других, и тоже с АЦП.
0
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
08.05.2010, 23:00 | 38 |
Сообщение от Витилий
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
08.05.2010, 23:07 | 39 |
Понял. Спасибо за помощь.
0
|
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
|
|
08.05.2010, 23:33 | 40 |
Объясните пожалуйста еще. Че значат в объявлений функций, то что стоит перед названием функции и в скобках? Как этим пользоваться? Хоть примерно пролейте свет?
Например: void Funktion(char) void Funktion(void) void Funktion(int n, char c) Я чето пробывал поэкспериментировать, но получалось коряво. Так везде и пользуюсь viod.
0
|
08.05.2010, 23:33 | |
08.05.2010, 23:33 | |
Помогаю со студенческими работами здесь
40
Написания небольших программ для вычислений Каковы современные решения написания программ? Где взять ТЗ для написания программ Нужна практика написания программ на Javascript Нужны идеи для написания программ Идеи написания программ новичку на Ассемблере Выбор ЯП для написания программ на основе Excel Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |