Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 129
Зарегистрирован: Пн окт 04, 2010 17:58:31

Сообщение Wereww »

Здравствуйте. Опять спотыкнулся об avr ) Помогите и направьте в нужную сторону: немогу разобраться с RC5 - много уделил времени интернету - но есть вопросы с прерываниями и CVAVR - купил пультик для TV - переключает каналы и регулирует громкость (работает на RC5) - в наличии tiny2313 + IR датчик (17х TSOP'ов в магазине небыло - купил SM3374) - датчик реагирует только вблизи пульта, пытаюсь вывести данные по UART - не получается - через putchar выводит команду - но если пользовать printf - все обламывается - так как пользую UART + FT232R - вижу что сигнал даже не доходит (диод на переходнике не моргает) - программный код взял готовый - только переделал чтобы немного разобраться - но никак... :(

Вот код:

Код: Выделить всё

/*****************************************************
Chip type           : ATtiny2313
Clock frequency     : 8,000000 MHz
Data Stack size     : 64
*****************************************************/

#include <tiny2313.h>
#include <stdio.h>
#include <delay.h>
#include <string.h>                              
 
//Временные пределы
#define Tmin 40 //длинный промежуток
#define Tmax 68
#define TminK 22 //короткий промежуток
#define TmaxK 34

unsigned char sct_bit = 0;      //Счетчик битов RC5
unsigned char RC5_buffer [14];  //Буффер RC5
bit centre =  0;                //Флаг центра 
bit not_korr = 0;               //Флаг попадания в промежутки
unsigned char Timer = 0;        //число в счетчике таймера
unsigned char trigger = 0;      //переменная тригера
unsigned int device = 0;        //переменная адреса ПДУ
unsigned char command = 0;      //переменная для команды

void rc5_cl_buf(void){            //очищаем буффер
  char i = 0;      
  for (i=0; i<14; i++){ RC5_buffer [i] = 0;  }
}   

void rc5_ti_stop(void){           //остановка таймера
   GIMSK|=0x00;
   TCCR0B = 0x00;
   TCNT0 = 0;
   sct_bit = 0;
} 

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
Timer = TCNT0; //запоминаем значение счетчика   
TCNT0 = 0;     //обнуляем счетчик
not_korr = 1;                         
if(sct_bit==0){
                  TCCR0B = 0x04; //запускаем таймер  (31.250 KHz)
                  RC5_buffer [sct_bit] = !PIND.2;//записываем в эл.массива
                  sct_bit++;            //+1 к счётчику принятых битов
                  centre = 1;           
        }else{
                  if ((Timer>TminK)&&(Timer<TmaxK)){   // проверка короткого промежутка
                                                  if (centre) {
                                                              centre = 0;
                                                              not_korr = 0; 
                                                  }else{
                                                              centre = 1;
                                                              RC5_buffer [sct_bit] = !PIND.2;
                                                              sct_bit++;
                                                              not_korr=0;
                                                  };
                  }; 
                  if ((Timer>Tmin)&&(Timer<Tmax)){ // проверка длинного промежутка
                                                  RC5_buffer [sct_bit] = !PIND.2;
                                                  sct_bit++;
                                                  not_korr = 0;
                  };                               
                  if (not_korr == 1) {             // если не попали ни в один из промежутков то  
                                       rc5_ti_stop();   //останавливаем таймер
                                       rc5_cl_buf();    //очищаем буффер
                  };
                  if (sct_bit == 14){        // если бит последний то 
                    rc5_ti_stop();   //останавливаем таймер
                     
                    trigger = RC5_buffer [2];  //формируем переменную тригера 
                   
                    device = (RC5_buffer [3] << 4)|(RC5_buffer [4] << 3)|(RC5_buffer [5] << 2)|(RC5_buffer [6] << 1)|RC5_buffer [7];                                    //формируем адрес ПДУ                
                    command = (RC5_buffer [8] << 5)|(RC5_buffer [9] << 4)|(RC5_buffer [10] << 3 )|(RC5_buffer [11] << 2)|(RC5_buffer [12] << 1)|RC5_buffer [13];        //формируем команду
                    
                    //выводим данные на дисплей   
                    //digit_out[0]=command%10;   //перевод для 1 цифры
                    //command=command/10;                //подготовка 
                    //digit_out[1]=command%10;   //перевод для 2 цифры 
                  
                    putchar(command);                                                  
                    //printf("Device id=%i, code=%u\n\r", device, command);
                    
                    EIFR=0x40;   // сбрасываем флаг прерывания по входу INT0  
                    
                       };                                                                         
        };    
}


// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{   
rc5_ti_stop();        //останавливаем таймер
rc5_cl_buf();        //очищаем буффер
GIMSK|=0x40; //разрешаем прерывания по входу
EIFR=0x40;  //сбрасываем флаг прерывания (если произошло)
}

void main(void)
{

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Port A initialization
PORTA=0x00;
DDRA=0x00;
// Port B initialization
PORTB=0x00;
DDRB=0x00;
// Port D initialization
PORTD=0x00;
DDRD=0x00;

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

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x40;
MCUCR=0x01;
EIFR=0x40;

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

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;   //0x18;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x33;

// Global enable interrupts
#asm("sei")

while (1)
      {  
      };
}
Пробовал выводить в UART до и после сброса флага-прерывания через printf - ноль эмоций ( подскажите пожалуйста - как быть ?..
Сразу предупрежу - не стал грешить на это, но после компиляции в первый раз - компилятор сказал, что Data Stack Size 40 байт - а выставлено 32 байта - я поправил в настройках на 40 байт...
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Сообщение shurikss123 »

RC5 не работает стабилно с приемниками 33кгц поэтому и не удивительно
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 129
Зарегистрирован: Пн окт 04, 2010 17:58:31

Сообщение Wereww »

shurikss123 писал(а):RC5 не работает стабилно с приемниками 33кгц поэтому и не удивительно
Этот приёмник на 36 кгц вроде :?

Да и так работает - хоть и на малом расстоянии...
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Сообщение shurikss123 »

Wereww писал(а):
shurikss123 писал(а):RC5 не работает стабилно с приемниками 33кгц поэтому и не удивительно
Этот приёмник на 36 кгц вроде :?

Да и так работает - хоть и на малом расстоянии...
в этомто прикол, только на малом и не понятно как (проходили тоже мучался с 33кгц :kill: ) взял TSOP1238 Все замечателно стало и растояние почти 8-10 метров. а вот ближе 10 см не работает. :(
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 129
Зарегистрирован: Пн окт 04, 2010 17:58:31

Сообщение Wereww »

shurikss123 писал(а):
Wereww писал(а): Этот приёмник на 36 кгц вроде :?

Да и так работает - хоть и на малом расстоянии...
в этомто прикол, только на малом и не понятно как (проходили тоже мучался с 33кгц :kill: ) взял TSOP1238 Все замечателно стало и растояние почти 8-10 метров. а вот ближе 10 см не работает. :(
Спасибо, что поделились, тоесть вы советуете взять соп 1238 ? - кстате пультик филлипс :?
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Сб май 02, 2009 22:25:22
Откуда: Орловская область г. Ливны

Сообщение liv6125 »

помогите с фьюзами.
Выставите фьюзы так: CKSEL0,1,2,3 = 1, CKOPT = 0, SPIEN = 0, SUT1 = 0, SUT0 = 1
подскажите правильно ли я выставил fuse-биты? в программе uniprof поставил галочки где =1 и убрал галочки где = 0
Контактная информация:
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 271
Зарегистрирован: Пн окт 25, 2010 20:47:04
Откуда: Казахстан, Астана

Сообщение shurikss123 »

Wereww писал(а):Спасибо, что поделились, тоесть вы советуете взять соп 1238 ? - кстате пультик филлипс :?
не совсем филипс использую мульти пульт
http://www.corpcentre.ru/shop/catalog/871/33007/
и там куча пультов заменить можно, но одно могу сказать точно не все пульты филипс работают с RC5
Изображение
Мастер на все руки, кручу, кручу, кручу и матерюсь
Повелитель паяльной станции, лома, и пинцета!!!
Встал на лапы
Аватара пользователя
Сообщения: 129
Зарегистрирован: Пн окт 04, 2010 17:58:31

Сообщение Wereww »

shurikss123 писал(а):
Wereww писал(а):Спасибо, что поделились, тоесть вы советуете взять соп 1238 ? - кстате пультик филлипс :?
не совсем филипс использую мульти пульт
http://www.corpcentre.ru/shop/catalog/871/33007/
и там куча пультов заменить можно, но одно могу сказать точно не все пульты филипс работают с RC5
Всеравно не могу понять одного, датчик реагирует на пульт даже из другого угла комнаты (падение напряжение примерно до 4,5 вольта) - срабатывает прерывание и тд - также непонятно - если он реагирует столь далеко - возможно дело не в частоте ? ведь таймер настроен аж на 31,250 кГц ?..единственная проблема - он не выводит значения по UART в самом прерывании...
Встал на лапы
Аватара пользователя
Сообщения: 129
Зарегистрирован: Пн окт 04, 2010 17:58:31

Сообщение Wereww »

Прошу прощения, не обратил внимание на галочку в понипроге - CKDIV8, после добавления следующих строчек:

Код: Выделить всё

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
всё идеально заработало :oops: :lol:
Встал на лапы
Аватара пользователя
Сообщения: 115
Зарегистрирован: Сб май 02, 2009 22:25:22
Откуда: Орловская область г. Ливны

Сообщение liv6125 »

помогите с фьюзами.
Выставите фьюзы так: CKSEL0,1,2,3 = 1, CKOPT = 0, SPIEN = 0, SUT1 = 0, SUT0 = 1
подскажите правильно ли я выставил fuse-биты? в программе uniprof поставил галочки где =1 и убрал галочки где = 0 :o
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4793
Зарегистрирован: Пт июл 11, 2008 09:42:35
Откуда: Made in USSR

Сообщение DiGiCat »

liv6125 писал(а):в программе uniprof поставил галочки где =1 и убрал галочки где = 0 :o
Да
scio me nihil scire...
_______________________

Изображение <= Жалобная кнопка в правом нижнем углу... )
Встал на лапы
Аватара пользователя
Сообщения: 140
Зарегистрирован: Вт авг 03, 2010 15:21:20
Откуда: Екатеринбург

Сообщение zvukovik »

подскажите, в чём проблема...
собрал дозиметр (но суть не в нём) на atmega8, мк считает импульсы с помощью входа внешнего тактирования таймера, на отладочной плате это работало, а сейчас как только приходит импульс, мк сбрасывается, причём независимо от того, импульс от гейгера или это я питанием во вход тыкаю, думал, что это могут быть помехи от трансформатора ВВ преобразователя, отключил его, не помогло, керамику по питанию насовал везде, где место было, заранее спасибо за помощь
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

zvukovik писал(а):подскажите, в чём проблема...
Может, в плате?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Встал на лапы
Аватара пользователя
Сообщения: 140
Зарегистрирован: Вт авг 03, 2010 15:21:20
Откуда: Екатеринбург

Сообщение zvukovik »

вот, выкладываю печатку, посмотрите, если не трудно
Вложения
дозиметр.lay
(59.23 КБ) 309 скачиваний
Встал на лапы
Аватара пользователя
Сообщения: 129
Зарегистрирован: Пн окт 04, 2010 17:58:31

Сообщение Wereww »

Ребята подскажите схему управления нагрузкой 220V (планируется использовать симистор BTA 08-600B), более-менее безопасную и без оптопары :)
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1573
Зарегистрирован: Сб окт 09, 2010 12:33:48
Откуда: Незалежная

Сообщение К@Т »

Wereww писал(а):Ребята подскажите схему управления нагрузкой 220V (планируется использовать симистор BTA 08-600B), более-менее безопасную и без оптопары :)
Какой вопрос-такой ответ!
Изображение
У кошки 4 ноги и хвост-плюс,минус,вход,выход,а хвост-земля.....Надо переходить с китайской бурды на канифоль.......[url=http://infobar.hsdn.org/][img]http://static.hsdn.org/infobar/350x60.gif[/img][/url]
Chettuser

Сообщение Chettuser »

А чем оптосимистор не устраивает? Гальваническая развязка.
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Всем привет! У меня такой вопрос: у ATmaga32 несколько ножек питания и земли. Все ножки земли я соединил полигоном под корпусом TQFP, а вот соединить вместе все 3 ноги цифрового питания как-то не выходит. Аналоговое питание естественно подключил согласно правилам с дросселем 100 мкГн и керамикой 1 мкФ. Обязательно ли соединять на плате все 3 ноги цифрового питания или достаточно подключить одну-две?
Друг Кота
Аватара пользователя
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Сообщение *Trigger* »

К@Т писал(а):
Wereww писал(а):Ребята подскажите схему управления нагрузкой 220V (планируется использовать симистор BTA 08-600B), более-менее безопасную и без оптопары :)
Какой вопрос-такой ответ!
Картинки побольше нет??? :kill: :kill: :kill:
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1954
Зарегистрирован: Чт янв 20, 2011 16:47:18
Откуда: Старый Оскол

Сообщение Av4arik »

Если не хотите оптопары, возьмите реле, транзисторные ключи и питайте другим источником питания, от схемы
Быстро, Качественно, Недорого.
Выбрать можно только 2 варианта.
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»