Перейти к содержанию
    

Чем или как создать управление микросхемой Lc7821

Дамы и господа, нахожусь на гране отчаяния...

Поставил себе задачу на "старость" глядя наладить общение  "мозга" древнего ресивера HK AVR21 с данным сабжем (lc7821), в подчинении которого он и был когда-то, но история умалчивает о местонахождении всей внутрянки , в наличии лишь корпус и "морда", на которой и находится проц с органами управления, а также самопальная аналоговая часть...

Цель конкретно: наладить общение процессора ресивера с Атмегой8а, которая вместе с релюшками и будет выступать в качестве коммутатора lc7821. Да, я знаю, что проще заказать сабж с алиЭкспресс и просто накинуть проводки, но так скучно и неинтересно! :) Суть проблемы: я не силён в программировании, но написал какую-никакую программку на Си (в ассемблере NULL) (код ниже), смоделировал в протеусе сигнал, который выдаёт проц ресивера , прочитав заранее через китайский Логический Анализатор (фото прилогаю) - в симуляции всё работает. НО! В железе не работает! :( Точнее работает но рамдомно, считай 1 раз из 10. Есть подозрение, что моя Атмега не успевает обработать сигнал с проца, но учитывая что код также работает подебильному (пока подругому не научился :) ) , то возможно проблема на поверхности, но я её просто не замечаю 
 

Скрытый текст



#include <mega8.h>
#include <delay.h>

//Первый пин порта С - это СЕ , второй пин порта С - это DATA, прерывание по фронту int0 - это clk
//

// Declare your global variables here
unsigned char indataS=0; //service data
unsigned char indataI=0; //info data
unsigned char count4bit=0;
unsigned char count8bit=0;
unsigned char buf=0b00000000;
unsigned char finish=1;

//постучать релюшками при запуске
void test()
{
buf++;
PORTD&=0;
switch(buf)
{
case 1:
PORTD|=0x10;
break;
case 2:
PORTD|=0x20;
break;
case 3:
PORTD|=0x40;
break;
case 4:
PORTD|=0x80;
break;
case 5:
buf=0;
break;
}
delay_ms(250);
}

//чтение адреса микросхемы
void service()
{
if (count4bit>=5) //защита от сбоев
{
count4bit=0;
indataS = 0b00000000;
count8bit=0;
indataI = 0b00000000;
buf=0;
PORTD&=0;
}
count4bit++;

if (PINC &= 0x02) buf=1;
else buf=0;

switch(count4bit)
{
case 1:
//indataS = 0b00000000;
indataS |= (0b00000001 & buf);
break;
case 2:
buf<<=1;
indataS |= (0b00000010 & buf);
break;
case 3:
buf<<=2;
indataS |= (0b00000100 & buf);
break;
case 4:
buf<<=3;
indataS |= (0b00001000 & buf);
count4bit=0;
buf=0;
break;
}

//PORTB&=0;
//PORTB|=indataS;
}

//чтение номера канала 
void info()
{
if (count8bit>=9) //защита от сбоев
{
count4bit=0;
indataS = 0b00000000;
count8bit=0;
indataI = 0b00000000;
buf=0;
PORTD&=0;
}
count8bit++;

if (PINC &= 0x02) buf=1;
else buf=0;

switch(count8bit)
{
case 1:
//indataI = 0b00000000;
indataI |= (0b00000001 & buf);
break;
case 2:
buf<<=1;
indataI |= (0b00000010 & buf);
break;
case 3:
buf<<=2;
indataI |= (0b00000100 & buf);
break;
case 4:
buf<<=3;
indataI |= (0b00001000 & buf);
break;
case 5:
buf<<=4;
indataI |= (0b00010000 & buf);
break;
case 6:
buf<<=5;
indataI |= (0b00100000 & buf);
break;
case 7:
buf<<=6;
indataI |= (0b01000000 & buf);
break;
case 8:
buf<<=7;
indataI |= (0b10000000 & buf);
count8bit=0;
buf=0;
finish=1;
break;
}
//PORTB&=0;
//PORTB|=indataI;
}

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
if (!(PINC &= 0x01)) service();
if (PINC &= 0x01) info();
//if (!(PINC &= 0x02)) PORTB&=0;  //test 
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (1<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

test();
test();
test();
test();
test();

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
GICR|=(0<<INT1) | (1<<INT0);
MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (1<<ISC00);
GIFR=(0<<INTF1) | (1<<INTF0);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

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

while (1)
      {
      // Place your code here      
     
      
      if(finish)
      {
      if(indataS==0b00001010) 
      {
      PORTD&=0;
      delay_ms(500);
      PORTD|=0x01;
      if(indataI==0b00010001) //фоно
      {
      PORTD|=0x80;
      }
      if(indataI==0b00010010) //cd
      {
      PORTD|=0x40;
      }
      if(indataI==0b00010100) //aux
      {
      PORTD|=0x20;
      }
      if(indataI==0b00110000) //radio
      {
      PORTD|=0x10;
      }
      }
      finish=0;
      indataS &= 0b00000000;
      indataI &= 0b00000000;
      }
      
      }
      }


 

с проца.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23.10.2021 в 13:35, ErikPRJ сказал:

Цель конкретно: наладить общение процессора ресивера с Атмегой8а, которая вместе с релюшками и будет выступать в качестве коммутатора lc7821.

Проще всего это делается через SPI-интерфейс, способный сформировать командную посылку для LC7821 в нужном ей формате. Правда SPI посылает 8 бит (байт), а LC7821 принимает только 4 бита (тетраду), но это не страшно - важно лишь, чтобы последние передаваемые 4 бита были нужными, а лишние проскочат мимо (во входной буфер LC7821 помещаются только 4 последних бита, вытесняя из него все предшествующие).

В вашем коде мне разбираться бессмысленно, поскольку схему присоединения LC7821 к ATmega8 вы не публикуете. Но подозреваю, что ваша программа не работает из-за того, что вы лишь добавляете новые биты командой |=, но нигде их не стираете. Предположу, что вместо операции |= где-то должны быть обычные операции присваивания =.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...