Аналоговый компаратор

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Аналоговый компаратор

Сообщение -==MAXCELERON==- »

Здравствуйте, снова я со своими вопросами :))) !!

Вобщем проблема в том, что не работает (или я балбес :)) ) аналоговый компаратор на MEGA8:

програмлю следующим образом:

Код: Выделить всё

#include (avr/interrupt.h)  // скобы конечно угловые
#include (util/delay.h)
#define F_CPU 1000000UL // 8 MHz


  ISR(ANA_COMP_vect){  //Обработчик прерывания
  PORTC = 0xff;
  }

int main(void){     
 
 DDRC = 0xff;
 
 ACSR=0x08; // аналоговый компаратор, прерывание по изменению

 sei();    // Разрешение прерываний глобально

}  
В итоге как ни изменяю уровни на AIN0 AIN1, все бестолку, никакого прерывания не происходит (на порт С не выводится 1) :cry:
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18592
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

по-моему вы или кто-то другой буквально день назад уже наступали на эти же грабли: нельзя делать main без вечного цикла: при "выходе" из main запрещаются прерывания и происходит зацикливание, т.е. прерывания разрешены у вас ровно 1 машинный такт.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

Да, я тож подумал об этом, сделал, все равно не рабит :cry:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18592
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ну потрудитесь расписать побитово, что вы там устанавливаете в ACSR: то, что вы пишите - не воспринимается
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

[/code]
#include <avr>
#include <util>
#define F_CPU 1000000UL // 8 MHz


ISR(ANA_COMP_vect){ //Обработчик прерывания
PORTC ^= (PINC | 0x01);




}

int main(void){


DDRC = 0xff;

ACSR=0x08; // аналоговый компаратор, прерывание по изменению

sei(); // Разрешение прерываний глобально
while(1){}

}

[/code]
Прошу прощения просто после while(1){} make clean не сделал! Все работает. Спасибо !!
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18592
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

я тут уже советовал другим, посоветую и вам: используйте макросы, типы и т.п., являющиеся "стандартными" для WinAVR - это позволит вам иметь более читаемый другими любителями WinAVR код, да и сами будете лучше понимать, что делаете.

Код: Выделить всё

ACSR = _BV(ACIE); // это ведь нагляднее, чем 0x08 - не так ли?
а это что бы означало:

Код: Выделить всё

ISR(ANA_COMP_vect){ //Обработчик прерывания 
PORTC ^= (PINC | 0x01); } 
если надо переключать уровень на порту, то надо делать проще:

Код: Выделить всё

PORТC ^= _BV(PC0); // переключаем 0 бит порта С
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
-==MAXCELERON==-
Встал на лапы
Сообщения: 96
Зарегистрирован: Сб авг 15, 2009 07:31:56
Откуда: г. Кемерово

Сообщение -==MAXCELERON==- »

Хорошо, буду иметь ввиду.
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

-==MAXCELERON==- писал(а):Хорошо, буду иметь ввиду.
Не имей ввиду, все ты правильно делаешь, записывая в регистр конкретное число. Просто в коментах укажи какие биты в единицу, какие в ноль и все.

Почему? Потому что,

#define _BV(bit) (1 << (bit))

Это означает сдвиг единицы на определенное число, тем самым требуя на каждый сдвиг один такт. Если вы хотите установить седьмой бит в регистре, то знайте, уйдет семь тактов. А если просто 0x80 то всего один.
Эт я так, рекомендую.
А еще лучше, написать свои макросы типа
SET_ADC_ACIE = ACSR |= 0x80;


------------------------
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18592
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

__Alexander, я вам очень настоятельно рекомендую прежде чем давать рекомендации, хорошенько изучить язык Си... иначе вы можете попасть в глупое положение, когда ваши рекомендации не имеют ничего общего с реальностью...

в данном случае, вы забываете, что Си - это не бейсик, и все вычисления, которые могут быть сделаны на этапе компиляции, будут сделаны именно на этапе компиляции.
то есть все сдвиги сделает компилятор, а в код запишется только результат этих сдвигов. ведь не думаете же вы, что с = 2 * 8 + 16 / 4; приведет к генерации команд умножения, деления и сложения?! на самом деле в с сразу будет записано число 20.

кроме того, ваш совет на счет макросов - от него волосы поднимаются... в регистре 8 битов, устанавливать которые можно в разных комбинациях, т.е. всего 256 комбинаций... вы для каждой предлагаете написать макрос?! мой совет касался в соновном использования символьных имен битов для управляющих регистров, что имеет смысл - наглядность кода резко повышается... а ваш метод что дает?! только хуже сделает...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Мда, согласен, совет данного макроса был не совсем уместен.
Но вот когда в макросе происходят арифметические действия который будет получен после вызова функции... хотя, короче, чего это я. Это дело компилятора, я хотел сказать что макрос, это просто подставление его в код программы. А че с ним сделает компилятор - это другой вопрос.




----------------------------
EmDmAl
Открыл глаза
Сообщения: 51
Зарегистрирован: Чт мар 22, 2012 09:14:18
Откуда: Липецк

Re: Аналоговый компаратор

Сообщение EmDmAl »

Добрый день уважаемые. У меня тот же вопрос написал простой код для работы компоратора. В котором при изменении значения выхода ACO зажигается или тухнит светодиод PD7, а при изменении значения с 0 на 1 вызывается прерывание комп. Только вот почему то прерывание не вызывается, а PD7 горит не тухнит, при изменении значения входов с 0 до 2,5В.
Пробую пример в Proteuse 7 SP3
easy_analog_compor_1.rar
(33.96 КБ) 230 скачиваний
и на плате Pinboard 1.1. Подскажите в чем дело.

Код: Выделить всё

#include<avr/io.h>
#include <avr/interrupt.h>

ISR (ANA_COMP_vect) {
	PORTD ^= (1<<PD4);
}
//ОСНОВНАЯ ФУНКЦИЯ
int main(void) {
//Инициализация переферии
DDRD=(1<<PD4)|(1<<PD7);//На выход сигнала
DDRB=(0<<PB2)|(0<<PB3);//На вход
PORTB=(0<<PB2)|(0<<PB3);
//ACIE-разрешаем прерывание от компаратора.ACIS1;ACIS0-Ловим 0-1 
ACSR=(1<<ACIE)|(0<<ACIS1)|(0<<ACIS0);
asm("sei");//Разрешаем объявленные прерывания
while (1) {
	PORTD = (ACO<<PD7);//Заносим значение в PD7 значение ACO
}
}
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: Аналоговый компаратор

Сообщение siamds »

У Вас все нормально работает. Просто Вы неверно подключили приборы. Резистором RV2 устанавливается порог срабатывания компаратора, а срабатывание компаратора определяется движком резистора RV1 (или наоборот, это как Вам больше нравиться). Исправленная схема во вложении.
Вложения
easy_analog_compor_1.rar
Компаратор
(34.35 КБ) 265 скачиваний
На каждого Моцарта есть свой Сальери.
EmDmAl
Открыл глаза
Сообщения: 51
Зарегистрирован: Чт мар 22, 2012 09:14:18
Откуда: Липецк

Re: Аналоговый компаратор

Сообщение EmDmAl »

siamds писал(а):У Вас все нормально работает. Просто Вы неверно подключили приборы. Резистором RV2 устанавливается порог срабатывания компаратора, а срабатывание компаратора определяется движком резистора RV1 (или наоборот, это как Вам больше нравиться). Исправленная схема во вложении.
Спасибо за ответ, действительно не правильно собрал схему.
Ваша схема у меня работает, только почему то с 55 секунды, тоесть до 55 с меняю значения на сопротивлениях и все молчит. Вы меняли что нибудь в коде?(Просто мой код прошивки тот который я привел не работает, а ваш работает)..... или может просто очередной баг Proteusa.
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: Аналоговый компаратор

Сообщение siamds »

EmDmAl писал(а): с 55 секунды, тоесть до 55 с меняю значения на сопротивлениях и все молчит.
Вероятно это происходит потому что у Вас между портом и светодиодом не стоит токоограничительное сопротивление. Светодиоды нельзя напрямую подключать на выход порта. Поставьте резистор порядка 300ом и проблема должна исчезнуть.
На каждого Моцарта есть свой Сальери.
EmDmAl
Открыл глаза
Сообщения: 51
Зарегистрирован: Чт мар 22, 2012 09:14:18
Откуда: Липецк

Re: Аналоговый компаратор

Сообщение EmDmAl »

По ошибки я выкладывал hex файл, в главном теле которого

Код: Выделить всё

while (1) {
	if (ACSR&(1<<ACO)) {//Если в ACO = 1
		PORTD = (1<<PD7);
	} else { PORTD = (0<<PD7);}
}
поэтому вариант PORTD = (ACO<<PD7); не работает.
Значит надо использовать связку выше.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»