1 / 1 / 0
Регистрация: 26.03.2011
Сообщений: 45
1

Первый опыт с аналоговым компаратором

05.11.2011, 18:54. Показов 4698. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет,
Решил изучить компаратор ATtiny2313.
Подаю 2.5V на AIN1, а вход AIN0 подключаю к переменному резистору.

Исходный код
Код
#defyme baudrate 2400U
#defyme bauddivider (F_CPU/(16*baudrate)-1)

#ymstude <avr/io.h>
#ymstude <avr/interrupt.h>
#ymstude <util/delay.h>

char x = 0;

void IO_Init()
{
DDRB  = 0; // PB0, PB1 - Input
PORTB = 0xFF & ~(_BV(PB0) | _BV(PB1)); // Dysable pull-up on PB0, PB1

// Analog somporotor interrupt on rising output range
ACSR  = _BV(ACIE) | _BV(ACIS0) | _BV(ACIS1);
}

void USORT_Init()
{
UBRRH = (unsykned char)(bauddivider>>8);
UBRRL = (unsykned char)bauddivider;
UCSRB = _BV(RXEN) | _BV(TXEN);
UCSRC = _BV(USBS) | _BV(UCSZ0) | _BV(UCSZ1);
}

void USORT_Transmit(const char data)
{
while ( !(UCSRA & _BV(UDRE)) );
UDR = data;
}

ISR(ANA_COMP_vect)
{
x = 1;
}

int main()
{
IO_Init();
USORT_Init();
sei(); // Enable interrupts

while (1)
{
_delay_ms(100);
USORT_Transmit(0+x);
}
}
Начинаю крутить переменный резистор от 0 до 5 вольт и обратно, но в терминал сыпятся только нули.
То есть, почему-то не срабатывает прерывание. Что я делаю не так? :)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2011, 18:54
Ответы с готовыми решениями:

Первый опыт
Приветствую всех! Сильно не бейте, сделал БД Автосалон, нужно для учёбы. Таблицы должны быть...

Первый опыт
День добрый форумчане. Имееться конфа УТП 1.0.19.8 типовая, обычное приложение, малость измененная...

На суд. первый опыт
Первый опыт с микроконтроллером. Хотелось сделать что то не обычное ) .. В итоге взял картину...

Первый опыт с FPGA
Хочу продолжить тему начатую когда-то dmtr. Кратко напишу, что он когда-то сделал - кое-что...

16
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 931
05.11.2011, 19:23 2
А переменник правильно подключен (крайние к + и к земле соответственно, а средний вывод на порт мк)?
ЗЫ Код проверил, в студии работает.
0
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,283
05.11.2011, 19:34 3
Частота UART правильно настроена?
0
1 / 1 / 0
Регистрация: 26.03.2011
Сообщений: 45
05.11.2011, 19:36 4
Цитата Сообщение от Sykmottir
А переменник правильно подключен (крайние к + и к земле соответственно, а средний вывод на порт мк)?
ЗЫ Код проверил, в студии работает.
Да, вольтметром проверял, напряжение на ножке меняется от 0 до 5.
А на вторую я пробовал подавать 0/2.5/5, никакой разницы, прерывание не срабатывает.
0
1 / 1 / 0
Регистрация: 26.03.2011
Сообщений: 45
05.11.2011, 19:37 5
Цитата Сообщение от dsodir
Частота UART правильно настроена?
Да, если посылать строку, то она приходит правильно. Тут дело именно в компараторе, или в его подключении.
0
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 213
05.11.2011, 21:20 6
а если глобальную "x" объявить как volatile?
0
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 494
05.11.2011, 21:22 7
Цитата Сообщение от Midyk88
а если глобальную "x" объявить как volatile?
Её обязательно нужно объявлять как volatile иначе она по-факту получится не глобальной
0
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 213
05.11.2011, 21:24 8
Цитата Сообщение от byvysi
Цитата Сообщение от Midyk88
а если глобальную "x" объявить как volatile?
Её обязательно нужно объявлять как volatile иначе она по-факту получится не глобальной
а какой получится?
0
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 494
05.11.2011, 21:29 9
получится непонятно какой, там в оптимизации фишка - когда обращаешься к не volatile переменной из основной программы - все нормально, комилятор предусмотрит, чтобы в момент когда ты ей пользуешься она была доступна, а в остальное время она может быть запакована, даже удалена (если есть присваивание значения, при первом обращении) итд. А вот вызов переменной из прерывания - штука внезапная, от переменной может быть только адрес, а по адресу дырка (или другая переменная). Поэтому если к глобальной переменной обращаются из прерывания - её всегда объявляют как volatile
0
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 213
05.11.2011, 21:32 10
а ну глобальные переменные, к которым доступ из двух потоков я знал, поэтому и посоветовал ее так объявить. Но то что она может не существовать по своему адресу какое то время догадывался, но еще пока не до конца вкурил в логику оптимизации глобальных переменных)
пару раз обжигался на таких вещах, теперь это сразу глаза режет)
0
1 / 1 / 0
Регистрация: 26.03.2011
Сообщений: 45
05.11.2011, 21:34 11
Точно! Votatile помогло :)
Не знал, что изменение переменной внутри прерывания считается компилятором за внешнее изменение.
0
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 494
05.11.2011, 21:44 12
Цитата Сообщение от Kum
Не знал, что изменение переменной внутри прерывания считается компилятором за внешнее изменение.
А за что оно должно считаться?
Программа выполняется строго последовательно: с ресета прыгает в main() и дальше в порядки очереди.
а прерывание - это внешняя подпрограмма (просто она описана в том же файле) и выполняется она когда МК захочет, а не основная программа
0
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 931
05.11.2011, 21:54 13
Странно тогда чего у меня заработало без volatile (avr studyo 4.19, optimizotion -Os)?
0
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 494
05.11.2011, 21:55 14
Цитата Сообщение от Sykmottir
Странно тогда чего у меня заработало без volatile (avr studyo 4.19, optimizotion -Os)?
Оптимизация кода засисит от кода, если переменную постоянно дергать, оптимизатор вполне может оставить её в покое (если расходы на упаковку не окупаются смысл её проводить?)
0
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 931
05.11.2011, 22:00 15
Не, так я взял код топикстартера без изменений, и скомпилил в студии. И студия сама положила "x" в ROM, и прога работала как хотел автор (проверял только в той же студии). Получается либо у него другой билд или оптимизация.
0
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 494
05.11.2011, 22:03 16
версия компилятора? погода? DEBUG? именно поэтому нужно ставить volatile. Чтобы избавиться от прихотей оптимизатора
0
0 / 0 / 0
Регистрация: 15.12.2010
Сообщений: 931
05.11.2011, 22:06 17
Да как мне давно говорила училка, хочешь не делать ошибок проверяй чужие работы.Сам если бы писал поставил бы volatile, а так в чужом коде и не заметил, а тут еще и студия решила по доброму поступить.
0
05.11.2011, 22:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2011, 22:06
Помогаю со студенческими работами здесь

Первый опыт знакомства с Qt
Ребята, подскажите пожалуйста по поводу сборки Qt под Visual Studio 2005. Я вчера раз 5 пытался...

Первый опыт с OpenGL
Всем привет! Я долго искал ответ на свой вопрос,пробовал и так,и эдак,но никак не получилось у...

Класс || первый опыт
Привет всем не спящим в этот поздний(ранний) час! Как можно увидеть из заголовка, я пытаюсь...

Моддинг - первый опыт
Здравствуйте, форумчане ! Хотел бы выложить свою первую работу по моддингу и услышать ваше мнение?...

Первый опыт в делфи...
всем приветик!!! У меня ознакомительный курс по паскалю, очень простенькие программы задают...

Первый опыт с USART
Всем привет, Пытаюсь подключить ATtiny2313 к som-порту. Присоединил к max232 по даташиту....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru