Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/141: Рейтинг темы: голосов - 141, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
1

Помогите с СИ (Проблемы написания программ)

04.05.2010, 23:03. Показов 25872. Ответов 54
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста...
Как вытащить переменную с обработчика прерываний?

Например с АЦП. Вот код.

#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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2010, 23:03
Ответы с готовыми решениями:

Задачи для написания программ
Изучаю с++ в течение месяца: знаком с функциями, указателями, ссылками, классами, циклами, if,...

ПО для написания программ на Java.
Какое программное обеспечение нужно иметь у себя на компе, чтоб написать Веб-приложение на Java?...

Оцените стоимость написания программ
кто может помощь с написанием программ. Скажите свой e-mail и webmony и сколько будет стоить 3...

Правила написания Java-программ
Ребята. Подскажите где можно прочитать/узнать про: 1. Какую структуру каталогов лучше всего...

54
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 34
07.05.2010, 00:01 21
Author24 — интернет-сервис помощи студентам
И че мне даст выставление этого флага?
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
Цитата Сообщение от Витилий
Почему этот код не работает? Он должен делать своего разбиение переменной (schc) по битам и распихивать по(m,n,b) переменным значения битов. А она не работает. И еще че значит (schc >>= 1;- я пологаю здвигает биты и SREG&1(че здесь означает & и 1) )
Он работает, только надо перед объявлением переменной schc поставить volatile. Компилятор почему-то считает такое использование переменной недостойным для упоминания в ассемблерном листинге - он просто не осознает связь между изменением значения переменной и изменением регистра флагов...
Или используй пример от 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
Цитата Сообщение от Витилий
А как можно получать прерывание только то какое надо. А то после выставления флага глобального прерывания, может сработать любое прерывание. У меня и АЦП и прерывание по фронту с INT0. Как при ожидании прерывания от INT0 обезопасить от других, и тоже с АЦП.
Каждая переферия имеет свой собственный флаг разрешения прерывания. Для ADC, например, это будет бит ADIE в регистре ADCSRA. Если он не стоит, то прерывания не произойдет. Так же с любой другой переферией. Все описано в даташите к вашему процессору.
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2010, 23:33
Помогаю со студенческими работами здесь

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

Каковы современные решения написания программ?
Уже пол года как изучаю с++. За это время решил не мало задачек и перечитал литературы. Писал все...

Где взять ТЗ для написания программ
Привет всем. Вот начал изучение и столкнулся с проблемой практикования своих знаний. Что сейчас...

Нужна практика написания программ на Javascript
Посмотрел несколько длинных видео уроков про яваскрипт, читал в интернете, пару программок написал...

Нужны идеи для написания программ
Решил учить си путём написания программ от простых к сложным. Так вот, идей чего-бы сделать нету, а...

Идеи написания программ новичку на Ассемблере
Здравствуйте, уважаемые жители данного форума! Я обращаюсь к Вам с просьбой &quot;кинуть&quot; сюда идеи...

Выбор ЯП для написания программ на основе Excel
Добрый день, друзья! Прошу Вашего совета. Не исключено, что мой сегодняшний выбор может стать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru