Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
ну как бы в доках 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
ссылочка не совсем та, что надо... вот более подходящая для поставленного вопроса: http://www.nongnu.org/avr-libc/user-man ... mdemo.htmlptr128 писал(а):Z_h_e: http://www.nongnu.org/avr-libc/user-man ... rupts.html
Код: Выделить всё
.global TIMER1_COMPA_vect
TIMER1_COMPA_vect:
push r16
ldi r16,0xFF
out _SFR_IO_ADDR(PORTD),r16
pop r16
retiВот оно че. Всего-лишь имя функции правильно дать. Может и сам бы догадался, но уперся в понимание __vector_ ## N. Пока не догоняю что это. Это какой-то макрос заполнения таблицы векторов "адресами" функций?ARV писал(а):ну как бы в доках WinAVR целый пример есть...
это костыль, позволяющий компилятору (точнее, паре компилятор-линкер) построить таблицу векторов. насколько я понимаю, именно линкер строит эту таблицу, но компилятор помечает нужные функции вот этими самыми костылями, чтобы линкер понял, что помимо помещения кода функции в тело файла-результата, надо еще в определенной области памяти разместить "добавочку" в виде джампа с адресом входа в эту функцию.Z_h_e писал(а):__vector_ ## N.
ну, поскольку ссылка ведет вникуда, точного ответа не дам... была попытка у меня несколько автоматизировать работу при помощи манипуляций с макросами определения векторов, но она увенчалась ничем... назвать это войной вряд ли можно...Z_h_e писал(а):На форуме http://electronix.ru Вы с этим костылем воевали или тезка?
Код: Выделить всё
#include <avr/io.h>
int main(void)
{
while(1)
{
//TODO:: Please write your application code
}
}
Попробую спасибо за совет.Попробуйте переменную объявить как volatile.
а чего там эмулировать то, писать просто нужно...То есть проверять программу в протеусе или в железе.
Код: Выделить всё
//-----------------------------------------------------------
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);
}
а вот это играть роли не должно!WiseLord писал(а): Перенесите функцию повыше её вызова в коде ....
а это то зачем ему?WiseLord писал(а): ... Или даже static void.