Не дайте сойти с ума! Скажите, в какое место стены мне удариться головой, чтобы TSOP'а заработала?
Схема прилагается.
ИК-диод обозван IRD.
Все конденсаторы - керамика.
Транзистор между ТСОПой и МК выкидывать пробовал.
Вот программа:
Импульсы по 16 в пачке (игрался). Паузы между импульсами есть.
Скважность - примерно писят процентов.
- Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
static const uint8_t IR_LED = PB1; // Will use PWM.
static const uint8_t TSOP = PB3;
static const uint8_t STATUS_LED = PA2;
static const uint8_t PULSE_BUNGLE_SIZE = 15; // Counts from Zero.
static const uint8_t PULSE_INTERBUNGLE_PAUSE = 30; // In pulses. Counts from Zero.
// 64000000/16/(TOP_VALUE + 1) ~= XXx kHz.
//static const uint8_t TOP_VALUE = 132; // 30 kHz
//static const uint8_t TOP_VALUE = 120; // 33 kHz
//static const uint8_t TOP_VALUE = 110; // 36 kHz
static const uint8_t TOP_VALUE = 104; // 38 kHz
//static const uint8_t TOP_VALUE = 99; // 40 kHz
//static const uint8_t TOP_VALUE = 70; // 56 kHz
// 104/50 ~= 50 % duty. Good.
static const uint8_t PULSE_DUTY_VAL = 50; // OCR1A value.
void initIO(){
DDRA = (1 << STATUS_LED);
DDRB = (1 << IR_LED);
PORTB |= (1 << TSOP); // Eliminate Z state...
}
void initPWM(){
// Do Async operation.
PLLCSR = (1 << PLLE);
loop_until_bit_is_set(PLLCSR, PLOCK);
PLLCSR |= (1 << PCKE);
TCCR1A = (1 << PWM1A)|(1 << COM1A1)|(0 << COM1A0); // See table 35 on page 77
// PCK/16
// See table 34 on page 74
TCCR1B = (0 << CS13)|(1 << CS12)|(0 << CS11)|(1 << CS10);
OCR1C= TOP_VALUE;
TIMSK |= (1<<TOIE1); //Enable Timer1 OVF interrupt
}
static uint8_t curPulse = 0;
static uint8_t isPause = 0;
volatile static uint8_t mayMeasure = 0;
ISR(TIMER1_OVF1_vect){
curPulse++;
if(isPause){
mayMeasure = 1;
if(curPulse > PULSE_INTERBUNGLE_PAUSE){
curPulse = 0;
isPause = 0;
OCR1A = PULSE_DUTY_VAL;
}
}else{
mayMeasure = 0;
if(curPulse > PULSE_BUNGLE_SIZE){
curPulse = 0;
isPause = 1;
OCR1A = 0;
}
}
}
void main()
{
initIO();
initPWM();
PORTA = 0x00;
OCR1A = PULSE_DUTY_VAL;
sei();
while(1)
{
_delay_ms(1);
// Wait for a meaningful result...
if(mayMeasure){
// Check results...
if(PINB & (1 << TSOP)){
PORTA &= ~(1 << STATUS_LED);
}else{
PORTA |= (1 << STATUS_LED);
_delay_ms(500);
}
}
} // while(1)
}
Выдираю TSOP'у с платы - светодиод D3 радостно загорается.
Втыкаю - молчит как партизанин. Специально в программе "защелочку" поставил, чтобы не проморгать кратковременный импульс низкого уровня - ничего.
На всех возможных частотах попробовал, в надежде на то что мне ТСОПы на другую частоту продали. ....
Следующим шагом, чую, будет пентамация методом разбивания молотком имеющихся у меня 5-и ТСОП, чтобы посмотреть не закорочен ли там вход на выход намертво...
Если конечно, кто-нибуть свежих идей по тому как заставить ЭТО заработать не предложит...