Нескольно простых вопросов о программировании AVR на Си.

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
c2n
Сверлит текстолит когтями
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение c2n »

Не совсем запрещены. Точнее там в авр как...
Если в процессе обработки прерывания возникло другое прерывание или много прерываний, то для них выставляются флаги, но сами обработчики прерываний не вызываются. Как только происходит возврат в основное тело программы, то будет вызван код прерывания с самым высоким приоритетом. Исключение - вектор сброса, как по кнопке, так и по watchdog.
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение roman.com »

c2n писал(а):Если в процессе обработки прерывания возникло другое прерывание или много прерываний, то для них выставляются флаги, но сами обработчики прерываний не вызываются.
Как пишут в даташите AVR:

"Регистр статуса SREG AVR-микроконтроллера:

Разряд 7 – I: Общее разрешение прерываний:

Бит общего разрешения прерываний используется для активизации работы
системы прерываний. Разрешение отдельных прерываний осуществляется в
соответствующих управляющих регистрах. Если бит общего разрешения
прерываний сбросить, то ни одно из прерываний не будет активным независимо от
их индивидуальной конфигурации. Бит I сбрасывается в 0 аппаратно после
генерации запроса на прерывание, а после выполнения инструкции возврата из
прерывания RETI снова устанавливается к 1 для выполнения последующих
прерываний.
Бит I может также сбрасываться и устанавливаться с помощью
инструкций CLI и SEI, соответственно."
c2n писал(а):Как только происходит возврат в основное тело программы, то будет вызван код прерывания с самым высоким приоритетом.
Вот это я не помню... надо проверить)) :roll:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

c2n писал(а):Не совсем запрещены.
вы пытаетесь возразить? зачем это вообще писать?
c2n писал(а):Исключение - вектор сброса
сброс - это не прерывание
c2n писал(а): Как только происходит возврат в основное тело программы, то будет вызван код прерывания с самым высоким приоритетом.
перед вызовом очередного обработчика гарантируется исполнение одной команды "основной" программы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение COKPOWEHEU »

"С самым высоким приоритетом" - имеется в виду раньше других в таблице векторов прерываний, то есть сначала будет вызван INT0, потом TIMER0_OVF, потом SPI, UART и так далее. Разумеется, только те из них, у которых взведены соответствующие флаги. Друг друга прерывать они не умеют, если не реализовать это программно.
Аватара пользователя
c2n
Сверлит текстолит когтями
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение c2n »

ARV - вы правильно указали, что с накопленным буфером перед вызовом будет исполнена как минимум одна комманда.
Только имеется ввиду одна ассемблерная комманда.
Для Си-кода считать коммкнды-инструкции - гиблое дело. Из моей скромной практики-си комманда занимает минимум два такта системной частоты. Для инкремента еще пойдет, а для вывода в порт - информация может стать неактуальной. Правда этот момент на совести программера.
Прерывания в прерывании можно разрешить. Я так в таймере опрашивал uart. Правда так делать не хорошо. Если надо узнать, что случилось пока например, кнопка int0 обрабатывалась - опроси флаг, а не разрешай прерывания.

С двумя прерываниями еще более менее, зазгребешся кто кому разрешил сработать, а вот с тремя уже каша может случиться
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

В Си нет команд, в этом языке есть операторы :))) разумеется, речь была об ассемблере.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение COKPOWEHEU »

Некоторые команды Си транслируются в одну команду на ассемблере. Например, работа с отдельным битом PORTx |= (1<<y); А так да, когда идет счет команд разумеется речь о машинной инструкции, а не о хз каком количестве, зашифрованном в команде ЯВУ.
L.O.D
Встал на лапы
Сообщения: 139
Зарегистрирован: Чт фев 11, 2016 18:35:37

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение L.O.D »

c2n: Только имеется ввиду одна ассемблерная комманда.,
ARV: В Си нет команд, ... разумеется, речь была об ассемблере.,
COKPOWEHEU: Некоторые команды Си транслируются в одну команду на ассемблере.
"Не ссорьтесь, девочки," (©) процессор ничего не знает ни об операторах Си, ни о ком-мандах ассемблера, он исполняет только свои инструкции. :)))
- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
roman.com
Друг Кота
Сообщения: 9147
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение roman.com »

COKPOWEHEU писал(а):сначала будет вызван INT0, потом TIMER0_OVF, потом SPI, UART и так далее. Разумеется, только те из них, у которых взведены соответствующие флаги.
Решил уточнить (для себя) это вопрос. Для проверки закинул всё в Proteus:

МК принимает данные по 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 ; Переход на обработку при освобождении
регистра

...

и т.д. и т.п. ))) :tea:
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение COKPOWEHEU »

AVR не хранит время возникновения прерывания (кроме захвата таймера, конечно), поэтому после глобального разрешения прерываний, они считаются сработавшими одновременно. Выбор того, которое будет обработано первым зависит от "приоритета". Кстати, если, скажем, INT0 настроено на прерывание по уровню, оно может заблокировать работу контроллера, постоянно вызывая свой обработчик, так что будьте бдительны.
Аватара пользователя
acckyiboxxx
Нашел транзистор. Понюхал.
Сообщения: 182
Зарегистрирован: Ср янв 25, 2012 07:26:40

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение acckyiboxxx »

пытаюсь реализовать тройное мажоритарное резервирование данных в EEPROM , и не могу понять как заставить компилятор перестать ругаться по матери

Код: Выделить всё

#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 на Си.

Сообщение WiseLord »

eeprom_save_data_array( 21 , &EE_LOCKER_DELAY_CNT );
EE_LOCKER_DELAY_CNT - уже указатель, оператор & не нужен.
Tuz
Родился
Сообщения: 12
Зарегистрирован: Вс янв 09, 2011 22:16:11
Откуда: Узбекистан

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Tuz »

Здравствуйте уважаемые коты:)
Помогите выставить фьюзы. Написал программу на СИ для attiny13, две кнопки, четыре выхода. Вообщем в AtmelStudio 6
в симуляции все работает. Все выходы работают когда надо и где надо. Проблемы начинаются при симуляции в Proteuse. В первый раз все работало прекрасно. После изменений в программе началось черте что. Хотел посмотреть работу в железе но только испортил тиньку. В файле прилагаю текст программы. Объясните в чем проблема. Буду очень благодарен. Это мой первый проект. Так что буду благодарен за любой совет или критику.
Вложения
LOUD.txt
(617 байт) 205 скачиваний
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

Честно говоря, не вникал, что вы там пытаетесь сообразить, код плохо читабелен, но на первый взгляд смущает вот это:
if((PINB&(1<<PINB3))==0&i==1)
Почему-то мне кажется, что всё-таки должно быть что-то вроде
if ((PINB & (1<<PINB3)) == 0 && i==1)
то есть логическое ИЛИ, а не побитовое.
Да, и расставляйте скобки в выражениях вида

Код: Выделить всё

PORTB|=1<<0|1<<5
Лично я не всегда уверен в приоритете операций, поэтому предпочитаю скобки ставить - да и код читабельнее будет.
Tuz
Родился
Сообщения: 12
Зарегистрирован: Вс янв 09, 2011 22:16:11
Откуда: Узбекистан

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Tuz »

Мне нужно управление усилителем. Ставить переключатели уже не интересно. Вот и решил сделать управление на контроллере. Идея была такая. Сперва глушится звук на 500мс. Первое нажатие кнопки включает звук и светодиод. Второе нажатие выключает звук и светодиод. Тоже самое и на тонкомпенсацию.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение pokk »

Добрый день , подскажите как можно продублировать инициализированную структуры во flash.
Дело в том, что понадобилось сохранять настройки программы в 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, но думаю это не сильно принципиально.
xVekx
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение xVekx »

Здравствуйте, есть статейка 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 на Си.

Сообщение Аlex »

Что значит "взаимодействовать" ?
Строка в Си - это обычный массив. Вот и работайте с ней как с массивом.
xVekx
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение xVekx »

Код: Выделить всё

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 на Си.

Сообщение Z_h_e »

Как в проекте на Си, написать обработчик прерывания на ассме? Я имею ввиду не вставить в ISR. А написать полностью самому. Функции на ассме я делал, с передачей параметров через регистры. Т.е. надо написать подобную функцию, но чтобы как-то компилятор догадался установить на нее вектор. Спасибо.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

Вернуться в «AVR»