Добрый день. Дабы не плодить новых тем, спрошу здесь... Я как и автора занялся изучением AVR, использую так же как и автора AVRStudi в связке с 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 дня мучаюсь с этим АЦП=/