1 / 1 / 0
Регистрация: 26.03.2011
Сообщений: 45
|
|
1 | |
Первый опыт с аналоговым компаратором05.11.2011, 18:54. Показов 4698. Ответов 16
Метки нет (Все метки)
Всем привет,
Решил изучить компаратор 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
|
05.11.2011, 18:54 | |
Ответы с готовыми решениями:
16
Первый опыт Первый опыт На суд. первый опыт Первый опыт с FPGA |
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/2.5/5, никакой разницы, прерывание не срабатывает.
0
|
1 / 1 / 0
Регистрация: 26.03.2011
Сообщений: 45
|
|
05.11.2011, 19:37 | 5 |
Сообщение от dsodir
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
0
|
0 / 0 / 0
Регистрация: 01.11.2010
Сообщений: 213
|
|
05.11.2011, 21:24 | 8 |
Сообщение от byvysi
а какой получится?
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
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 | |
05.11.2011, 22:06 | |
Помогаю со студенческими работами здесь
17
Первый опыт знакомства с Qt Первый опыт с OpenGL Класс || первый опыт Моддинг - первый опыт Первый опыт в делфи... Первый опыт с USART Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |