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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

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

Сообщение ptr128 »

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

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

Сообщение ARV »

Z_h_e писал(а):Как в проекте на Си, написать обработчик прерывания на ассме?
ну как бы в доках WinAVR целый пример есть...

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

#include <avr/io.h>

/*
 * Timer 0 hit TOP (0xff), i.e. it turns from up-counting
 * into down-counting direction.
 */
.global TIM0_COMPA_vect
TIM0_COMPA_vect:
	in	sreg_save, _SFR_IO_ADDR(SREG)
	inc	counter_hi
	clr	flags
	out	_SFR_IO_ADDR(SREG), sreg_save
	reti
примерно такое должно быть в отдельном файле проекта с расширением .S

Добавлено after 2 minutes 17 seconds:
ptr128 писал(а):Z_h_e: http://www.nongnu.org/avr-libc/user-man ... rupts.html
ссылочка не совсем та, что надо... вот более подходящая для поставленного вопроса: http://www.nongnu.org/avr-libc/user-man ... mdemo.html
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение COKPOWEHEU »

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

.global TIMER1_COMPA_vect
TIMER1_COMPA_vect:
  push r16
  ldi r16,0xFF
  out _SFR_IO_ADDR(PORTD),r16
  pop r16
reti
Примерно так. Главное - назвать метку в соответствии с Си-шным названием вектора и модификатор .global с ней же. В таблицу векторов компилятор подставит сам.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

ARV писал(а):ну как бы в доках WinAVR целый пример есть...
Вот оно че. Всего-лишь имя функции правильно дать. Может и сам бы догадался, но уперся в понимание __vector_ ## N. Пока не догоняю что это. Это какой-то макрос заполнения таблицы векторов "адресами" функций?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Z_h_e писал(а):__vector_ ## N.
это костыль, позволяющий компилятору (точнее, паре компилятор-линкер) построить таблицу векторов. насколько я понимаю, именно линкер строит эту таблицу, но компилятор помечает нужные функции вот этими самыми костылями, чтобы линкер понял, что помимо помещения кода функции в тело файла-результата, надо еще в определенной области памяти разместить "добавочку" в виде джампа с адресом входа в эту функцию.

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

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

На форуме http://electronix.ru Вы с этим костылем воевали или тезка? Конечно бы хотелось понимания что это, но может действительно не стоит времени. Ок, спасибо, всем само собой.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Z_h_e писал(а):На форуме http://electronix.ru Вы с этим костылем воевали или тезка?
ну, поскольку ссылка ведет вникуда, точного ответа не дам... была попытка у меня несколько автоматизировать работу при помощи манипуляций с макросами определения векторов, но она увенчалась ничем... назвать это войной вряд ли можно...

препроцессор Си очень убогий, даже макросы GNU-AS намного больше возможностей имеют, чем препроцессор Си... оттого и войны...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

Помогите решить вопрос с Atmel Studio6. Когда создаю новый проект как на фото выбираю
СпойлерИзображение
. Потом выбираю свой микроконтроллер Attyni13A. Создает такой код

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

#include <avr/io.h>

int main(void)
{
    while(1)
    {
        //TODO:: Please write your application code 
    }
}
Но в цикле while нечего не работает а вот если убрать цикл while то все работает и уходит в бесконечность что делать.
Но вот допустим как на снимки не фига не шагает
СпойлерИзображение
Вложения
Образец2.png
(142.62 КБ) 513 скачиваний
Образец.png
(100.13 КБ) 422 скачивания
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

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

Сообщение Vov123 »

Выбирай пункт 1, между С и С++ есть огромная разница.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Поскольку код ничего полезного не делает, неудивительно, что всё это выброшено компилятором как ненужное.

Попробуйте переменную объявить как volatile.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Интересно, сколько уже раз на этом форуме говорили про оптимизацию и volatile ? :)
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

Попробуйте переменную объявить как volatile.
Попробую спасибо за совет.
Tuz
Родился
Сообщения: 12
Зарегистрирован: Вс янв 09, 2011 22:16:11
Откуда: Узбекистан

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

Сообщение Tuz »

Привет народ. Помогите разобраться с EEPROM. Задача опросить кнопку, запомнить её состояние и при следующем включении восстановить прежнее значение. Вот собственно сама программа, т.е. ее фрагменты.

Tiny 13a
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <stdint.h>
#define But_Loud (PINB&_BV(PINB3))==0
#define Loud _BV(0)|_BV(5)

uint16_t pin_code EEMEM;

if (But_Loud&&L==0)
{
Pause;
PORTB|=Loud;
L++;
eeprom_write_word (&pin_code,L);
}

В Atmel Studio 6 при отладке все идет хорошо до момента записи в EEPROM. После записи переходит в дизассемблер и начинает там прыгать на месте. а чего он хочет понять не могу. Разъясните пожалуйста что надо делать.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Возможно, честно эмулирует запись в EEPROM. А она, если не ошибаюсь, занимает порядочное время.
Tuz
Родился
Сообщения: 12
Зарегистрирован: Вс янв 09, 2011 22:16:11
Откуда: Узбекистан

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

Сообщение Tuz »

То есть проверять программу в протеусе или в железе.
Аватара пользователя
_dark
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

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

Сообщение _dark »

То есть проверять программу в протеусе или в железе.
а чего там эмулировать то, писать просто нужно...

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

//-----------------------------------------------------------
uint8_t __eePUT(uint16_t ofs, uint8_t byte)
{    
  uint8_t ch = 0;// =  byte;

_CLI();
  EEAR = ofs; 
  while(EECR & bEEWE){};
  EEDR = byte;
  EECR |= bEEMWE;                        
  EECR |= bEEWE;
  while(EECR & bEEWE){};
  EEDR = 0;
  EECR |= bEERE;                         
  while(EECR & bEERE){};
  if(EEDR == byte) ch = 0;               // контроль на совпадение
  else ch = 0xff;
_SEI();
  
  return(ch);
}
//-----------------------------------------------------------
   
uint8_t __eeGET(uint16_t ofs)
{    
  while(EECR & bEEWE){};
  EEAR = ofs; 
  EECR |= bEERE;
  while(EECR & bEERE){};
  return(EEDR);
} 
зы
когда же народ поймет, что нужно просто писать более менее аккуратно код, а не эмулировать все подряд
время затраченное на понимание с листа того, что вы написали окупится 10-кратно и более того,
по сравнению с тем же временем проведенном в эмуляторе

зызы
исключение из "зы"
эмулировать имеет смысл, только отдельные функции или небольшие куски (в некоторых специфичных случаях), но лучше см. "зы", т.к.
если вам не помог простой анализ кода "с листа", то скорее всего вам стоит переписать этот код
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

Подскажите что не так с функцией? Все работает вроде нормально но показывает предупреждающее сообщения как на снимки помогите советом.
СпойлерИзображение
Вложения
функция.png
(116.46 КБ) 399 скачиваний
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

Ругается на отсутствие возвращаемых типов у функций.
Говорит, что по-умолчанию ставит int.
Нет объявления функции Timerstart.

PS: Бардак в программе. Откуда Вы этот код взяли ? :facepalm:
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Смотрите не на значок предупреждения, а на текст. Там же всё ясно написано.
1 - вызвана неизвестная функция Timserstart, ранее нигде не объявленная (по коду она объявлена ниже, чем вызывается)
2 - не указан тип функции (по умолчанию int)
4 - функция (всё та же) по умолчанию должна возвращать int, но не делает этого.

Перенесите функцию повыше её вызова в коде и сделайте void. Или даже static void.
Аватара пользователя
_dark
Встал на лапы
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

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

Сообщение _dark »

укажите явно параметры функции и ее тип
void Timserstart(void){}

WiseLord уже все расписал

Добавлено after 10 minutes 50 seconds:
WiseLord писал(а): Перенесите функцию повыше её вызова в коде ....
а вот это играть роли не должно!
не важно, где находится тело функции (если используется в том же модуле)
WiseLord писал(а): ... Или даже static void.
а это то зачем ему?
Ответить

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