odessit 0 25 сентября, 2018 Опубликовано 25 сентября, 2018 · Жалоба Ау-у!!! Подпольщики!!! Чем дело-то закончилось? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ErikPRJ 0 23 октября, 2021 Опубликовано 23 октября, 2021 · Жалоба Дамы и господа, нахожусь на гране отчаяния... Поставил себе задачу на "старость" глядя наладить общение "мозга" древнего ресивера 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; } } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 13 ноября, 2021 Опубликовано 13 ноября, 2021 · Жалоба 23.10.2021 в 13:35, ErikPRJ сказал: Цель конкретно: наладить общение процессора ресивера с Атмегой8а, которая вместе с релюшками и будет выступать в качестве коммутатора lc7821. Проще всего это делается через SPI-интерфейс, способный сформировать командную посылку для LC7821 в нужном ей формате. Правда SPI посылает 8 бит (байт), а LC7821 принимает только 4 бита (тетраду), но это не страшно - важно лишь, чтобы последние передаваемые 4 бита были нужными, а лишние проскочат мимо (во входной буфер LC7821 помещаются только 4 последних бита, вытесняя из него все предшествующие). В вашем коде мне разбираться бессмысленно, поскольку схему присоединения LC7821 к ATmega8 вы не публикуете. Но подозреваю, что ваша программа не работает из-за того, что вы лишь добавляете новые биты командой |=, но нигде их не стираете. Предположу, что вместо операции |= где-то должны быть обычные операции присваивания =. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться