void adc_my(void) { //Ошибку в этом месте выдает sei(); unsigned char AdcBuf = ADCH;
if (AdcBuf > 240) //опеределяем в какой диапазон попадает его значение KeyBuf = KEY_S4; else if (AdcBuf > 180) KeyBuf = KEY_S3; else if (AdcBuf > 120) KeyBuf = KEY_S2; else if (AdcBuf > 35) KeyBuf = KEY_S1; else KeyBuf = KEY_NULL;
StartConvAdc(); //запускаем преобразование и выходим {
Не смотря на ошибку со открытой скобкой в конце (которой вроде как не должно быть, но без нее ошибка), выдается ошибка Error 2 expected '=', ',', ';', 'asm' or '__attribute__' before '{' token (обозначил это месте в коде).
В чем проблема?
Заменил только __interrupt на _AVR_INTERRUPT_H_, как в заголовочнике avr/interrupt.h (ибо код был писан вроде как на CodeVisionAVR ). Правильно же? Даже если этот interrupt заменить на sei(); , и код без ошибок компилится, то схема не работает. При подключении питания мигнут быстро 2 светодиода из всех и дальше тишина.. (не смотря на изменения напряжений на входе АЦП).
объясните, зачем в основном цикле декрементируется переменная tmp?
функцию вот так перепишите:
Код:
void adc_my(void) {//Ошибку в этом месте выдает sei(); unsigned char AdcBuf = ADCH;
if (AdcBuf > 240)//опеределяем в какой диапазон попадает его значение KeyBuf = KEY_S4; else if (AdcBuf > 180) KeyBuf = KEY_S3; else if (AdcBuf > 120) KeyBuf = KEY_S2; else if (AdcBuf > 35) KeyBuf = KEY_S1; else KeyBuf = KEY_NULL;
StartConvAdc();//запускаем преобразование и выходим }
по поводу __interrupt вряд ли кто-то ответит точно, до того, как вы признаетесь каким компилятором пользуетесь.
void adc_my(void) { //Ошибку в этом месте выдает sei(); unsigned char AdcBuf = ADCH;
if (AdcBuf > 240) //опеределяем в какой диапазон попадает его значение KeyBuf = KEY_S4; else if (AdcBuf > 180) KeyBuf = KEY_S3; else if (AdcBuf > 120) KeyBuf = KEY_S2; else if (AdcBuf > 35) KeyBuf = KEY_S1; else KeyBuf = KEY_NULL;
StartConvAdc(); //запускаем преобразование и выходим }
int main(void) { DDRD = 0xFF; // Configure PortD as output DDRA = 0x00; // Configure PortA as input // PA0 is ADC0 input ADCSRA = 0x8F; // Enable the ADC and its interrupt feature // and set the ACD clock pre-scalar to clk/128 ADMUX = 0xE0; // Select internal 2.56V as Vref, left justify // data registers and select ADC0 as input channel sei(); // Enable Global Interrupts ADCSRA |= 1<<ADSC; // Start Conversion while(1); // Wait forever }
В модуле interrupts.h есть функции: cli(); - глобально запрещает все прерывания. sei(); - глобально разрешает все прерывания. Тебе нужна вторая. Вообще я рекомендовал бы тебе юзать эти функции в обработчике прерывания. То есть к примеру так: SIGNAL(__vect_7) { cli(); ...... //Что-то делаем sei(); }
sei(); я использовал.. А вот с этим сигналом.. Не понимаю как его использовать..
в общем алгоритм программы такой: 1) инициализируем порты ввода/вывода 2) инициализируем АЦП, включаем прерывание окончания преобразования и запускаем преобразование 3) разрешаем глобальные прерывания 4) В безконечном цикле проверяем переменную KeyBuf ---> 4)
прерывание окончания преобразования АЦП: 1) чтение значения преобразования 2) сравнение его с границами значений 3) установка переменной KeyBuf 4) запуск очередного преобразования 5) выход
Вы разберитесь какой кусок кода за что из вышеприведенного списка отвечает и вставляйте последовательно в код. Вот и все)
Спасибо за помощь! Но сам код я знаю идеально, что и как делает. Ошибку в коде получилось найти.. Я решил сделать код попроще..
Код:
#include <avr/io.h> #include <avr/interrupt.h>
int main(void) { DDRD = 0xFF;// Конфигурируем порт как выход PORTD = 0xff; // Выключаем изначально светодиоды
ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); //питание AVcc с внешним кондером на AREF, дефолтная запись в реестр, данные с канала ADC0 ADCSRA = (1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // вкл. ацп, режим одиночного преобр., разрешение прер., частота преобр. = FCPU/128
1) Если мне не достаточно первых 8 бит преобразования ( ADCH) и я хочу использовать и (ADCL) для точности, то как быть? Писать как-то типа AdcBuf = ADCH+ADCL; ? Типа сумировать для более точной цифры.. 2) Если у меня на одной микрухе будет и ШИМ, и АЦП и обычный код обрабатывается, то как сделать чтобы оно не тормозило? Ну то честь я читал что код запускается и обрабатывается последовательно (по порядку).. То есть должно быть если в коде ШИМ пауза стоит, то она будет останавливать (пока не пройдет пауза) весь ниже написанный код.. Или я не прав? Если и прав, то как сделать чтобы одно другого не тормозило? Писать всё не в main а разбить как-то на ф-ции.. Пфф.. Я не понимаю..
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения