AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
25.11.2022, 14:13
|
#11
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Сообщение от ForcePoint
|
Не все.
|
Век живи, век учись. На самом деле так. Я всегда изо всех сил старался с I2C дел не иметь, уж больно он... хитрозакрученный.
На СТМке выводил на дисплей ... один раз... даже работало
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
25.11.2022, 16:26
|
#12
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Сейчас работает блок AC. Рекомендую включать блоки по одному сверху вниз: ADC и EEPROM путем раскомментирования и закомментирования в функции инициализации InitPeripherals().
|
|
|
Сказали "Спасибо" Signalshik2
|
|
|
25.11.2022, 17:09
|
#13
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
25.11.2022, 19:48
|
#14
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,731
Сказал спасибо: 2,443
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Ну,если по названию проблема найти ,то о каких прерываниях можно говорить то?
|
|
|
|
29.11.2022, 09:29
|
#15
|
Вид на жительство
Регистрация: 12.12.2012
Сообщений: 370
Сказал спасибо: 31
Сказали Спасибо 204 раз(а) в 112 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Сообщение от nml
|
Век живи, век учись. На самом деле так. Я всегда изо всех сил старался с I2C дел не иметь, уж больно он... хитрозакрученный.
На СТМке выводил на дисплей ... один раз... даже работало
|
В таком случае возьмите на Али логический анализатор-500р. Он поддерживает много форматов. У вас будет всё как на ладони.
С ним сделал очень много открытий. Вплоть до того , что нашёл неточности в документации на одну микросхему в своё время(TRC102).
И если про логический анализатор - Разбирался с NFC, распечатал 400 листов, перевёл, ничего не понял. Купил ардуино, подключил анализатор,
снял обмен. Через два дня у меня работала своя программа на ПИК.
|
|
|
|
01.12.2022, 00:29
|
#16
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Что ж, я попробовал реализовать просто обработчик прерывания ADC, но по итогу при прерывании, у меня не срабатывает функция преревания. Что должно произойти по задумке: программа запускается, загораются лампочки с портов 0 и 2, затем, через какое-то время, adc_flag должен поменять своё значение на 1 и должны погаснуть все лампочки, кроме той, что от порта b1. Но почему-то он вооообще не заходит в функцию обработки прерывания ISR(ADC_vect). Код ниже:
Код:
|
#define F_CPU 1000000UL
#include ‹avr/io.h›
#include ‹util/delay.h›
#include ‹avr/interrupt.h›
volatile unsigned long adc_buffer, adc_counter;
volatile unsigned int adc_flag = 0;
ISR(ADC_vect)
{
adc_flag = 1;
}
int main(void)
{
sei();
DDRB |= (1‹‹2) | (1‹‹1) | (1‹‹0); // настройка на выход
PORTB &= ~((1‹‹2) | (1‹‹1) | (1‹‹0)); // ставим 0, чтоб не горели лампочки
DDRC &= ~(1‹‹1); // настройка на вход 1-ый бит порта BC
ADCSRA |= (1‹‹ADEN); // рарзрешение работы АЦП
ADCSRA |= (1‹‹ADFR); // Преобразование без перерывов
ADCSRA &= (1‹‹ADPS2);
ADCSRA |= (1‹‹ADPS1) | (1‹‹ADPS0); // частота апц(1000000/8)
ADMUX |= (1‹‹REFS1) | (1‹‹REFS0); //внутренний источник опорного напряжения(2,56В)
ADMUX |= (1‹‹ADLAR);//выравнивание
ADMUX &= ~((1‹‹MUX3) | (1‹‹MUX2)); // исп. ADC1
ADCSRA |= (1 ‹‹ ADIE);
ADCSRA |= (1‹‹ADSC); // запуск АЦП
PORTB |= (1‹‹0);
PORTB &= ~(1‹‹1);
PORTB |= (1‹‹2);
//ADC POWER CONNECTIONS
while(1)
{
if(adc_flag != 0)
{
PORTB &= ~(1‹‹0);
PORTB |= (1‹‹1);
PORTB &= ~(1‹‹2);
_delay_ms(1000);
}
}
} |
Последний раз редактировалось mike-y-k; 01.12.2022 в 01:00.
Причина: code
|
|
|
|
01.12.2022, 12:32
|
#17
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
UPD:прога вообще не заходит в цикл while(1), но почему.. попробовал исправить int main(void) на void main(void), не помогло:
Код:
|
void main(void)
{
DDRB |= (1‹‹2) | (1‹‹1) | (1‹‹0); // настройка на выход
PORTB &= ~((1‹‹2) | (1‹‹1) | (1‹‹0)); // ставим 0, чтоб не горели лампочки
DDRC &= ~(1‹‹1); // настройка на вход 1-ый бит порта BC
ADCSRA |= (1‹‹ADEN); // рарзрешение работы АЦП
ADCSRA |= (1‹‹ADFR); // Преобразование без перерывов
ADCSRA &= (1‹‹ADPS2);
ADCSRA |= (1‹‹ADPS1) | (1‹‹ADPS0); // частота апц(1000000/8)
sei();
ADMUX |= (1‹‹REFS1) | (1‹‹REFS0); //внутренний источник опорного напряжения(2,56В)
ADMUX |= (1‹‹ADLAR);//выравнивание
ADMUX &= ~((1‹‹MUX3) | (1‹‹MUX2) | (1‹‹MUX1)); // исп. ADC1
ADMUX |= (1‹‹MUX0);
ADCSRA |= (1 ‹‹ ADIE);
ADCSRA |= (1‹‹ADSC); // запуск АЦП
PORTB |= (1‹‹0);
PORTB &= ~(1‹‹1);
PORTB |= (1‹‹2);
//ADC POWER CONNECTIONS
while(1)
{
PORTB &= ~(1‹‹0);
PORTB |= (1‹‹1);
PORTB &= ~(1‹‹2);
if(adc_flag == 1)
{
PORTB &= ~(1‹‹0);
PORTB |= (1‹‹1);
PORTB &= ~(1‹‹2);
_delay_ms(1000);
}
}
} |
UPD: Добавил перед функцией main и и теперь цикл работает снова, но по-прежнему не работает обработчик прерывания, который должен переключать флаг, чтобы далее кнопки гасли
Последний раз редактировалось pashamem7894; 01.12.2022 в 13:04.
|
|
|
|
01.12.2022, 13:19
|
#18
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Как кнопки могут могут погаснуть? Вы когда мыслить точнее будете?
Я написал код. Вам не надо? Вы смотрели?
Сообщение от pashamem7894
|
unsigned long, unsigned int
|
- Зачем такие большие типы? Вы почитайте сначала какую емкость в памяти они занимают.
Для adc_flag и unsigned char хватит, а потом и на биты надо переходить.
Сообщение от pashamem7894
|
sei();
|
- установка глобальных прерываний не здесь устанавливается, а после настройки всей периферии. А в некоторых случаях(EEPROM) и еще дальше.
Сообщение от pashamem7894
|
Код:
|
ADCSRA |= (1‹‹ADEN); //рарзрешение работы АЦП
ADCSRA |= (1‹‹ADFR); // Преобразование без перерывов |
|
- эти 2 команды нужно писать в 1 строку, т.к. преобразование еще не начато. А потом уже устанавливать SC(Start Conversion).
Код:
|
ADMUX &= ~((1‹‹MUX3) | (1‹‹MUX2) | (1‹‹MUX1)); // исп. ADC1
ADMUX |= (1‹‹MUX0); |
- Не надо писать по 10 раз: сначала что-то там стираем, потом опять записываем и т.д. Операция присвоения и ставите где 1 и все.
Сообщение от pashamem7894
|
Код:
|
PORTB |= (1‹‹0);
PORTB &= ~(1‹‹1);
PORTB |= (1‹‹2); |
|
- Без задержек ничего видно не будет.
Схема нарисована неправильно. Проводники должны быть покороче, используйте метки(по Proteus тут есть документация). Для АЦП нужно использовать потенциометр, используйте порт POWER. Вольтметр попроще там есть.
Сообщение от pashamem7894
|
Код:
|
PORTB &= ~(1‹‹0);
PORTB |= (1‹‹1);
PORTB &= ~(1‹‹2);
if(adc_flag == 1)
{
PORTB &= ~(1‹‹0);
PORTB |= (1‹‹1);
PORTB &= ~(1‹‹2); |
|
- В чем здесь разница кода? Надо было сделать разную светодиодную индикацию.
Последний раз редактировалось mike-y-k; 01.12.2022 в 14:22.
Причина: 6.6
|
|
|
|
01.12.2022, 13:58
|
#19
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Сообщение от Signalshik2
|
Как кнопки могут могут погаснуть? Вы когда мыслить точнее будете?
Я написал код. Вам не надо? Вы смотрели?
|
Я даже не заметил его.. просто после моих сообщений я некоторое время делал другое задание, а когда пришёл, были какие-то споры по теме, ну я и не прочитал... Извиняюсь. Огромное спасибо. Я попробую осмыслить, как тут и что работает, это явно поможет, ну и ошибки исправлю, чтоб знать, которые вы выше написали.
|
|
|
|
01.12.2022, 15:21
|
#20
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Вот так должно быть.
В прерывания заходит, в цикл заходит.
Код:
|
#define F_CPU 1000000
#include ‹asf.h›
#include ‹avr/io.h›
#include ‹avr/iom8.h›
#include ‹avr/interrupt.h›
#include ‹util/delay.h›
#include ‹avr/eeprom.h›
uint8_t c EEMEM;
volatile unsigned long adc_buffer, adc_counter;
volatile unsigned char adc_flag = 0;
ISR(ADC_vect)
{
adc_flag = 1;
}
int main(void)
{
DDRB = (1‹‹2) | (1‹‹1) | (1‹‹0); // настройка на выход
//рарзрешение работы АЦП
//Преобразование без перерывов
ADCSRA = (1‹‹ADEN)|(1‹‹ADFR)|(1‹‹ADIE);
//внутренний источник опорного напряжения(2,56В)
//выравнивание
ADMUX = (1‹‹REFS1)|(1‹‹REFS0)|(1‹‹ADLAR)|(1‹‹MUX0);
sei();
ADCSRA |= (1‹‹ADSC); //запуск АЦП
while(1)
{
//101
PORTB |= (1‹‹0);
PORTB &= ~(1‹‹1);
PORTB &= ~(1‹‹2);
if(adc_flag == 1)
{
PORTB &= ~(1‹‹0);
PORTB |= (1‹‹1);
PORTB &= ~(1‹‹2);
_delay_ms(100);
}
}
} |
|
|
|
Сказали "Спасибо" Signalshik2
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:38.
|
|