Четверг, 25.04.2024, 17:04
| RSS
[SEARCH_TITLE]
[SEARCH_FORM]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Архив - только для чтения
Форум » Мастерская » Микроконтроллеры » RC5 decoder - ATtiny2313
RC5 decoder - ATtiny2313
Krik99Дата: Вторник, 30.12.2008, 10:16 | Сообщение # 1








Зарегистрирован 30.12.2008
Группа: Новички
Сообщений: 4
Город: Одесская обл.
Статус: Offline
Всем привет! Ктонить делал на Тини2313 RC5 декодер, желательно на Си? Решил спросить у вас, так как мне кажется что RC5 декодер по тематике болие близкий к роботам. Пишу на Code Vision AVR. На Мега8 делал и всё работает, а вот на Тини2313 при переносе кода на него, ругается что надо увеличить Data Stack Size с 32 до 36. При отладке по Rs232 видно что при приёме команды с пульта МК начинает выдавать какуето ерунду или вообще зависает. Если недо могу выложить код под Мега8 или переделаный под Тини2313. За ранние спасибо!
 
DoniakДата: Вторник, 30.12.2008, 16:05 | Сообщение # 2








Язык программированя: CodeVisionAVR Си
Зарегистрирован 19.03.2008
Группа: Модераторы
Сообщений: 584
Город: Кривой Рог (Днепропетровск)
Статус: Offline
я неделал но хотелосьбы посмотреть как оно выглядит. Кинь сюда проэкт на тини 2313 если нетрудно.
 
Krik99Дата: Вторник, 30.12.2008, 18:10 | Сообщение # 3








Зарегистрирован 30.12.2008
Группа: Новички
Сообщений: 4
Город: Одесская обл.
Статус: Offline
Вот проект для Тини2313 отличается от Мега8 только названиями регистров таймера. Но на Мега8 работает, а на Тини2313 я так понимаю он зависает, и я подозревая что это из-за увиличения Data Stack Size с 32 до 36. Может кто подскажет как изминить прогу чтобы уложиться в 32?
Code
/*****************************************************
Chip type           : ATtiny2313
Clock frequency     : 8,000000 MHz
*****************************************************/

#include <tiny2313.h>   
#include <delay.h>
#include <stdio.h>

//************************************************************
//Переменные и функции RC5
//************************************************************
unsigned char cnt_bit = 0;              //счетчик принятых бит
unsigned char code [14];                //принятый код
unsigned char counter = 0;              //"тики" таймера

#define l_min    40                     //диапазон для "длинного" (long) интервала в посылке, в "тиках" таймера, 1,28..2,176мс   
#define l_max    68
#define s_min    22                     //диапазон для "короткого" (short) интервала в посылке, в "тиках" таймера, 0,704..1,088мс
#define s_max    34

bit state =  0;                    //флаг состояния линии приема
bit error = 0;                    //флаг ошибки

//переменные структуры посылки, всего 14 бит                    
unsigned char toggle = 0;                       //триггерный бит, инвертируется в посылке при нажатии кнопки, при удержании - не инв.!
unsigned char address = 0;                      //адрес устройства, 5 бит
unsigned char command = 0;                      //команда (данные), 6 бит      

void c_r_c(void){
   char i;
   for (i=0; i<14; i++) code[i]=0;   
}   

void c_tim(void){
   TCCR0A = 0x00;
   TCCR0B = 0x00;                   //останавливаем таймер
   TCNT0 = 0x00;                   //обнуляем таймер     
   cnt_bit = 0;                    //обнуляем счетчик принятых бит
}

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
          {
          counter = TCNT0;                        //сохраяем значение таймера-счетчика
          TCNT0 = 0x00;                           //обнуляем таймер
          error = 1;                    //поставили ошибку - потом сбросим в теле, если все ок
                   
          if (cnt_bit == 0){                       //старт посылки   
                  TCCR0A = 0x00;    
                  TCCR0B = 0x04;                           //запускаем таймер, частота 31250кГц (или надо править диапазоны тиков для интервалов)
                  code [cnt_bit] = !PIND.2;               //записываем бит кода, PIND.2 - входная нога, прерывание 0
                  cnt_bit++;                    //увеличиваем счетчик принятых бит
                  state = 1;                    //ставим флаг, т.к. была 1
                  }else{                    //в других случаях (не первое срабатывание прерывания)
                    
                          if ((counter>s_min) && (counter<s_max)){ //проверка короткого промежутка
                     if (state){                     //если была 1
                     state = 0;              //обнуляем состояние
                     error = 0;              //и ошибку, т.к. все корректно
                     } else {                   //если был 0
                     state = 1;                      //ставим флаг, т.к. теперь - 1
                     code[cnt_bit] = !PIND.2;        //записываем данные - состояние линии
                     cnt_bit++;                      //увеличиваем счетчик приема
                     error=0;                        //обнуляем ошибку, т.к. все корректно
                     };
                     };       
                       
                          if ((counter>l_min) && (counter<l_max)){ //проверка длинного промежутка
                     code[cnt_bit] = !PIND.2;        //записываем данные - состояние линии
                     cnt_bit++;                      //увеличиваем счетчик приема
                     error = 0;                      //обнуляем ошибку, т.к. все корректно
                     };
                      
                          if (error == 1){                         //если не попали ни в один из промежутков, то   
                     c_tim();
                     counter = 0;                    //обнуляем счетчик
                     c_r_c();                         //обнуляем массив принятого кода
                     };
                       
                          if (cnt_bit == 14){                      //если приняли все 14 бит
                     c_tim();
                     toggle = code[2];               //триггер-бит
                     //формируем переменные адреса и команды
                     address = (code[3] << 4)|(code[4] << 3)|(code[5] << 2)|(code[6] << 1)|code[7];                      
                     command = (code[8] << 5)|(code[9] << 4)|(code[10] << 3 )|(code[11] << 2)|(code[12] << 1)|code[13];       
                     c_r_c();   //обнуляем массив принятого кода
                     };
                          };                     
          }

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
          {
          c_tim();
          counter = 0;                    //обнуляем счетчик
          c_r_c();
          }
//************************************************************

void main(void)
{

// Port B initialization
PORTB=0x00;
DDRB=0x4D;

// Port D initialization
PORTD=0x04;
DDRD=0x00;

// Timer/Counter 0 initialization
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
GIMSK=0x40;
MCUCR=0x02;
EIFR=0x40;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x33;

          #asm ("sei")

           printf("Power_OK \n\r");      
             
while (1)
          {   
          printf("Address: %u             ", address);
          printf("Comand: %u", command);      
          printf("\n\r");   
     }
}
Прикрепления: main.c (6.3 Kb)
 
StefanДата: Воскресенье, 27.09.2009, 20:52 | Сообщение # 4








Язык программированя: Баском. Бейсик
Зарегистрирован 27.03.2009
Группа: Новички
Сообщений: 21
Город: Антрацит
Статус: Offline
Я делал ДУ на Attiny2313, всё работает, прошивку писал на Баскоме, если надо могу выложить.
 
SpaceДата: Воскресенье, 27.09.2009, 22:05 | Сообщение # 5








Зарегистрирован 25.12.2007
Группа: Администраторы
Сообщений: 1103
Статус: Offline
Во кошмар, то ли дело на баскоме. Кратко и понятно smile3
Code
Config Rc5 = Pind.2
Enable Interrupts
Dim Address As Byte , Command As Byte
   
Do
    Getrc5(address , Command)
    If Address <> 255 And Command <> 255 Then
       Command = Command And &B01111111
       Print Chr(12);
       Print "Address - " ; Address
       Print "Command - " ; Command;
    End If
Loop
yes3
 
Форум » Мастерская » Микроконтроллеры » RC5 decoder - ATtiny2313
  • Страница 1 из 1
  • 1
Поиск: