AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
02.12.2022, 00:25
|
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Signalshik2
Да, у меня выглядит код похожим образом, я у вас подсмотрел как раз изначальную настройку битов, спасибо)
Теперь разбираюсь с аналоговым компаратором
Дошёл до EEPROM ( или EE_RDY прерывание). По сути же оно срабатывает каждый раз после записи в EEPROM, поэтому мне бы просто реализовать запись, но почему-то он не видит EEMEM ( Error 1 'EEMEM' undeclared here (not in a function) C:\Users\110ak\Documents\Atmel Studio\6.2\lab4EE\lab4EE\src\main.c 9 13 lab4EE ) .
Пробовал в datasheet'е искать, не нашёл толком ничего именно по такой комбинации символов.
Последний раз редактировалось mike-y-k; 02.12.2022 в 01:01.
Причина: 6.6, 7.15
|
|
|
|
02.12.2022, 13:24
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Вот этот файл не забыли приложить:
Код:
|
#include ‹avr/eeprom.h› |
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Signalshik2 за это сообщение:
|
|
|
02.12.2022, 15:15
|
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Signalshik2
Да уж, косяк, забыл
Теперь что-то работает, я оставил разрешение прерываний от EECR( EECR = (1‹‹EERIE) и запись в файл. По заданию мне необходимо реализовать обработчики прерываний, т.е ISR функции, а прерывание EE_RDY от EEPROM, как я прочитал, вызывается после записи в EEPROM, так я и сделал. Т.е он записывает в EEPROM, после чего вызывается прерывание, меняющие флаг, который обрабатывается уже в основном цикле, но почему-то после загорания лампочки, она не гаснет через 1,5(в коде изменено на 150 мс) с. может delay работает плохо при EEPROM , или же я ломаю EEPROM тем, что не считываю с него данные...
Но код выглядит на данный момент следующим образом:
Код:
|
int main (void)
{
DDRC |= (1‹‹0); // настройка на выход
PORTC &= ~(1‹‹0); // ставим 0, чтоб не горела лампочка
EECR = (1‹‹EERIE);
cli();
while(EECR & (1‹‹EEWE));
EEAR = (unsigned char*)&c;
EEDR = 5;
EECR |= (1‹‹EEMWE);
EECR |= (1‹‹EEWE);
sei();
EECR = (1‹‹EERIE); //убрал эту строчку UPD 14:20 мск
board_init();
while(1)
{
if(ee_flag==1)
{
PORTC |= (1‹‹0);
ee_flag = 0;
_delay_ms(150);
PORTC &= ~(1‹‹0);
}
}
// Insert application code here, after the board has been initialized.
} |
Сама же схема выглядит слегка странновато):
Последний раз редактировалось mike-y-k; 02.12.2022 в 15:48.
Причина: 7.15
|
|
|
|
02.12.2022, 16:27
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Сообщение от pashamem7894
|
в коде изменено на 150 мс
|
- задержка небольшая, или подольше зажигайте или 1 бит навсегда зажигайте.
Я говорил замечания, Вы обещали исправить. Совершенно ничему не учитесь. Перечитывайте замечания и исправляйте снова.
Сообщение от pashamem7894
|
Код:
|
DDRC |= (1‹‹0); // настройка на выход |
|
- тут нужно = ставить.
Сообщение от pashamem7894
|
|
- вначале программы флаг I равен 0. Этого не надо, короче.
Сообщение от pashamem7894
|
|
- Это пораньше на 2 команды поставьте.
Сообщение от pashamem7894
|
|
- тут что-то непонятное, прерывание нужно пораньше разрешать.
Сообщение от pashamem7894
|
|
- зачем вызывать библиотечную функцию, у них своя плата, а у нас своя инициализация, убрать.
Последний раз редактировалось mike-y-k; 02.12.2022 в 19:47.
Причина: 6.6
|
|
|
Сказали "Спасибо" Signalshik2
|
|
|
02.12.2022, 17:06
|
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Сообщение от Signalshik2
|
- зачем вызывать библиотечную функцию, у них своя плата, а у нас своя инициализация, убрать.
|
Так, учёл ваши замечания, убрал ненужное. Но по поводу замечания по строчке "EECR = (1‹‹EERIE);" не понял. У вас в коде оно стоит закомментированное в функции определения прерываний. Вы имеете ввиду перетащить разрешение прерываний даже выше инициализации портов ввода/вывода?
А ещё по какой-то причине delay ломает прогу, вернее она виснет что ли, при delay она просто перестаёт работать и не меняет состояние лампочки:
Код:
|
while(1)
{
PORTC &= ~(1‹‹0);
if(ee_flag==1)
{
PORTC |= (1‹‹0);
ee_flag = 0;
_delay_ms(15000);
}
} |
Последний раз редактировалось pashamem7894; 02.12.2022 в 17:57.
|
|
|
|
02.12.2022, 18:54
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Сообщение от pashamem7894
|
У вас в коде оно стоит закомментированное в функции определения прерываний.
|
- У меня оно закомментированное, потому что по очереди прерывания проверяются, иначе каша получается.
EECR = (1‹‹EERIE); - разрешение локального прерывания по готовности EEPROM. Естественно надо, чтобы оно стояло заранее, т.е. до вот этих команд:
Код:
|
EECR |= (1‹‹EEMWE);
EECR |= (1‹‹EEWE); |
Сообщение от pashamem7894
|
при delay она просто перестаёт работать
|
- она не перестает работать, она просто отрабатывает задержку и кажется, что виснет. Особенно это проявляется в Atmel Studio, потому что там это идет очень медленно. Ищите другие пути индикации.
15 секунд это очень большая задержка для микроконтроллера, обычно не больше 100-200(мс).
Последний раз редактировалось mike-y-k; 02.12.2022 в 19:48.
Причина: 6.6
|
|
|
|
02.12.2022, 19:30
|
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Сообщение от Signalshik2
|
- У меня оно закомментированное, потому что по очереди прерывания проверяются, иначе каша получается.
EECR = (1‹‹EERIE); - разрешение локального прерывания по готовности EEPROM. Естественно надо, чтобы оно стояло заранее, т.е. до вот этих команд:
Код:
|
EECR |= (1‹‹EEMWE);
EECR |= (1‹‹EEWE); |
|
Это понятно, вроде так и происходит, всё работает. Спасибо
Ну а по поводу delay , буду сейчас пробовать иные формы индикации
|
|
|
|
02.12.2022, 19:33
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
По светодиодам: заведите глобальную переменную:
Код:
|
unsigned char Leds = 0; |
В прерываниях нужные биты включаются, а в бесконечном цикле(while(1)) нужно поставить условия и если бит в 1, то зажечь светодиод через порт, иначе(если бит в 0), то погасить светодиод.
|
|
|
|
04.12.2022, 16:39
|
|
Частый гость
Регистрация: 08.11.2022
Сообщений: 22
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Реализовать 3 обработчика прерывания ATmega8(0X00E, 0X00F, 0X010)
Сообщение от Signalshik2
|
По светодиодам: заведите глобальную переменную:
Код:
|
unsigned char Leds = 0; |
В прерываниях нужные биты включаются, а в бесконечном цикле(while(1)) нужно поставить условия и если бит в 1, то зажечь светодиод через порт, иначе(если бит в 0), то погасить светодиод.
|
понял, попробую такую реализацию
Что ж, всё получилось, задание сделано и сдано, всем спасибо, особенно Signalshik2
Последний раз редактировалось mike-y-k; 04.12.2022 в 16:57.
Причина: 6.6
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:48.
|
|