nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 17 Dec 2018 00:04



Reply to topic  [ 105 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7  Next
Генератор тактовых импульсов "Электроника МК-85" 
Author Message
Banned
User avatar

Joined: 29 Jun 2018 09:48
Posts: 419
Reply with quote
piotr433 wrote:
Мне заинтересовало, как микросхема Т36ВГ1 обрабатывает нештатное количество битов. Результаты проверки:
1. используются 8 последних битов адреса, все предыдущие игнорируются
2. используются 5 начальных битов данных, все следующие игнорируются

мы снова может выяснить, что функционал Т36ВГ1 может отличаться от типа применяемого процессора или даты выпуска...

ок. когда отлаживал код, то видел, что 5-ть бит добивается 3-мя нулями до 8-ми.
но, но не всегда.
когда мне захотелось зафильтровать всё, что больше 5-ти бит if (data <= 0x1F), то выяснилось, что программа TEST может писать data > 0x1F - подробности не выяснял.

piotr433 wrote:
Так что вполне допустимо наличие 8 битов данных.

Piotr, ну я понимаю, что человек без логического анализатора - не может вызывать доверия в принципе.

допустим. О_О

но как же тогда происходит событие прерывания SPI? - которое просто не может происходить при получении менее 8-ми бит.
см. цитаты обработчика прерывания viewtopic.php?f=95&t=18901&p=146854#p146736

как может 5-ть бит второго байта протолкнуть 8-мь бит первого байта во второй корпус регистра?
см. схему https://klapautsiy.github.io/The-displa ... CD1602.png
иначе, 13-ть бит в в двух регистрах сдвига оказались бы размазанными по адресному пространству 8-бит регистров. но 2х8-бит оказываются каждый в своём корпусе ровно по адресам Q0-Q7.

_________________
https://klapautsiy.github.io/The-displa ... ika-MK-85/ или приобрету ИЖВ1-12/5х7
гугл, печеньки и пин SS \o \o \o


02 Sep 2018 13:32
Profile
Banned
User avatar

Joined: 29 Jun 2018 09:48
Posts: 419
Reply with quote
пока отложил попытки заставить летать SPI на Arduino ATmega16.
будет настроение - попробую более современный контроллер ATmega328 или 88.
причины могут быть ровно две - древний конроллер, Arduino(где всё медленно и печально).

на настоящий момент полностью работоспособной считается версия с аппаратными регистрами сдвига.

_________________
https://klapautsiy.github.io/The-displa ... ika-MK-85/ или приобрету ИЖВ1-12/5х7
гугл, печеньки и пин SS \o \o \o


02 Sep 2018 13:48
Profile
Novelist
User avatar

Joined: 14 Aug 2018 15:30
Posts: 37
Location: Szczecin, Польша
Reply with quote
Quote:
мы снова может выяснить, что функционал Т36ВГ1 может отличаться от типа применяемого процессора или даты выпуска...

Я испытал 3 микросхемы:
Т36ВГ1-2 9004 ОП
Т36ВГ1-2 9105
КА1013ВГ2 9305
Результаты совпадают.

Quote:
Piotr, ну я понимаю, что человек без логического анализатора - не может вызывать доверия в принципе.

Не обижайся, друг :)

Кстати, можно применить атмегу как логический анализатор:
1. ожидаем спада сигнала SYNC
2. в цикле читаем состояние PINB и записываем во внутреннее ОЗУ
3. передаём содержимое внутреннего ОЗУ через последовательный порт


02 Sep 2018 13:58
Profile WWW
Banned
User avatar

Joined: 29 Jun 2018 09:48
Posts: 419
Reply with quote
piotr433 wrote:
Кстати, можно применить атмегу как логический анализатор:
1. ожидаем спада сигнала SYNC
2. в цикле читаем состояние PINB и записываем во внутреннее ОЗУ
3. передаём содержимое внутреннего ОЗУ через последовательный порт

Piotr, не обижайтесь и вы - первый вариант контроллера дисплея просто останавливал процессор МК-85, пока что-то происходило в обработчике прерывания.
т.е. я имел возможность корректно остановить процессор в любом интересном мне месте и посмотреть уровни сигналов где угодно и чем угодно.
недостатком такого подхода было то, что в режиме турбо я получал лишний такт вместо немедленной остановки.
эта проблема и родила эту тему.

поэтому - можно, но уже не нужно.

_________________
https://klapautsiy.github.io/The-displa ... ika-MK-85/ или приобрету ИЖВ1-12/5х7
гугл, печеньки и пин SS \o \o \o


02 Sep 2018 14:09
Profile
Novelist
User avatar

Joined: 14 Aug 2018 15:30
Posts: 37
Location: Szczecin, Польша
Reply with quote
OK, я не настаиваю :)


02 Sep 2018 14:33
Profile WWW
Banned
User avatar

Joined: 29 Jun 2018 09:48
Posts: 419
Reply with quote
ок.
обработчик прерывания версии с регистрами:
Code:
ISR(INT1_vect) { // SYNC изменился с "0" в "1".
address = ~PINA - 0x80;
data    = ~PINB;
if (address <= 0xE8 - 0x80) {LCD_MK85[address] = data; print_screen = 1;}
}

два 8-мь бит регистра объединены в регистр 16-ть бит.
16-ть бит сыпятся в 16-ть бит регистр.
если бы битов было не ровно 16-ть, то эта конструкция
Code:
address = ~PINA - 0x80;
data    = ~PINB;

не работала бы правильно.


Attachments:
CD4094-cd4094.gif
CD4094-cd4094.gif [ 4.06 KiB | Viewed 1593 times ]

_________________
https://klapautsiy.github.io/The-displa ... ika-MK-85/ или приобрету ИЖВ1-12/5х7
гугл, печеньки и пин SS \o \o \o
02 Sep 2018 14:44
Profile
Novelist
User avatar

Joined: 14 Aug 2018 15:30
Posts: 37
Location: Szczecin, Польша
Reply with quote
Да, убедительно. Спасибо!


03 Sep 2018 00:20
Profile WWW
Banned
User avatar

Joined: 29 Jun 2018 09:48
Posts: 419
Reply with quote
таки, нашёл причину нестабильного приёма Arduino байтов по SPI .

что происходило:
внешне выглядело как конфликт прерываний/обработчиков прерываний.
их в коде - два.
но, как бы там ни было - один из двух становился бы в очередь и обработчик прерывания исполнялся бы чуть позже, но не настолько поздно, чем были бы приняты очередные 8-мь бит по SPI.
два обработчика прерывания в коде... но - НЕТ.
в Arduino существует ещё один, с временем исполнения достаточным, что бы быть причиной сбоев приёма данных по SPI:
Code:
ISR(TIMER0_OVF_vect)

Code:
TIMSK &= ~(1<<TOIE0); // disable timer0 overflow interrupt

отвалятся плюшки millis() и прочего системного времени, но кому оно в этом проекте нужно?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
потестирую и опубликую позже.
всем участникам, большое спасибо - все свободны.

_________________
https://klapautsiy.github.io/The-displa ... ika-MK-85/ или приобрету ИЖВ1-12/5х7
гугл, печеньки и пин SS \o \o \o


03 Sep 2018 12:59
Profile
Banned
User avatar

Joined: 29 Jun 2018 09:48
Posts: 419
Reply with quote
отключил от прерываний и остановил все таймеры в Arduino ATmega16:
Code:
TIMSK  = 0; // disable all timers overflow interrupt
TCCR0  = 0; // stop timer0
TCCR2  = 0; // stop timer2
TCCR1A = 0; // disable timer1
TCCR1B = 0; // stop    timer1


пока, тестовый полёт нормальный.

*кто в курсе, откуда ещё можно ожидать несанкционированной активности от Ардуино - просьба поделиться мудростью.

_________________
https://klapautsiy.github.io/The-displa ... ika-MK-85/ или приобрету ИЖВ1-12/5х7
гугл, печеньки и пин SS \o \o \o


05 Sep 2018 22:38
Profile
Banned
User avatar

Joined: 29 Jun 2018 09:48
Posts: 419
Reply with quote
ок. контроллер дисплея на интерфейсе SPI взлетел и работает, но с этим вариантом протокола(1-й байт - 8-мь передаваемых бит, 2-й байт - меньше 8-ми передаваемых бит):
Image
будет несовместим.

версия на регистрах сдвига совместима с любым количеством принимаемых бит.

итого:
две версии контроллера дисплея.
1. чуть более сложная аппаратно, но совместимая со всеми известными вариантами протокола.
2. упрощённая и заточенная исключительно на приём 2 по 8-мь бит.

_________________
https://klapautsiy.github.io/The-displa ... ika-MK-85/ или приобрету ИЖВ1-12/5х7
гугл, печеньки и пин SS \o \o \o


Last edited by Клапауций on 07 Sep 2018 10:02, edited 1 time in total.



06 Sep 2018 17:09
Profile
Doomed

Joined: 01 Oct 2007 11:30
Posts: 358
Location: Ukraine
Reply with quote
Вроде SPI не секретный протокол. Это чего за скрин (эту хрень какая программа сделала)? И в красном кружке? Ведь ничего не понятно.


По смыслу в красном кружке - что-то лишнее, но тем ни мение это не обнуляет выше сказазонное.

_________________
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru


07 Sep 2018 08:08
Profile
Banned
User avatar

Joined: 29 Jun 2018 09:48
Posts: 419
Reply with quote
Alekcandr wrote:
Вроде SPI не секретный протокол. Это чего за скрин (эту хрень какая программа сделала)? И в красном кружке? Ведь ничего не понятно.


По смыслу в красном кружке - что-то лишнее, но тем ни мение это не обнуляет выше сказазонное.

если тему читать не с конца, а внимательно отсюда viewtopic.php?f=95&t=18901&start=45#p146702 то, всё станет понятно.

*заменил на картинко без пометок. "программа" называется: "логический анализатор подсматривает как в МК-85 процессор передаёт пиксели контроллеру дисплея".

_________________
https://klapautsiy.github.io/The-displa ... ika-MK-85/ или приобрету ИЖВ1-12/5х7
гугл, печеньки и пин SS \o \o \o


Last edited by Клапауций on 07 Sep 2018 10:09, edited 2 times in total.



07 Sep 2018 09:47
Profile
Doomed

Joined: 01 Oct 2007 11:30
Posts: 358
Location: Ukraine
Reply with quote
Как тут вникнуться. Соседи с ремонтом отбили мне стенку с плиткой в ванной. Тут ходя бы свое доделать. ппц. :rotate:

_________________
Эмулятор OrionEXT:
http://www.orion-ext.narod.ru


07 Sep 2018 10:06
Profile
Banned
User avatar

Joined: 29 Jun 2018 09:48
Posts: 419
Reply with quote
Alekcandr wrote:
Как тут вникнуться. Соседи с ремонтом отбили мне стенку с плиткой в ванной. Тут ходя бы свое доделать. ппц. :rotate:

фиг с ним с той плиткой - соседей не выбирают.
корову подои и спать.

_________________
https://klapautsiy.github.io/The-displa ... ika-MK-85/ или приобрету ИЖВ1-12/5х7
гугл, печеньки и пин SS \o \o \o


07 Sep 2018 10:47
Profile
Novelist
User avatar

Joined: 14 Aug 2018 15:30
Posts: 37
Location: Szczecin, Польша
Reply with quote
У меня возникла идея, как передать по SPI меньше 8-ми битов. После обнаружения нарастающего фронта на линии SYNC микропроцессор посылает на вход SCK дополнительные 3 импульса. Ниже приведена схема подключения и код обработки прерываний. Проверено на ATmega16 @ 16МГц, работает отлично.
Attachment:
sch.png
sch.png [ 759 Bytes | Viewed 1378 times ]

Code:
#define OUT_SHIFT   3

ISR (SPI_STC_vect)
{
  address = ~SPDR - 0x80;
  SPCR &= ~(1<<SPIE);
}

/* called at the rising edge of the SYNC signal */
ISR (INT1_vect)
{
  if (address < 0x61)
  {
/* apply three SCK pulses */
    DDRB |= (1<<OUT_SHIFT);
    PORTB |= (1<<OUT_SHIFT);
    PORTB &= ~(1<<OUT_SHIFT);
    PORTB |= (1<<OUT_SHIFT);
    PORTB &= ~(1<<OUT_SHIFT);
    PORTB |= (1<<OUT_SHIFT);
    PORTB &= ~(1<<OUT_SHIFT);
    DDRB &= ~(1<<OUT_SHIFT);
    if ((SPSR & (1<<SPIF)) != 0)
    {
      buffer[address] = ~SPDR;
    }
  }
  SPCR &= ~(1<<SPE);
  address = 0xFF;   /* invalid address */
  SPCR |= (1<<SPE);
  SPCR |= (1<<SPIE);
}


Last edited by piotr433 on 07 Sep 2018 14:49, edited 1 time in total.



07 Sep 2018 13:31
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 105 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7  Next

Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.