Нескольно простых вопросов о программировании AVR на Си.
- ptr128
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Чт окт 06, 2016 21:12:07
- Откуда: Южное Бутово
Re: Нескольно простых вопросов о программировании AVR на Си.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
ну как бы в доках WinAVR целый пример есть...Z_h_e писал(а):Как в проекте на Си, написать обработчик прерывания на ассме?
Код: Выделить всё
#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
Добавлено after 2 minutes 17 seconds:
ссылочка не совсем та, что надо... вот более подходящая для поставленного вопроса: http://www.nongnu.org/avr-libc/user-man ... mdemo.htmlptr128 писал(а):Z_h_e: http://www.nongnu.org/avr-libc/user-man ... rupts.html
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Нескольно простых вопросов о программировании AVR на Си.
Код: Выделить всё
.global TIMER1_COMPA_vect
TIMER1_COMPA_vect:
push r16
ldi r16,0xFF
out _SFR_IO_ADDR(PORTD),r16
pop r16
reti- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
Вот оно че. Всего-лишь имя функции правильно дать. Может и сам бы догадался, но уперся в понимание __vector_ ## N. Пока не догоняю что это. Это какой-то макрос заполнения таблицы векторов "адресами" функций?ARV писал(а):ну как бы в доках WinAVR целый пример есть...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
это костыль, позволяющий компилятору (точнее, паре компилятор-линкер) построить таблицу векторов. насколько я понимаю, именно линкер строит эту таблицу, но компилятор помечает нужные функции вот этими самыми костылями, чтобы линкер понял, что помимо помещения кода функции в тело файла-результата, надо еще в определенной области памяти разместить "добавочку" в виде джампа с адресом входа в эту функцию.Z_h_e писал(а):__vector_ ## N.
не берите в голову...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
На форуме http://electronix.ru Вы с этим костылем воевали или тезка? Конечно бы хотелось понимания что это, но может действительно не стоит времени. Ок, спасибо, всем само собой.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
ну, поскольку ссылка ведет вникуда, точного ответа не дам... была попытка у меня несколько автоматизировать работу при помощи манипуляций с макросами определения векторов, но она увенчалась ничем... назвать это войной вряд ли можно...Z_h_e писал(а):На форуме http://electronix.ru Вы с этим костылем воевали или тезка?
препроцессор Си очень убогий, даже макросы GNU-AS намного больше возможностей имеют, чем препроцессор Си... оттого и войны...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: Нескольно простых вопросов о программировании AVR на Си.
Помогите решить вопрос с Atmel Studio6. Когда создаю новый проект как на фото выбираю
. Потом выбираю свой микроконтроллер Attyni13A. Создает такой код
Но в цикле while нечего не работает а вот если убрать цикл while то все работает и уходит в бесконечность что делать.
Но вот допустим как на снимки не фига не шагает
Спойлер
Код: Выделить всё
#include <avr/io.h>
int main(void)
{
while(1)
{
//TODO:: Please write your application code
}
}
Но вот допустим как на снимки не фига не шагает
Спойлер
- Вложения
-
- Образец2.png
- (142.62 КБ) 513 скачиваний
-
- Образец.png
- (100.13 КБ) 422 скачивания
Re: Нескольно простых вопросов о программировании AVR на Си.
Выбирай пункт 1, между С и С++ есть огромная разница.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Поскольку код ничего полезного не делает, неудивительно, что всё это выброшено компилятором как ненужное.
Попробуйте переменную объявить как volatile.
Попробуйте переменную объявить как volatile.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Интересно, сколько уже раз на этом форуме говорили про оптимизацию и volatile ? 
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: Нескольно простых вопросов о программировании AVR на Си.
Попробую спасибо за совет.Попробуйте переменную объявить как volatile.
Re: Нескольно простых вопросов о программировании AVR на Си.
Привет народ. Помогите разобраться с 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. После записи переходит в дизассемблер и начинает там прыгать на месте. а чего он хочет понять не могу. Разъясните пожалуйста что надо делать.
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 на Си.
Возможно, честно эмулирует запись в EEPROM. А она, если не ошибаюсь, занимает порядочное время.
Re: Нескольно простых вопросов о программировании AVR на Си.
То есть проверять программу в протеусе или в железе.
Re: Нескольно простых вопросов о программировании AVR на Си.
а чего там эмулировать то, писать просто нужно...То есть проверять программу в протеусе или в железе.
Код: Выделить всё
//-----------------------------------------------------------
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 на Си.
Подскажите что не так с функцией? Все работает вроде нормально но показывает предупреждающее сообщения как на снимки помогите советом.

Спойлер
- Вложения
-
- функция.png
- (116.46 КБ) 399 скачиваний
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Ругается на отсутствие возвращаемых типов у функций.
Говорит, что по-умолчанию ставит int.
Нет объявления функции Timerstart.
PS: Бардак в программе. Откуда Вы этот код взяли ?
Говорит, что по-умолчанию ставит int.
Нет объявления функции Timerstart.
PS: Бардак в программе. Откуда Вы этот код взяли ?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Смотрите не на значок предупреждения, а на текст. Там же всё ясно написано.
1 - вызвана неизвестная функция Timserstart, ранее нигде не объявленная (по коду она объявлена ниже, чем вызывается)
2 - не указан тип функции (по умолчанию int)
4 - функция (всё та же) по умолчанию должна возвращать int, но не делает этого.
Перенесите функцию повыше её вызова в коде и сделайте void. Или даже static void.
1 - вызвана неизвестная функция Timserstart, ранее нигде не объявленная (по коду она объявлена ниже, чем вызывается)
2 - не указан тип функции (по умолчанию int)
4 - функция (всё та же) по умолчанию должна возвращать int, но не делает этого.
Перенесите функцию повыше её вызова в коде и сделайте void. Или даже static void.
Re: Нескольно простых вопросов о программировании AVR на Си.
укажите явно параметры функции и ее тип
void Timserstart(void){}
WiseLord уже все расписал
Добавлено after 10 minutes 50 seconds:
не важно, где находится тело функции (если используется в том же модуле)
void Timserstart(void){}
WiseLord уже все расписал
Добавлено after 10 minutes 50 seconds:
а вот это играть роли не должно!WiseLord писал(а): Перенесите функцию повыше её вызова в коде ....
не важно, где находится тело функции (если используется в том же модуле)
а это то зачем ему?WiseLord писал(а): ... Или даже static void.



