Добавлено after 28 minutes 24 seconds:
Стал колом и дальше не двигаюсь.
NStorm,Охотно верю, к Вам у меня кроме благодарности за содействие в изучении, нету никаких претензий. Сам понимаю ,что анекдот. Я уже поставил даже другую версию Протеуса 8.7 и в ней тоже лампочками не моргается. Надо сделать перерывчик и успокоится. А заодно прошить реальную тиньку.NStorm писал(а):olegue, всё-таки внимательно посмотрите, включая схему подключения. Чем у меня отличается от того, что у вас. У меня-то работает.
Код: Выделить всё
//#define F_CPU 1200000UL
#define LED PB2
#define BUTTON1 PB3 // PCINT3
#define BUTTON2 PB4 // PCINT4
#define BUTTON0 PB0 // КНОПКА НА INT0
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int s=500;
// Обработчик прерывания PCINT0
ISR(PCINT0_vect)
{
_delay_ms (50) ; // антидребезг (использовать задержки в прерываниях некошерно, но пока и так сойдёт)
if (PINB & (1<<BUTTON0))
{s=s+100;}
}
int main(void)
{
// Пины кнопок
DDRB &= ~((1<<BUTTON1)|(1<<BUTTON2) |(1<<BUTTON0)); // входы
PORTB |= (1<<BUTTON1)|(1<<BUTTON2) | (1<<BUTTON0); // подтянуты
// Пин светодиода
DDRB |= (1<<LED); // выход
PORTB &= ~(1<<LED); // выключен
// Настройка прерываний
GIMSK |=(1<<INT0);
// GIMSK |= (1<<PCIE); // Разрешаем внешние прерывания PCINT0.
PCMSK |= (1<<BUTTON1)|(1<<BUTTON2) | (1<<BUTTON0); // Разрешаем по маске прерывания на ногак кнопок (PCINT3, PCINT4)
sei(); // Разрешаем прерывания глобально: SREG |= (1<<SREG_I)
while (1)
{
PORTB ^= (1<<LED); _delay_ms(s);
}
}
Код: Выделить всё
while(1)
for (i=1;i<s;i++)
{
PORTB^=(1>>LED);
_delay_ms(100);
}Код: Выделить всё
if (PINB & (1<<BUTTON1)) // при нажатии -уменьшаяем частоту мигания
{s++;}
if (PINB&(1<<BUTTON2)) // увеличиваем частоту мигания
{if (s>0)
{
s++;
}
}Нельзя этой функции передавать переменные. Новый компилятор вообще ругнется и не соберет так:на _delay_ms(s) выдает ошибки. Чем ему не нравиться?
Код: Выделить всё
util/delay.h:187:2: error: __builtin_avr_delay_cycles expects a compile time integer constantКод: Выделить всё
void my_delay_ms(unsigned int n) {
while(n--) {
_delay_ms(1);
}
}
...
my_delay_ms(s);
Это наверное в CVAVR, там функция другая.но в Атмеге видел как подставляют s в delay_ms.
Код: Выделить всё
// #define F_CPU 1200000UL
#define LED PB2
#define BUTTON1 PB3 // PCINT3
#define BUTTON2 PB4 // PCINT4
#define BUTTON0 PB0 // КНОПКА НА INT0
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int s = 500;
// Обработчик прерывания PCINT0
ISR(PCINT0_vect) {
_delay_ms(50); // антидребезг (использовать задержки в прерываниях некошерно, но пока и так сойдёт)
if (PINB & (1 << BUTTON0)) {
s = s + 100;
}
}
void my_delay_ms(unsigned int n) {
while (n--) {
_delay_ms(1);
}
}
int main(void) {
// Пины кнопок
DDRB &= ~((1 << BUTTON1) | (1 << BUTTON2) | (1 << BUTTON0)); // входы
PORTB |= (1 << BUTTON1) | (1 << BUTTON2) | (1 << BUTTON0); // подтянуты
// Пин светодиода
DDRB |= (1 << LED); // выход
PORTB &= ~(1 << LED); // выключен
// Настройка прерываний
GIMSK |= (1 << INT0);
// GIMSK |= (1<<PCIE); // Разрешаем внешние прерывания PCINT0.
PCMSK |= (1 << BUTTON1) | (1 << BUTTON2) | (1 << BUTTON0); // Разрешаем по маске прерывания на ногак кнопок (PCINT3, PCINT4)
sei(); // Разрешаем прерывания глобально: SREG |= (1<<SREG_I)
while (1) {
PORTB ^= (1 << LED);
my_delay_ms(s);
}
}В общих чертах, что такое протокол?Можно ИК-протокол какой-нибудь за основу взять.
понятно, это описание и стандартизация пауз и длительностей импульсов. По крайней мере мне так показалось.NStorm писал(а):пример описания пожалуй самого распространенного протокола для ИК пультов.