


Да ладно вам, я просто развлекался.ARV писал(а):ой, вот только не надо снова... если функция возвращает еще больше "ничего", чем просто void, это так и есть - лучше согласитесь, что бывают такие вот суперничегоневозвращающие функции, и все - иначе COKPOWEHEU выкушает все мозги у вас и у меня (я и так еще от прошлого раза не восстановился полностью).
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#define RELE_5 PORTB3
#define BUTTON_4 PIND5
unsigned int flag_drebezg;
ISR (TIMER0_OVF_vect)
{
if ((PIND & (1<<BUTTON_4))&&(flag_drebezg==1))
flag_drebezg=0; //Флаг сбрасывается только при отжатой кнопке, т.е. при лог.1 на входе
int main(void)
TCCR0 = (1 << CS12)|(0 << CS11)|(1 << CS10); //делитель clk/1024
TIMSK |= (1 << TOIE0); // разрешение прерывания по переполнению таймера
sei(); // Разрешение прерываний
DDRB = 0xff; //Все пины B как выходы
PORTB = 0x00; //Во все пины B по нулям
DDRD = 0x00; //Все пины D как входы
while(1)
{
if (~PIND & (1<<BUTTON_4))&&(flag_drebezg == 0)) //Компенсация дребезга и частого срабатывания
((PORTB ^= (1<<RELE_3))&&(flag_drebezg=1));//включение реле, Флаг включен
}
return 0;
}
Код: Выделить всё
#include <util/delay.h>
#define DEBOUNCE_DELAY_MS 20
uint8_t get_button_state(void){
uint8_t tmp = !(PIND & _BV(BUTTON_4));
_delay_ms(DEBOUNCE_DELAY_MS);
return tmp & !(PIND & _BV(BUTTON_4));
}
// далее в нужном месте вызываете эту функцию: она вернет НЕ НОЛЬ, если кнопка нажатаКод: Выделить всё
volatile uint8_t btn = 0;
ISR(TIMER0_OVF_vect){
btn = !(PIND & _BV(BUTTON_4));
}
// далее опрашиваете btn - если не ноль, то кнопка нажата, иначе там будет 0Код: Выделить всё
while(1){
if( !(PIND & (1<<BUTTON_4)) ){
//код
}
_delay_ms(100);
}потому что для WinAVR, а так же avr-gcc (т.е. для AVR Studio любых версий) "стандартными" функциями задержки являются именно _delay_ms и _delay_us, а для "компилятора" CodeVision стандартными считаются функции без первого нижнего подчеркивания.ozonn писал(а):Почему так?
но у меня Atmel Studio 6.2, не CodeVision. Тем не менее, почему в одних проектах одни функции работают, в других другие?ARV писал(а):потому что для WinAVR, а так же avr-gcc (т.е. для AVR Studio любых версий) "стандартными" функциями задержки являются именно _delay_ms и _delay_us, а для "компилятора" CodeVision стандартными считаются функции без первого нижнего подчеркивания.ozonn писал(а):Почему так?
внимание: не смотря на похожесть наименования и функционирования эти "функции" не взаимозаменяемы в некоторых случаях! это важно при "переводе" проектов из CVAVR в формат проектов студии - студийные функции могут корректно работать только с параметрами в виде констант! переменные в этом случае использовать нельзя.
никогда не встречал.ozonn писал(а):Тем не менее, почему в одних проектах одни функции работают, в других другие?
Toolchain один и тот же. У меня проект на атмеге32, стало не хватать портов, решил перейти на атмегу128, тем более, что она дешевле. Сделал новый проект и возникла такая, если можно так сказать, проблемаARV писал(а):никогда не встречал.ozonn писал(а):Тем не менее, почему в одних проектах одни функции работают, в других другие?
но это возможно, если:
1. я не в курсе последних нововведений в libc avr-gcc (Atmel Toolchain)
2. в проекте присутствуют самописные функции без подчеркивания
потому что парадигма языка Си подразумевает независимую компиляцию каждого исходника.ozonn писал(а):почему нельзя инклюдить файлы *.c
OCRnA = fclk/(2N*focna) - 1Kotэ писал(а):В даташите (таймеры, CTC Mode) есть такая форума возвращающая частоту на выходе OCnA.
Как ее переделать чтобы по известной частоте получить число для регистра OCRnA? Другими словами нужно генерировать нужную частоту таймером.
но не нужно. никогда не стоит соглашаться с отсуплением от общепринятых правилАlex писал(а):Инклюдить .c можно, но
Никогда не говорите "никогда"ARV писал(а):никогда
это вы про это:Аlex писал(а):Я привёл пример ситуации, в которой не зазорно отступить от этих правил
?Аlex писал(а):Иногда полезно подключить определённый .c-файл, в зависимости от каких либо настроек