Нескольно простых вопросов о программировании AVR на Си.
- c2n
- Сверлит текстолит когтями
- Сообщения: 1193
- Зарегистрирован: Ср июл 25, 2012 21:40:09
- Откуда: Самара
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Не совсем запрещены. Точнее там в авр как...
Если в процессе обработки прерывания возникло другое прерывание или много прерываний, то для них выставляются флаги, но сами обработчики прерываний не вызываются. Как только происходит возврат в основное тело программы, то будет вызван код прерывания с самым высоким приоритетом. Исключение - вектор сброса, как по кнопке, так и по watchdog.
Если в процессе обработки прерывания возникло другое прерывание или много прерываний, то для них выставляются флаги, но сами обработчики прерываний не вызываются. Как только происходит возврат в основное тело программы, то будет вызван код прерывания с самым высоким приоритетом. Исключение - вектор сброса, как по кнопке, так и по watchdog.
Re: Нескольно простых вопросов о программировании AVR на Си.
Как пишут в даташите AVR:c2n писал(а):Если в процессе обработки прерывания возникло другое прерывание или много прерываний, то для них выставляются флаги, но сами обработчики прерываний не вызываются.
"Регистр статуса SREG AVR-микроконтроллера:
Разряд 7 – I: Общее разрешение прерываний:
Бит общего разрешения прерываний используется для активизации работы
системы прерываний. Разрешение отдельных прерываний осуществляется в
соответствующих управляющих регистрах. Если бит общего разрешения
прерываний сбросить, то ни одно из прерываний не будет активным независимо от
их индивидуальной конфигурации. Бит I сбрасывается в 0 аппаратно после
генерации запроса на прерывание, а после выполнения инструкции возврата из
прерывания RETI снова устанавливается к 1 для выполнения последующих
прерываний. Бит I может также сбрасываться и устанавливаться с помощью
инструкций CLI и SEI, соответственно."
Вот это я не помню... надо проверить))c2n писал(а):Как только происходит возврат в основное тело программы, то будет вызван код прерывания с самым высоким приоритетом.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
вы пытаетесь возразить? зачем это вообще писать?c2n писал(а):Не совсем запрещены.
сброс - это не прерываниеc2n писал(а):Исключение - вектор сброса
перед вызовом очередного обработчика гарантируется исполнение одной команды "основной" программы.c2n писал(а): Как только происходит возврат в основное тело программы, то будет вызван код прерывания с самым высоким приоритетом.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Нескольно простых вопросов о программировании AVR на Си.
"С самым высоким приоритетом" - имеется в виду раньше других в таблице векторов прерываний, то есть сначала будет вызван INT0, потом TIMER0_OVF, потом SPI, UART и так далее. Разумеется, только те из них, у которых взведены соответствующие флаги. Друг друга прерывать они не умеют, если не реализовать это программно.
- c2n
- Сверлит текстолит когтями
- Сообщения: 1193
- Зарегистрирован: Ср июл 25, 2012 21:40:09
- Откуда: Самара
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
ARV - вы правильно указали, что с накопленным буфером перед вызовом будет исполнена как минимум одна комманда.
Только имеется ввиду одна ассемблерная комманда.
Для Си-кода считать коммкнды-инструкции - гиблое дело. Из моей скромной практики-си комманда занимает минимум два такта системной частоты. Для инкремента еще пойдет, а для вывода в порт - информация может стать неактуальной. Правда этот момент на совести программера.
Прерывания в прерывании можно разрешить. Я так в таймере опрашивал uart. Правда так делать не хорошо. Если надо узнать, что случилось пока например, кнопка int0 обрабатывалась - опроси флаг, а не разрешай прерывания.
С двумя прерываниями еще более менее, зазгребешся кто кому разрешил сработать, а вот с тремя уже каша может случиться
Только имеется ввиду одна ассемблерная комманда.
Для Си-кода считать коммкнды-инструкции - гиблое дело. Из моей скромной практики-си комманда занимает минимум два такта системной частоты. Для инкремента еще пойдет, а для вывода в порт - информация может стать неактуальной. Правда этот момент на совести программера.
Прерывания в прерывании можно разрешить. Я так в таймере опрашивал uart. Правда так делать не хорошо. Если надо узнать, что случилось пока например, кнопка int0 обрабатывалась - опроси флаг, а не разрешай прерывания.
С двумя прерываниями еще более менее, зазгребешся кто кому разрешил сработать, а вот с тремя уже каша может случиться
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
В Си нет команд, в этом языке есть операторы
разумеется, речь была об ассемблере.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Нескольно простых вопросов о программировании AVR на Си.
Некоторые команды Си транслируются в одну команду на ассемблере. Например, работа с отдельным битом PORTx |= (1<<y); А так да, когда идет счет команд разумеется речь о машинной инструкции, а не о хз каком количестве, зашифрованном в команде ЯВУ.
Re: Нескольно простых вопросов о программировании AVR на Си.
"Не ссорьтесь, девочки," (©) процессор ничего не знает ни об операторах Си, ни о ком-мандах ассемблера, он исполняет только свои инструкции.c2n: Только имеется ввиду одна ассемблерная комманда.,
ARV: В Си нет команд, ... разумеется, речь была об ассемблере.,
COKPOWEHEU: Некоторые команды Си транслируются в одну команду на ассемблере.
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
Re: Нескольно простых вопросов о программировании AVR на Си.
Решил уточнить (для себя) это вопрос. Для проверки закинул всё в Proteus:COKPOWEHEU писал(а):сначала будет вызван INT0, потом TIMER0_OVF, потом SPI, UART и так далее. Разумеется, только те из них, у которых взведены соответствующие флаги.
МК принимает данные по UART и уходит в обработчик прерывания (по окончанию приёма UART). А в это время сработали INT0 и INT1...
При выходе из обработчика прерывания UART, переходим в обработчик INT0 , а затем в обработчик INT1.
Причём независимо от того кто первый сработал (INT0 или INT1), всегда сначала обрабатываем INT0 , а затем INT1.
Так мне показал Proteus.
Да, всё верно. Всё согласно даташиту )) "Векторы Сброса и Прерывания"
$000 rjmp RESET ; Переход на обработку сброса
$001 rjmp EXT_INT0 ; Переход на обработку запроса IRQ0
$002 rjmp EXT_INT1 ; Переход на обработку запроса IRQ1
$003 rjmp TIM2_COMP ; Переход на обработку сравнения Timer2
$004 rjmp TIM2_OVF ; Переход на обработку при переполнении Timer2
$005 rjmp TIM1_CAPT ; Переход на обработку при захвате фронта
Timer1
$006 rjmp TIM1_COMPA ; Переход на обработку при срабатывании
компаратора A Timer1
$007 rjmp TIM1_COMPB ; Переход на обработку при срабатывании
компаратора B Timer1
$008 rjmp TIM1_OVF ; Переход на обработку при переполнении Timer1
$009 rjmp TIM0_OVF ; Переход на обработку при переполнении Timer0
$00a rjmp SPI_STC ; Переход на обработку при завершении передачи
SPI
$00b rjmp USART_RXC ; Переход на обработку при завершении приема
УСАПП0
$00c rjmp USART_UDRE ; Переход на обработку при освобождении
регистра
...
и т.д. и т.п. )))
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Нескольно простых вопросов о программировании AVR на Си.
AVR не хранит время возникновения прерывания (кроме захвата таймера, конечно), поэтому после глобального разрешения прерываний, они считаются сработавшими одновременно. Выбор того, которое будет обработано первым зависит от "приоритета". Кстати, если, скажем, INT0 настроено на прерывание по уровню, оно может заблокировать работу контроллера, постоянно вызывая свой обработчик, так что будьте бдительны.
- acckyiboxxx
- Нашел транзистор. Понюхал.
- Сообщения: 182
- Зарегистрирован: Ср янв 25, 2012 07:26:40
Re: Нескольно простых вопросов о программировании AVR на Си.
пытаюсь реализовать тройное мажоритарное резервирование данных в EEPROM , и не могу понять как заставить компилятор перестать ругаться по матери
на это компилятор орет :
пробовал пояснить компилятору что все норм обьявляя функцию таким образом :
void eeprom_save_data_array(uint8_t data , uint8_t EEMEM *EE_BUF)
тогда и вовсе к ворнингу добавляется ошибка
как такое побеждать есть мысли ?
Код: Выделить всё
#include "avr/eeprom.h"
// инициализируем массив с данными в еепром
uint8_t EE_LOCKER_DELAY_CNT[] EEMEM = {57 , 57 , 57};
//функция записи
void eeprom_save_data_array(uint8_t data , uint8_t *EE_BUF){
cli();
eeprom_write_byte(&EE_BUF[0] , data);
eeprom_write_byte(&EE_BUF[1] , data);
eeprom_write_byte(&EE_BUF[2] , data);
sei();
}
int main(void){
// ее вызов
eeprom_save_data_array( 21 , &EE_LOCKER_DELAY_CNT );
while(1){}
}
Код: Выделить всё
Warning 1 passing argument 2 of 'eeprom_save_data_array' from incompatible pointer type
void eeprom_save_data_array(uint8_t data , uint8_t EEMEM *EE_BUF)
тогда и вовсе к ворнингу добавляется ошибка
Код: Выделить всё
Error 1 section attribute not allowed for 'EE_BUF'
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
EE_LOCKER_DELAY_CNT - уже указатель, оператор & не нужен.eeprom_save_data_array( 21 , &EE_LOCKER_DELAY_CNT );
Re: Нескольно простых вопросов о программировании AVR на Си.
Здравствуйте уважаемые коты:)
Помогите выставить фьюзы. Написал программу на СИ для attiny13, две кнопки, четыре выхода. Вообщем в AtmelStudio 6
в симуляции все работает. Все выходы работают когда надо и где надо. Проблемы начинаются при симуляции в Proteuse. В первый раз все работало прекрасно. После изменений в программе началось черте что. Хотел посмотреть работу в железе но только испортил тиньку. В файле прилагаю текст программы. Объясните в чем проблема. Буду очень благодарен. Это мой первый проект. Так что буду благодарен за любой совет или критику.
Помогите выставить фьюзы. Написал программу на СИ для attiny13, две кнопки, четыре выхода. Вообщем в AtmelStudio 6
в симуляции все работает. Все выходы работают когда надо и где надо. Проблемы начинаются при симуляции в Proteuse. В первый раз все работало прекрасно. После изменений в программе началось черте что. Хотел посмотреть работу в железе но только испортил тиньку. В файле прилагаю текст программы. Объясните в чем проблема. Буду очень благодарен. Это мой первый проект. Так что буду благодарен за любой совет или критику.
- Вложения
-
- LOUD.txt
- (617 байт) 205 скачиваний
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Честно говоря, не вникал, что вы там пытаетесь сообразить, код плохо читабелен, но на первый взгляд смущает вот это:
Да, и расставляйте скобки в выражениях вида
Лично я не всегда уверен в приоритете операций, поэтому предпочитаю скобки ставить - да и код читабельнее будет.
Почему-то мне кажется, что всё-таки должно быть что-то вродеif((PINB&(1<<PINB3))==0&i==1)
то есть логическое ИЛИ, а не побитовое.if ((PINB & (1<<PINB3)) == 0 && i==1)
Да, и расставляйте скобки в выражениях вида
Код: Выделить всё
PORTB|=1<<0|1<<5Re: Нескольно простых вопросов о программировании AVR на Си.
Мне нужно управление усилителем. Ставить переключатели уже не интересно. Вот и решил сделать управление на контроллере. Идея была такая. Сперва глушится звук на 500мс. Первое нажатие кнопки включает звук и светодиод. Второе нажатие выключает звук и светодиод. Тоже самое и на тонкомпенсацию.
Re: Нескольно простых вопросов о программировании AVR на Си.
Добрый день , подскажите как можно продублировать инициализированную структуры во flash.
Дело в том, что понадобилось сохранять настройки программы в flash, но для зашиты их решил сделать несколько дубликатов.
Делаю это примерно так:
В принципе можно так же сделать и дублирующие структуры, но в этом варианте мне не нравится то что при необходимости поменять значения, то придется менять во всех дублирующих структурах и можно в какой-то ошибиться.
Хотелось бы сделать инициализацию в одной из структур, которая при прошивки разместилась по нескольким адресам.
Как заставить компилятор разместить структуры во flash даже если по коду они не используются?(по коду использую адрес)
Ps. компилятор IAR stm32, но думаю это не сильно принципиально.
Дело в том, что понадобилось сохранять настройки программы в flash, но для зашиты их решил сделать несколько дубликатов.
Делаю это примерно так:
Код: Выделить всё
S_GlobalSettingAllVar DefaultGlobalSettingAllVar={ //Начальные настройки(устанавливаются после нажатия кнопки Reset)
.NetSetting={
.mac = {0x00, 0x08, 0xdc, 0xab, 0xc1, 0x11}, //6
.ip = {192, 168, 1, 4}, //4
.sn = {255, 255, 0, 0},
.gw = {192, 168, 0, 0},
},
.Password={"fghfgh"},
}
S_GlobalSettingAllVar GlobalSettingAllVar={ //рабочая структура
.NetSetting={
.mac = {0x00, 0x08, 0xdc, 0xab, 0xc1, 0x11}, //6
.ip = {192, 168, 1, 4}, //4
.sn = {255, 255, 0, 0},
.gw = {192, 168, 0, 0},
},
.Password={"fghfgh"},
}
В принципе можно так же сделать и дублирующие структуры, но в этом варианте мне не нравится то что при необходимости поменять значения, то придется менять во всех дублирующих структурах и можно в какой-то ошибиться.
Хотелось бы сделать инициализацию в одной из структур, которая при прошивки разместилась по нескольким адресам.
Как заставить компилятор разместить структуры во flash даже если по коду они не используются?(по коду использую адрес)
Ps. компилятор IAR stm32, но думаю это не сильно принципиально.
Re: Нескольно простых вопросов о программировании AVR на Си.
Здравствуйте, есть статейка http://www.nongnu.org/avr-libc/user-man ... space.html помогите разобраться как взаимодействовать с 1 строкой типа, а то пример только для списка строк.
Код: Выделить всё
char string_1[] PROGMEM = "String 1"; - Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Что значит "взаимодействовать" ?
Строка в Си - это обычный массив. Вот и работайте с ней как с массивом.
Строка в Си - это обычный массив. Вот и работайте с ней как с массивом.
Re: Нескольно простых вопросов о программировании AVR на Си.
Код: Выделить всё
char string_1[] PROGMEM = "String 1";
char buff[20];
strcpy_P(buff,(PGM_P)&string_1);
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
Как в проекте на Си, написать обработчик прерывания на ассме? Я имею ввиду не вставить в ISR. А написать полностью самому. Функции на ассме я делал, с передачей параметров через регистры. Т.е. надо написать подобную функцию, но чтобы как-то компилятор догадался установить на нее вектор. Спасибо.
