реклама на сайте
подробности

 
 
> RC-5 протокол и ATmega8, Есть пуль RC-5 и контроллер ATmega8
Rom20
сообщение Aug 23 2011, 13:37
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Доброго времени суток форумчани! стоит задачка принимать команды с пульта RC-5 и обрабатывать их контроллером. Пересмотрел кучу статей по этой теме попробовал собрать несколько проектов и инета так ни чего и не заработала, уже неделю сижу парюсь, в итого только принимаю какую то ахинею и выкидываю ее в ком порт, вроде сам протокол изучи нормально как идет передача понимаю а что то не работает, вот кусок кода
ISR (INT0_vect)
{
uint8_t u;
TCCR0=(1<<CS02)|(1<<CS00);
TCNT0=0;
while(PIND&(1<<2))
{
}
u=TCNT0;
UDR=u+0x30;
}

генерирую прерывания по нарастающему фронту, а дальше пробую померить длительность каждого бита, по идеи при нажатии одной кнопки на пульте должен в ком порт получать минимум 14 символов, т.к протокол 14 бит, ну получаю всего один и то каждый раз разный. или может что ни так у меня с прерываниями прогнал программу в симуляторе AVRstudio и заметил что он из прерываний почему то не возвращаться а все время крутиться в них, при отладке в желез та же картина, где косяк в упор не вижу.
P.S плиз без троллинга!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rom20
сообщение Aug 28 2011, 06:29
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 10-10-08
Пользователь №: 40 823



Народ хелп плиз. Написал программу в симуляторе AVRstudio при шаговой отладке все хорошо принимает данные с пульта, а вот в железе начинаются проблемы в сом-порт гонит в основном одни "1". Использую следующий алгоритм. изначально нога контроллера притянута к +5в
1. Разрешаю прерывания по изменению уровня сигнал заведен на PD2
2. при первом прерывании (спаду) запускаю таймер
3. при появлении высокого логического уровня снова генерируется прерывание считываю значение таймера
4. Проверяю длину импульса
4а. Если импульс длинный то однозначно я нахожусь на середине бита и можно производить считывание, считываю значение порта ложу в переменную
4б Если импульс короткий проверяю где нахожусь: если на границе битов то ничего не считываю просто запоминаю что граница, если на середине бита то считываю значение порта ложу в перемененную.
Ниже привожу кусок программы приема и обработки сигнала, пробовал варьировать задержки при считывании значения порта ни помогло, с начало думал может помехи какие возникают.


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/signal.h>
volatile int v,r,p,u=0, oldp,gr;
uint16_t j,k,f,x,y1,y2,pult;
uint8_t c,a,e,q,m=0,m1;
ISR (INT0_vect)
{
r++;//переменная r служит для подсчета для того что бы узнать где находимся на середине или на границе при коротких импульсях
TCCR0=(1<<CS02);//запускаем таймер
p=TCNT0;//считываем заначение таймера
TCNT0=0;//
if(r==2)// если находимся на середине бита то запоминаем предыдущее значение таймера
{
oldp=p;
r=0;
}
}
//прерывание по приему USART
ISR (USART_RXC_vect)
{
v=UDR;
_delay_us(5);
UDR=v;
}
// инициализация настроек
void inic()
{

DDRC=0xFF;
DDRB=0xFF;
DDRB&=~(1<<0);
PORTB=0;
PORTB|=(1<<3);
//натсраиваем скорость 19200 бот/c
UBRRL=25;
UBRRH=0;
UCSRA=0;
// настраиваем приемник передатчик
UCSRB=(1<<RXEN) |(1<<TXEN)|(1<<RXCIE);
// 8 бит данных
UCSRC=(1<<UCSZ0) |(1<<UCSZ1)|(1<<URSEL);
MCUCR=(1<<ISC00);
GICR=(1<<INT0);
}
void main()
{
inic();
while(1)
{
sei();
while(1)
{
if ((p>0x18)&&(p<0x1F))// если интервал короткий
{
if(p==oldp)//проверяем где находимся на границе или на середине бита если на середине бита то gr=1
{
gr=1;
oldp=0;
}
if (((p>0x18)&&(p<0x1F))&&gr)// если интервал короткий и мы находимся на середине то можно считывать значение порта
{

gr=0;
p=0;
j=PIND&(1<<2);
_delay_us(50);
j=PIND&(1<<2);
if(j)
{
while(!(UCSRA&(1<<UDRE)))
{}
pult|=(1<<u);
UDR='1';
}
if(!j)
{
while(!(UCSRA&(1<<UDRE)))
{}
pult&=~(1<<u);
UDR='0';
}
u++;// стчик для складирования битов
}
p=0;

}
//динный импульс
if ((p>0x37) && (p<0x3B))// если импульс длинный то мы однозначно на середине считываем значение порта
{
r=0;
gr=0;
p=0;
j=PIND&(1<<2);
_delay_us(50);
j=PIND&(1<<2);
if(j)
{
while(!(UCSRA&(1<<UDRE)))
{}
UDR='1';
pult|=(1<<u);
}
if(!j)
{
while(!(UCSRA&(1<<UDRE)))
{}
pult&=~(1<<u);
UDR='0';
}
u++;
}
if(u==14)
{
u=0;
while(!(UCSRA&(1<<UDRE)))
{}
UDR='E';
}
}
}
}


Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Rom20   RC-5 протокол и ATmega8   Aug 23 2011, 13:37
- - Xenia   Цитата(Rom20 @ Aug 23 2011, 17:37) замети...   Aug 23 2011, 14:32
|- - Rom20   Цитата(Xenia @ Aug 23 2011, 17:32) 1) Пре...   Aug 24 2011, 00:00
- - haker_fox   1. Официальная документация от Atmel предписывает ...   Aug 24 2011, 00:55
|- - Rom20   Цитата(haker_fox @ Aug 24 2011, 04:55) Ну...   Aug 24 2011, 02:16
- - Genadi Zawidowski   приём rc5 и складывание в буфер.   Aug 24 2011, 09:26
|- - Xenia   Цитата(Genadi Zawidowski @ Aug 24 2011, 13...   Aug 24 2011, 09:32
||- - Genadi Zawidowski   Цитата(Xenia @ Aug 24 2011, 13:32) Жутког...   Aug 24 2011, 09:40
|- - Rom20   Цитата(Genadi Zawidowski @ Aug 24 2011, 13...   Aug 24 2011, 10:19
|- - ARV   Цитата(Rom20 @ Aug 24 2011, 14:19) за про...   Aug 24 2011, 12:32
- - Genadi Zawidowski   Так из многих "нагугленных" эта заработа...   Aug 24 2011, 10:28
- - Allregia   Мне в свое время, помогли эти три ссылки: http://a...   Aug 24 2011, 20:31
- - -SANYCH-   Цитата//прерывание по приему USART ISR (USART_RXC_...   Aug 28 2011, 11:09
|- - Rom20   Цитата(-SANYCH- @ Aug 28 2011, 14...   Aug 28 2011, 11:17
- - -SANYCH-   Цитатаэто без разницы как работает и та и так конс...   Aug 28 2011, 11:46


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016