реклама на сайте
подробности

 
 
> АЦП и прерывания ATmega48, помогите начинающему...
NikitoS-86
сообщение Sep 22 2008, 10:29
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 22-09-08
Пользователь №: 40 380



Добрый день. Я занялся изучением AVR, использую AVRStudio в связке с WinAVR.
И у меня появились затруднения определённого плана. Я имею представление о том, что есть прерывание, что есть стек, указатель команд и вообще имею хорошее знание касательно теории... Но дошло дело до практики... И попытался я написать простейший код... Итак ситуация: в качестве входа АЦП использоваться ADC7, надо будет на 3 выхода (PB0..2) выдавать адрес на мультиплексер, который будет переключать свои входы, на входв АДС7 будет как раз приходить сигнал с демультеплексора, АЦП должен оцифровать и записать эти данные в массив...
Вот примерный код:

Цитата
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

void port_B_settings (void);
void ADC_settings (void);
void port_C_settings (void);


int help_reg=0;

ISR (ADC_vect)
{
help_reg = 1;
}

void main (void)
{
int Ubat[4];
int Tbat[4];
int Icur;

port_B_settings();
ADC_settings();


for (int i=0;i<3;i++)
{
ADCSRA = 0xC8;
sei();

while (!help_reg)
{}

Ubat[i] = help_reg;
}
}

void port_B_settings (void)
{
DDRB = 0x07; //PB0..1 - outputs
}

void ADC_settings (void)
{
ADMUX = 0x07; //ADC7
ADCSRA = 0x88; //ADEN=1 | ADIE = 1
}



В нём правда ещё не выдаётся адрес никуда и т.д. Не суть... А суть в том, что у меня по-левому работает прерывание.
Я хочу, чтобы после начала прерывания шло ожидание прерывания, после чего его обработка и после чего запись..., а у меня выходит всякая ересь и в симуляторе вконце концов вообще после первого "прохода" получается бесконечный цикл....=/
Что я делаю неправильно?
Вопрос касательно языка С - можно ли обрабатывать прерывание не по этому макросу, а что называется ручками... Просто я не знаю как мне в такой обработчик прерывания отправить например указатель на мой массив, чтобы прям в обработчике осуществлять запись в массив, а не вводить для этого пресловутый help_reg=/

И ещё вопрос: я перед запуском АЦП настраиваю только его вход в ADMUX, а надо ли настраивать ещё первые байты, которые отвечают за настройку напряжения если не ошибаюсь... Вообще если можно, то посвятите немного о том, как настраивать и запускать АЦП, поскольку из даташита к сожалению не всё понял на английском, например мне не понятно немного что такое некий "непрерывный режим работы" АЦП, который настраивается через запись бита ADATA в регистре ADCSRA...

Ах да, последнее: речь идёт о ATmega48

Заранее огромное спасибо ответившим, просто уже 2 дня мучаюсь с этим АЦП=/

Сообщение отредактировал NikitoS-86 - Sep 22 2008, 10:31
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
NikitoS-86
сообщение Sep 23 2008, 19:25
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 22-09-08
Пользователь №: 40 380



Цитата(SasaVitebsk @ Sep 23 2008, 20:09) *
Высскажу несколько соображений общего характера. В принципе они не принципиальны, и если они вас заденут, то просто проигнорируйте их. Во всяком случае не пытаюсь вас задеть либо обидеть, а хочу помочь осмыслить. Итак...

1) Вот такая конструкция мне не понравилась. "*(Ubat+i) = ADCH;"

2) Или я чего-то просмотрел, или ваш main выполнится 1 раз и станет колом. Или каждый раз переинициализация, короче даже не знаю. Я так не делаю. Обычно в main идёт инициализация и главный цикл. Бесконечный.

3) по АЦП.

4) Ответ на вопрос по АЦП.


Никаких обид, более того, критика по всем статьям даже приветствуется, темболее если она происходит как сейчас - в рамках абсолютно нормального общения... Я потому и создал здесь тему, чтобы слышать, что я делаю "неправильно", т.е. получать советы, которые связаны именно с практической частью и опытом...
Теперь по пунктам:
1) Как раз вот ситуация, описанная парой строк выше) Наличие у вас практического опыта, в отличие от меня). Когда есть (пусть и не очень большой, но всё же) опыт программирования на Visual C++ под винду, о ресурсах не очень задумываешься в большинстве задач... Так что это естественно дело наживное=), на данном этапе оптимизация кода для меня - предстоящий этап, когда непонятно как делать - надо сделать "по-тупому", а потом смотреть, что "сократить"... по крайней мере в отношении меня - это так=)). Хотя замечание абсолютно справедливо!!!... как впрочем и все дальнейшие=)

2) Да, пока в таком виде, просто опять же повторюсь пока поставил себе задачу понять как запустить АЦП=)

3) Тоже как и везде целиком согласен. По правде сказать об этом на данном этапе я не думал, хотя вместе с тем стоит отметить, что по сути преобразование АЦП - это и есть по факту та задача, которая требуется в данном случае... Именно собрав все 9 результатов можно будет двигаться дальше... Всё, что ещё предполагается сделать на этой плате - это "приклеить" UART для считывания текущего положения дел по персоналке (но это будет позже... Так что возможно в этом разделе появится ещё одна тема в будущем=). Хотя это что называется как пойдёт, пока думаю, что не должна=)), ну и соответственно на остальные выводы ATmeg'и выставлять различные значения как раз в зависимости от данных по АЦП...

4) Понял...

Цитата
Никто не обратил ваше внимание, поэтому, пока вы еще не получили по лбу граблями, на которые наступили здесь, это сделяю я: переменная, которая изменяется в прерывании, а используется где-то в другом месте программы, должна быть объявлена с квалификатором volatile. Раз вы пользуетесь WinAVR, вам стоит очень внимательно проитать документ FAQ.html в папке документации avr_libc. Там этот момент описан под номером 1, а кроме него вы найдете там еще довольно много очень полезной информации.

P.S. Для того, чтобы ваш код выглядел таким же читаемым как у SasaVitebsk, используйте для его оформления иконку с символом "#", а не иконку ввода цитаты, как вы делаете сейчас.


Спасибо! Ситуация целиком повторяет описанную - замечания по наставлению "на путь истинный" с точки зрения указаний слабых мест - только приветствуются...

Спасибо!=)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- NikitoS-86   АЦП и прерывания ATmega48, помогите начинающему...   Sep 22 2008, 10:29
- - gormih   Для инииализации АЦП небходимо обязательно инициал...   Sep 22 2008, 11:41
- - NikitoS-86   1) Так я помоему как раз в функции ADC_settings ()...   Sep 22 2008, 11:45
- - SasaVitebsk   Давайте по-порядку. 1) Для начала очень даже непло...   Sep 22 2008, 12:18
- - NikitoS-86   1) К сожалению выбрать другую микруху - уже нельзя...   Sep 22 2008, 12:43
|- - SasaVitebsk   Цитата(NikitoS-86 @ Sep 22 2008, 15...   Sep 22 2008, 15:48
||- - Цыкетчик   Надо не забыть ещё сделать задержку примерно на 1м...   Sep 23 2008, 10:50
|- - Сергей Борщ   Цитата(NikitoS-86 @ Sep 22 2008, 15...   Sep 23 2008, 18:23
- - Aleksandr Baranov   Для манипуляции битами регистров в библиотеке avr-...   Sep 22 2008, 12:58
|- - NikitoS-86   Цитата(Aleksandr Baranov @ Sep 22 2008, 16...   Sep 22 2008, 13:13
|- - Aleksandr Baranov   Цитата(NikitoS-86 @ Sep 22 2008, 09...   Sep 22 2008, 13:43
- - NikitoS-86   Итак, во-первых, ОГРОМНОЕ спасибо всем откликнувши...   Sep 23 2008, 12:25
- - MrYuran   Цитатаmeasure_Ubat (&Ubat , &channel_numbe...   Sep 23 2008, 12:35
- - NikitoS-86   Да, так и есть по идее, и сначала я пользовал имен...   Sep 23 2008, 13:25
|- - MrYuran   Цитата(NikitoS-86 @ Sep 23 2008, 17...   Sep 23 2008, 13:46
- - SasaVitebsk   Высскажу несколько соображений общего характера. В...   Sep 23 2008, 16:09


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016