Страница 1 из 2 12 Последняя
Показано с 1 по 20 из 39

Тема: Компаратор в микроконтроллерах Atmel

  1. #1
    AudioKiller
    Автор темы
    Аватар для AudioKiller
    Регистрация
    10.02.2005
    Адрес
    Ростов-на-Дону
    Возраст
    59
    Сообщений
    2,468

    Вопрос Компаратор в микроконтроллерах Atmel

    Происходит какая-то фигня, не пойму в чём глобальная проблема.
    Хочу использовать компаратор. В микроконтроллере ATMega 88. Включаю его програмно. У него как и положено два входа, подключенных к ножкам контроллера AIN0, AIN1. И выход, который можно опрашивать програмно - системная 1 битная ACO. И вот всех книгах, интернетах и даташитах пишут, что АСО выставляется в ноль или единицу по результатам сравнения напряжений на входах (через пару тактов). Так и делаю - электрически подаю разные напряжения на входы. Контролирую входы осциллографом на всякий пожарный - всё есть. Один вход 2,5 вольта, второй либо 2, либо 3 вольта. Или один вход - лог. 1, другой - лог. 0. И меню их местами.
    Но на выходе компаратора (значение АСО) всё время нулевое. Что только не делал. Выводил в порт напрямую, присваивал переменной и проч. Результат тот же. Проверял с разными вариантами программы и способах подачи входных напряжений 5 микросхем АТ88 (даже в разных корпусах) и одну АТ48. Естественно, проверяю работу портов - если без компаратора, всё отлично работает. Сначала на макетке, потом в фирменной отладочной плате.
    Одинаково!

    Такое чувство, что там что-то залочено. Но все описания говорят, что никаких хитрых локов - включил, и работает. А вот нифига!

    Даже не знаю, где копать...
    - Что значит маловато шлюпок?! Не разводите панику, это непотопляемый корабль!
    Томас Эндрюс, конструктор "Титаника"

  2. #2
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,168

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Как компаратор инициализовал? Лучше сразу код покажи.
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  3. #3
    Завсегдатай Аватар для hippo64
    Регистрация
    20.05.2010
    Адрес
    Москва
    Возраст
    60
    Сообщений
    4,120

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    код хотелось бы увидеть. и установки лапок на и-о

  4. #4
    AudioKiller
    Автор темы
    Аватар для AudioKiller
    Регистрация
    10.02.2005
    Адрес
    Ростов-на-Дону
    Возраст
    59
    Сообщений
    2,468

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Код настроек генерится мастером среды разработки CodeVision AVR V3.40

    // Input/Output Ports initialization
    // Port B initialization
    // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
    DDRB=(1<<DDB7) | (1<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
    // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
    PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

    // Port C initialization
    // Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
    DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
    // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
    PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

    // Port D initialization
    // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
    DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (1<<DDD1) | (1<<DDD0);
    // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=0 Bit0=0
    // подтяжка отключена
    PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

    Неинвертирующий вход AIN0 на PD6, инвертирующий - AIN1 на PD7.

    // Analog Comparator initialization
    // Analog Comparator: On
    // The Analog Comparator*s positive input is
    // connected to the AIN0 pin
    // The Analog Comparator*s negative input is
    // connected to the AIN1 pin
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=(0<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
    ADCSRB=(0<<ACME);
    // ACSR – Analog comparator control and status register Bit 7 – ACD: Analog comparator enable/disable. This bit can be set at any time to turn off the Analog Comparator
    // Как он записывает 0 в бит АСО - непонятно, этот бит только на чтение. Но по умолчанию там ноль.

    // Digital input buffer on AIN0: On
    // Digital input buffer on AIN1: On
    //Цифровые входы на этих ногах и отключал, и нет.
    DIDR1=(0<<AIN0D) | (0<<AIN1D);



    Прога (один вариант из 100500):

    PORTB.6 = 0;
    PORTB.7 = ACO;
    delay_ms(300);
    PORTB.6 = 1;
    delay_ms(300);

    Портом В.6 просто мигаю светодиодом, чтобы видеть, что работает.
    - Что значит маловато шлюпок?! Не разводите панику, это непотопляемый корабль!
    Томас Эндрюс, конструктор "Титаника"

  5. #5
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,168

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от AudioKiller Посмотреть сообщение
    ACSR=(0<<ACD)
    И чего ты хотел?!
    Выключенный компаратор не работает, странно

    ---------- Сообщение добавлено 15.04.2024 в 00:03 ---------- Предыдущее сообщение было 14.04.2024 в 23:59 ----------

    Цитата Сообщение от AudioKiller Посмотреть сообщение
    Как он записывает 0 в бит АСО - непонятно, этот бит только на чтение.
    Даташит говорит R/W
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  6. #6
    AudioKiller
    Автор темы
    Аватар для AudioKiller
    Регистрация
    10.02.2005
    Адрес
    Ростов-на-Дону
    Возраст
    59
    Сообщений
    2,468

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    This bit can be set at any time to turn off the Analog Comparator - это копипаст из даташита

    // Analog Comparator: On - это пишет мастер

    А вот выключенный компаратор:
    // Analog Comparator: Off
    ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
    - Что значит маловато шлюпок?! Не разводите панику, это непотопляемый корабль!
    Томас Эндрюс, конструктор "Титаника"

  7. #7
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,168

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Это у меня заскок. Привык 1 включать.

    ---------- Сообщение добавлено 01:55 ---------- Предыдущее сообщение было 00:25 ----------

    Цитата Сообщение от AudioKiller Посмотреть сообщение
    PORTB.7 = ACO;
    ACO это скорей всего просто определение позиции бита (число). Это не бит в регистре.

    Наглядно, переносимо и тупо

    Код:
    if(ACSR & (1<<ACO))
    {
      PORTB.7 =1;
    }else
    {
      PORTB.7 =0;
    }
    Если компилятор поддержит такой синтаксис, то можно проще
    PORTB.7 = ACSR.ACO;

    codevision у меня отсутствует, проверить не смогу.
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  8. #8
    AudioKiller
    Автор темы
    Аватар для AudioKiller
    Регистрация
    10.02.2005
    Адрес
    Ростов-на-Дону
    Возраст
    59
    Сообщений
    2,468

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от Openreel Посмотреть сообщение
    Даташит говорит R/W
    Нажмите на изображение для увеличения. 

Название:	Компаратор.png 
Просмотров:	28 
Размер:	44.9 Кб 
ID:	453125


    Цитата Сообщение от Openreel Посмотреть сообщение
    ACO это скорей всего просто определение позиции бита (число). Это не бит в регистре.
    Там в библиотеках все основные "имена" прописаны. И компилятор принимает. И в таймере работает. Но на всякий случай попробую...
    - Что значит маловато шлюпок?! Не разводите панику, это непотопляемый корабль!
    Томас Эндрюс, конструктор "Титаника"

  9. #9
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    61
    Сообщений
    36,274

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от Openreel Посмотреть сообщение
    ACO это скорей всего просто определение позиции бита (число). Это не бит в регистре.
    Судя по "ACSR=(1<<ACD) | (" - однозначно позиция бита.

    ---------- Сообщение добавлено 10:07 ---------- Предыдущее сообщение было 10:02 ----------

    Цитата Сообщение от Openreel Посмотреть сообщение
    Даташит говорит R/W
    Где?

    АСО это выход компаратора, как он может быть не рид онли?

    ---------- Сообщение добавлено 10:12 ---------- Предыдущее сообщение было 10:07 ----------

    Цитата Сообщение от AudioKiller Посмотреть сообщение
    PORTB.6 = 0;
    Код:
    PORTB.7 = ACO;  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    delay_ms(300);
    PORTB.6 = 1;
    delay_ms(300);
    Портом В.6 просто мигаю светодиодом, чтобы видеть, что работает.
    Тут надо было так:
    Код:
     PORTB.7 =  (ASCR & (1<<ACO));
    P.S. Тексты программ удобнее оформлять тегом "code" в скобках []------[/]
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Ну что, можете меняться обратно."(с)типа анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  10. #10
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,168

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от Alex Посмотреть сообщение
    Где?
    Проглючило меня, с другим битом регистра попутал.


    Цитата Сообщение от Alex Посмотреть сообщение
    Тут надо было так:
    Код:

    PORTB.7 = (ASCR & (1<<ACO));

    Это законно?

    Тип PORTB.7 битовый же, а в него засовываем не булевское значение(0 или 1), а большое число(и младший бит в нём всегда 0).
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  11. #11
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    61
    Сообщений
    36,274

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от Openreel Посмотреть сообщение
    Это законно?
    Ну я уже не помню как оно там в АВР-ах, в PIC HiTech-C с битовыми переменными такое проходило, там или 0, или неважно что, лишь бы не 0.
    Но если есть сомнения, можно записать другим способом, например так:
    Код:
      PORTB.7 = (ASCR & (1<<ACO)) ? 1:0;
    или

    Код:
     (ASCR & (1<<ACO)) ? PORTB |=(1<<7) : PORTB &=~(1<<7);
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Ну что, можете меняться обратно."(с)типа анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  12. #12
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,168

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от Alex Посмотреть сообщение
    можно записать другим способом, например так
    Можно конечно, конструкция ? : прекрасна, но не для любителей.

    Цитата Сообщение от Alex Посмотреть сообщение
    битовыми переменными такое проходило, там или 0, или неважно что, лишь бы не 0.
    Надо в стандартах посмотреть, насколько такое поведение законно, или это инициатива отдельных компиляторов.
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  13. #13
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    61
    Сообщений
    36,274

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от Openreel Посмотреть сообщение
    Можно конечно, конструкция ? : прекрасна, но не для любителей.
    Ну это почти тот-же if..else, только записано по другому.

    Вообще, с нынешними (ну последних лет 15-20) компиляторами, можно на Си написать разными способами, скомпилируется все равно в то-же самое в итоге.
    Хороший оптимизирующий компилятор, в 99% случаев умнее.

    Цитата Сообщение от Openreel Посмотреть сообщение
    Надо в стандартах посмотреть, насколько такое поведение законно, или это инициатива отдельных компиляторов.
    Конечно отдельных, в эмбеддед вообще почти во всех компиляторах полно разной "собственной инициативы"

    В стандарте нет переменных типа "бит" (и это не bool в Си), и много другого, как в том-же ХайТече.

    Например:
    static persistent volatile bit Scale, ScaleTmp, ScaleOld; // used in interrupt

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

    Запись PORTB.7 в нем также возможена, как в выше для АВРов, но она тоже не стандарная.

    Или
    uint8_t Var1 =0b01001100;

    И такого нет в стандартах. А кстати жаль, такая бинарная запись часто весьма удобна.
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Ну что, можете меняться обратно."(с)типа анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  14. #14
    Завсегдатай Аватар для Оллема
    Регистрация
    11.09.2005
    Адрес
    Ижевск
    Возраст
    56
    Сообщений
    3,703

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Может этот пример поможет разобраться:
    Comparator-CV.rar

  15. #15
    AudioKiller
    Автор темы
    Аватар для AudioKiller
    Регистрация
    10.02.2005
    Адрес
    Ростов-на-Дону
    Возраст
    59
    Сообщений
    2,468

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Спасибо, ребята!
    Я его победил!
    Компилятор не видит значение ACO, несмотря на то, что его понимает и не ругается.
    Вот такой "дубовый" код работает:

    i = ACSR & 0b00100000; // маскируем управляющий регистр компаратора, оставляем только бит АСО
    if (i)
    {
    PORTB.7 = 1;
    }
    else
    {
    PORTB.7 = 0;
    }
    delay_ms(300);

    Т.е. сам регистр нормально читается, и остаётся выщемить из него нужный бит.

    ---------- Сообщение добавлено 20:41 ---------- Предыдущее сообщение было 20:38 ----------

    И теперь ещё вопрос: как эффективней:

    i = ASCR $ 0b00100000;

    или что-то типа

    i = (ASCR & (1<<ACO)) ? 1:0;
    - Что значит маловато шлюпок?! Не разводите панику, это непотопляемый корабль!
    Томас Эндрюс, конструктор "Титаника"

  16. #16
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    61
    Сообщений
    36,274

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от AudioKiller Посмотреть сообщение
    как эффективней:
    Выше писал:
    PORTB.7 = (ASCR & (1<<ACO)) ? 1:0;

    Очень странно, что ASCR оно видит, а ACO нет.
    Но можно и:
    PORTB.7 = (ASCR & (1<<5)) ? 1:0;
    или
    PORTB.7 = (ASCR & 0b00100000) ? 1:0;
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Ну что, можете меняться обратно."(с)типа анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  17. #17
    AudioKiller
    Автор темы
    Аватар для AudioKiller
    Регистрация
    10.02.2005
    Адрес
    Ростов-на-Дону
    Возраст
    59
    Сообщений
    2,468

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от Alex Посмотреть сообщение
    Очень странно, что ASCR оно видит, а ACO нет.
    Так вот тож. поэтому и не подумал сразу. Многие отдельные "именованные" биты регистров он видит, а этот нет. Дурак он!

    ---------- Сообщение добавлено 21:04 ---------- Предыдущее сообщение было 20:49 ----------

    Только сейчас дошло, как я протупил!!! АСО не может содержать инфу, он содержит номер бита!!!

    До чего доводит ковид и трезвый образ жизни!
    - Что значит маловато шлюпок?! Не разводите панику, это непотопляемый корабль!
    Томас Эндрюс, конструктор "Титаника"

  18. #18
    Завсегдатай Аватар для Openreel
    Регистрация
    02.09.2006
    Адрес
    Санкт-Петербург
    Возраст
    49
    Сообщений
    3,168

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от AudioKiller Посмотреть сообщение
    Многие отдельные "именованные" биты регистров он видит, а этот нет. Дурак он!

    У тебя в коде из поста 4 есть конструкция

    Цитата Сообщение от AudioKiller Посмотреть сообщение
    ACSR=(0<<ACD) | (0<<ACBG) | (0<<ACO)
    и вторая конструкция
    Цитата Сообщение от AudioKiller Посмотреть сообщение
    PORTB.7 = ACO;
    Вровень или выступать?
    Вровень выступать, насяльника! (с)


    Посмотрел в хедерах от avr-gcc, как объявлен ACO
    #define ACO 5

    Компилятор тупой, ага
    WBR, Michael.
    Цель расчетов - понимание, а не числа (с) Хемминг.

  19. #19
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    61
    Сообщений
    36,274

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Цитата Сообщение от AudioKiller Посмотреть сообщение
    Только сейчас дошло, как я протупил!!! АСО не может содержать инфу, он содержит номер бита!!!
    Об этом выше говорили.
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Ну что, можете меняться обратно."(с)типа анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  20. #20
    AudioKiller
    Автор темы
    Аватар для AudioKiller
    Регистрация
    10.02.2005
    Адрес
    Ростов-на-Дону
    Возраст
    59
    Сообщений
    2,468

    По умолчанию Re: Компаратор в микроконтроллерах Atmel

    Мне стыдно.
    - Что значит маловато шлюпок?! Не разводите панику, это непотопляемый корабль!
    Томас Эндрюс, конструктор "Титаника"

Страница 1 из 2 12 Последняя

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •