Страница 174 из 628

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

Добавлено: Чт апр 07, 2011 16:30:40
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 байт...

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

Добавлено: Чт апр 07, 2011 18:35:38
shurikss123
RC5 не работает стабилно с приемниками 33кгц поэтому и не удивительно

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

Добавлено: Чт апр 07, 2011 18:39:30
Wereww
shurikss123 писал(а):RC5 не работает стабилно с приемниками 33кгц поэтому и не удивительно
Этот приёмник на 36 кгц вроде :?

Да и так работает - хоть и на малом расстоянии...

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

Добавлено: Чт апр 07, 2011 20:43:57
shurikss123
Wereww писал(а):
shurikss123 писал(а):RC5 не работает стабилно с приемниками 33кгц поэтому и не удивительно
Этот приёмник на 36 кгц вроде :?

Да и так работает - хоть и на малом расстоянии...
в этомто прикол, только на малом и не понятно как (проходили тоже мучался с 33кгц :kill: ) взял TSOP1238 Все замечателно стало и растояние почти 8-10 метров. а вот ближе 10 см не работает. :(

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

Добавлено: Чт апр 07, 2011 20:55:22
Wereww
shurikss123 писал(а):
Wereww писал(а): Этот приёмник на 36 кгц вроде :?

Да и так работает - хоть и на малом расстоянии...
в этомто прикол, только на малом и не понятно как (проходили тоже мучался с 33кгц :kill: ) взял TSOP1238 Все замечателно стало и растояние почти 8-10 метров. а вот ближе 10 см не работает. :(
Спасибо, что поделились, тоесть вы советуете взять соп 1238 ? - кстате пультик филлипс :?

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

Добавлено: Пт апр 08, 2011 15:02:43
liv6125
помогите с фьюзами.
Выставите фьюзы так: CKSEL0,1,2,3 = 1, CKOPT = 0, SPIEN = 0, SUT1 = 0, SUT0 = 1
подскажите правильно ли я выставил fuse-биты? в программе uniprof поставил галочки где =1 и убрал галочки где = 0

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

Добавлено: Пт апр 08, 2011 16:50:04
shurikss123
Wereww писал(а):Спасибо, что поделились, тоесть вы советуете взять соп 1238 ? - кстате пультик филлипс :?
не совсем филипс использую мульти пульт
http://www.corpcentre.ru/shop/catalog/871/33007/
и там куча пультов заменить можно, но одно могу сказать точно не все пульты филипс работают с RC5

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

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

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

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

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

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
всё идеально заработало :oops: :lol:

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

Добавлено: Сб апр 09, 2011 08:33:32
liv6125
помогите с фьюзами.
Выставите фьюзы так: CKSEL0,1,2,3 = 1, CKOPT = 0, SPIEN = 0, SUT1 = 0, SUT0 = 1
подскажите правильно ли я выставил fuse-биты? в программе uniprof поставил галочки где =1 и убрал галочки где = 0 :o

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

Добавлено: Сб апр 09, 2011 09:25:35
DiGiCat
liv6125 писал(а):в программе uniprof поставил галочки где =1 и убрал галочки где = 0 :o
Да

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

Добавлено: Сб апр 09, 2011 09:28:51
zvukovik
подскажите, в чём проблема...
собрал дозиметр (но суть не в нём) на atmega8, мк считает импульсы с помощью входа внешнего тактирования таймера, на отладочной плате это работало, а сейчас как только приходит импульс, мк сбрасывается, причём независимо от того, импульс от гейгера или это я питанием во вход тыкаю, думал, что это могут быть помехи от трансформатора ВВ преобразователя, отключил его, не помогло, керамику по питанию насовал везде, где место было, заранее спасибо за помощь

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

Добавлено: Сб апр 09, 2011 09:30:33
Gudd-Head
zvukovik писал(а):подскажите, в чём проблема...
Может, в плате?

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

Добавлено: Сб апр 09, 2011 09:42:27
zvukovik
вот, выкладываю печатку, посмотрите, если не трудно

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

Добавлено: Сб апр 09, 2011 13:04:54
Wereww
Ребята подскажите схему управления нагрузкой 220V (планируется использовать симистор BTA 08-600B), более-менее безопасную и без оптопары :)

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

Добавлено: Сб апр 09, 2011 13:18:00
К@Т
Wereww писал(а):Ребята подскажите схему управления нагрузкой 220V (планируется использовать симистор BTA 08-600B), более-менее безопасную и без оптопары :)
Какой вопрос-такой ответ!
Изображение

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

Добавлено: Сб апр 09, 2011 13:21:29
Chettuser
А чем оптосимистор не устраивает? Гальваническая развязка.

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

Добавлено: Сб апр 09, 2011 22:00:26
aam
Всем привет! У меня такой вопрос: у ATmaga32 несколько ножек питания и земли. Все ножки земли я соединил полигоном под корпусом TQFP, а вот соединить вместе все 3 ноги цифрового питания как-то не выходит. Аналоговое питание естественно подключил согласно правилам с дросселем 100 мкГн и керамикой 1 мкФ. Обязательно ли соединять на плате все 3 ноги цифрового питания или достаточно подключить одну-две?

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

Добавлено: Сб апр 09, 2011 22:02:37
*Trigger*
К@Т писал(а):
Wereww писал(а):Ребята подскажите схему управления нагрузкой 220V (планируется использовать симистор BTA 08-600B), более-менее безопасную и без оптопары :)
Какой вопрос-такой ответ!
Картинки побольше нет??? :kill: :kill: :kill:

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

Добавлено: Сб апр 09, 2011 22:22:52
Av4arik
Если не хотите оптопары, возьмите реле, транзисторные ключи и питайте другим источником питания, от схемы