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

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

Сообщение ptr128 »

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

Сообщение 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
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение COKPOWEHEU »

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

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

Сообщение Z_h_e »

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

Сообщение ARV »

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

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

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

Сообщение Z_h_e »

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

Сообщение ARV »

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

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

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

Сообщение 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 КБ) 423 скачивания
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

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

Сообщение WiseLord »

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

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

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

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

Сообщение strengerst »

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

Сообщение 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. После записи переходит в дизассемблер и начинает там прыгать на месте. а чего он хочет понять не могу. Разъясните пожалуйста что надо делать.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

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

Сообщение Tuz »

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

Сообщение _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-кратно и более того,
по сравнению с тем же временем проведенном в эмуляторе

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

Сообщение strengerst »

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

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

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

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

Сообщение WiseLord »

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

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

Сообщение _dark »

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

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

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

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