Вс мар 24, 2013 17:42:19
Вс мар 24, 2013 18:49:27
Вс мар 24, 2013 22:19:51
Вс мар 24, 2013 22:46:25
Alkarax писал(а):А на счет незначащих нулей и представления числа внутри функции?
Вт мар 26, 2013 18:54:00
Чт май 09, 2013 09:30:16
Пн май 12, 2014 20:30:13
define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "uart.h"
#include "uart.c"
void Timer_init(void)
{
TCCR1A = (0<<COM1A1) | (0<<COM1A0)| (0<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (0<<WGM11) | (0<<WGM10);
TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
}
#define Timer_ON TCCR1B = 1<<CS11
#define Timer_OFF TCCR1B = 0
bool IR_Rx_Active = false;
char _c_bit = 0;
unsigned long _data = 0;
unsigned long data = 0;
unsigned int _TCNT1 = 0;
char _buffer[12]; char temp = 0;
ISR(INT0_vect)
{
_TCNT1 = TCNT1;
TCNT1 = 0;
if (_TCNT1 == 0)
{
Timer_ON;
}
if (_TCNT1 > 13000)
{
IR_Rx_Active = true;
}
if (IR_Rx_Active)
{
if (_TCNT1 > 2000)
{
_data = 1;
}
else
{
_data = 0;
}
if (_c_bit == 32)
{
IR_Rx_Active = false;
Timer_OFF;
TCNT1 = 0;
data = _data;
_data = 0;
_c_bit = 0;
}
else
{
_data <<= 1; // сдвигаем код влево
}
_c_bit++;
}
_TCNT1 = 0;
}
void MCU_init(void)
{
UART_init();
//Timer_init();
DDRD &= ~1<<2;
PORTD |= 1<<2;
MCUCR |= (1<<ISC01)|(1<<ISC00);
GICR |= (1<<INT0);
sei();
}
int main(void)
{
MCU_init();
char _buffer[12];
while(1) // раз в 10 секунд отправляем по UART
{
ultoa(data, _buffer, 10);
UART_WriteString(_buffer);
UART_WriteChar(10);
for (int c=0; c<12; c++)
{
_buffer[c]=0;
}
_delay_ms(10000);
data = 0;
}
}
Вт май 13, 2014 09:05:39
А что не устраивает?Artem148 писал(а):Здравствуйте товарищи! подскажите что делаю не правильно
Вт май 13, 2014 09:35:01
Вт май 13, 2014 10:12:07
Вт май 13, 2014 18:35:05
Я ваще ничего не понял .....Artem148 писал(а):Приходит "1" или "0" вместо здорового числа (4 байта - адрес, инв адрес, команда, инв. команда), то есть "1" или "0" мы не получим (адрес - 1, команда - 1; получим - 00000001 11111110 00000001 11111110 - то есть далеко не 1)
Вт май 13, 2014 19:09:47
Приходит "1" или "0" вместо здорового числа (4 байта - адрес, инв адрес, команда, инв. команда; то есть "1" или "0" мы не получим в любом случае. Пример: адрес - 0х01, команда - 0х01; получим - 00000001 11111110 00000001 11111110 = 33423870, а это есть далеко не 1)
Вт май 13, 2014 23:42:26
Дело в том, что инверсные значения данных и адреса, необходимы только для контроля достоверности принятых данных... После проверки их нужно отбросить...Artem148 писал(а):Это я к тому, что из-за инверсии адреса и команды мы не можем получить "1" или "0"
uint32_t InputData; //принятые 32 бита IR данных
uint16_t OutData; //конвертируем в 16 бит
OutData = (uint16_t)(InputData >> 8UL) & 0x00ff; //скопировали значение данных
OutData |= (uint16_t)(InputData >> 16UL) & 0xff00; //добавили значение адреса
Ср май 14, 2014 14:57:37
Ср май 14, 2014 16:49:57
Ну наконец то по русски объяснили .....Artem148 писал(а):В не зависимости от кнопки или пулта приходит или 0х0000 или 0х0001.
Ср май 14, 2014 18:00:14
Сб окт 10, 2015 18:00:54
shads писал(а):Ну наконец то по русски объяснили .....Artem148 писал(а):В не зависимости от кнопки или пулта приходит или 0х0000 или 0х0001.
А почему бы вам не заюзать мой вариант, который тут обсуждался?...
..
Пн окт 12, 2015 22:35:40
shads писал(а):Ну вот, домучил, обработку IR NEC, вот что получилось:Спойлер
- Код:
//***************************************************************************************************************************
//БИБЛИОТЕКА ОБРАБОТКИ СИГНАЛА ИК ПУЛЬТА ДИСТАНЦИОННОГО УПРАВЛЕНИЯ СТАНДАРТА NEC
//
Пока что для одной частоты (8000000) и константы заданы жестко. Потом надо будет докумекать автоматический рассчет для разных частот.
Сб окт 17, 2015 19:29:39
Может прерывания надо разрешить в главном цикле?...Gosha_006 писал(а):Не работает, блин
int main()
{
IrNecInit ();
while (1)
if (IrNecDataCheck())
{
PORTC = IrNecDevNumGet();
_delay_ms(500);
PORTC = IrNecCommandGet();
_delay_ms(500);
}
}
Вс окт 18, 2015 10:15:46