ZXNet эхоконференция «code.zx»


тема: ну...



от: Григорьев Валерий
кому: All
дата: 31 Oct 2005
Hello, All Kir> Zhavoronkov Sergejj -- 115200 delal. Ja ogranichilsja na urovne Kir> 38400. Вот здесь хотелось бы пояснений, видимо в таком методе допускался высокий уровень ошибок (или, что более вероятно, это была скорость передачи, а анализ переданных данных не осуществлялся сразу, а только потом, после передачи), потому что 3500000/115200 = 30 тактов на один бит (не байт ведь?), при том что минимальная команда чтения порта 12 тактов. Тот алгоритм который я выше предлагал можно тоже "слегка" разогнать, но не на столько... P.S. Под пояснениями я предполагаю конкретный алгоритм

от: Kirill Frolov
кому: Григорьев Валерий
дата: 02 Nov 2005
Hемедленно нажми на RESET, Григорьев Валерий! On Mon, 31 Oct 05 17:35:56 +0300, Григорьев Валерий wrote: ГВ> Hello, All Kir>> Zhavoronkov Sergejj -- 115200 delal. Ja ogranichilsja na urovne Kir>> 38400. ГВ> Вот здесь хотелось бы пояснений, видимо в таком методе допускался высокий ГВ> уровень ошибок (или, что более вероятно, это была скорость передачи, а ГВ> анализ переданных данных не осуществлялся сразу, а только потом, после ГВ> передачи), потому что 3500000/115200 = 30 тактов на один бит (не байт ГВ> ведь?), при том что минимальная команда чтения порта 12 тактов. Тот ГВ> алгоритм который я выше предлагал можно тоже "слегка" разогнать, но не на ГВ> столько... http://www.google.com/groups group:fido7.zx.spectrum Newsgroups: fido7.zx.spectrum From: Kirill Frolov X-Comment-To: Andrew V. Miheev Subject: Re: 32bit SIMM'ы Date: Sat, 27 Sep 2003 05:47:27 +0400 Hемедленно нажми на RESET, Andrew V. Miheev! On Fri, 26 Sep 03 11:16:01 +0400, Andrew V. Miheev wrote: >>>> AVM> Связь с модемом/другой машиной. >>>> 1. программно AVM>>> С какой скоростью? Это только отдельные буквы передавать, но не как не AVM>>> данные в десятки килобайт. >> У меня 38400. Модератор утверждает, что 115200. Я считаю, что это уже >> на грани фантастики, ненадёжно. AVM> Сам писал или что-то готовое использовал? Идею взял у создателей ZX-TCP. AVM> Где можно посмортреть реализацию? Из моего письма: === cut here === Вот у меня на метке RXWAIT ловится передний фронт старт-бита. Момент нужно определить достаточно точно, иначе к концу передачи байта накопится ошибка в последних битах (там нужно выдержать ~5%, точно не помню). Период квантования сигнала 20 тактов = 5.7мкс, в то время как период передачи бита на скорости 115200 будет всего 8.6мкс. Меньше 20-и тактов сделать нельзя уже (одна команда IN занимает 11 тактов). То есть получается, что на 3.5Mhz Z80 в принципе не способен с достаточной точностью поймать передний фронт старт-бита, а значит и провести битовую синхронизацию. Ошибка получается в те самые 5.7мкс, а если к концу байта поскладывать все погрешности получится полная ерунда вместо принятого байта. Код передатчика тривиальный, комментировать не буду. Сырец (кусок драйвера) рассчитан на скорость 38400 бит/сек: ;-------------------------------------- ; RS232 EMULATOR ZX-LINK ; ; порт передатчика (это #1ffd на скопионе) TXPORT EQU #CFF7 ; максимальный размер буфера приёмника в байтах RXMAX EQU 270 ; инициализация драйвера ZXL_INI LD A,1 JR ZXL_CTL ; отключение драйвера ZXL_OFF XOR A ; установка сигнала DCD ZXL_CTL ;LD (ZXL_DCD),A AND #01 RLCA RLCA LD (TXMASK),A IN A,(#1F) RLCA RLCA RLCA AND #01 RET ; LINE SCAN возврващает BC=SIZE D=SPEED CY=NOTHING (стандарт драйвера MMD2.20) ; ожидание байтов от писюка заданное время LSCAN DI PUSH IX PUSH IY LD HL,RXMAX LD DE,RXBYTE PUSH DE LD IX,(M_BUFF) LD IY,TXMASK LD BC,TXPORT LD A,(TXMASK) OR #20 OUT (C),A ; установка CTS для писюка -- разрешение передачи RXNEXT LD D,#9F ; TIME 0x9f+0x100 циклов RXWAIT IN A,(#FE) RLA RET C IN A,(#FE) ; 25..34 ~40 RLA RET C IN A,(#FE) RLA RET C IN A,(#FE) ; здесь происходит ожидание переднего RLA ; фронта стартового бита RET C IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C DEC D JP NZ,RXWAIT ; +14 IN A,(#FE) RLA RET C LD A,(TXMASK) ; тут таймаут истекает -- сброс CTS для ПЦ LD E,A ; +17 ; и ожидание времени передачи "последнего" байта IN A,(#FE) ; из буфера передатчика в ПЦ RLA RET C OUT (C),E ; +12 IN A,(#FE) RLA RET C LD D,#7 ; +7 IN A,(#FE) RLA RET C RXWAIT1 IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C IN A,(#FE) RLA RET C DEC D JP NZ,RXWAIT1 ; в течении заданного времени байтов от писюка не поступило RXEND POP BC EX DE,HL LD HL,RXMAX OR A SBC HL,DE POP IY POP IX JR NZ,RXOK LD BC,#0101 XOR A INC A SCF RET ; успешное завершение (что-то принято) RXOK LD D,LINKSPEED LD B,H LD C,L XOR A INC A RET ; обнаружен передний фрон старт-бита! RXBYTE IN A,(#FE) ; проверка в середине (примерно) RLA ; битового интервала JR C,RXBYTE1 ; есть -> приём байта DEC SP DEC SP ; нет -> ложное срабатывание JP RXWAIT RXBYTE1 JR $+2 JR $+2 JR $+2 JR $+2 NOP IN A,(#FE) ; B0 ; принимается первый бит RLA RR E DEC HL LD A,H OR L CP 1 SBC A,A CPL AND #20 OR (IY) OUT (C), A ; тут отключается CTS при переполнении буфера IN A,(#FE) ; B1 RLA RR E LD BC,RXBYTE PUSH BC LD BC,TXPORT JR $+2 JR $+2 JR $+2 IN A,(#FE) ; B2 RLA RR E JR $+2 JR $+2 JR $+2 JR $+2 JR $+2 NOP NOP IN A,(#FE) ; B3 RLA RR E JR $+2 JR $+2 JR $+2 JR $+2 JR $+2 NOP NOP IN A,(#FE) ; B4 RLA RR E JR $+2 JR $+2 JR $+2 JR $+2 JR $+2 NOP NOP IN A,(#FE) ; B5 RLA RR E JR $+2 JR $+2 JR $+2 JR $+2 JR $+2 NOP NOP IN A,(#FE) ; B6 RLA RR E JR $+2 JR $+2 JR $+2 JR $+2 JR $+2 NOP NOP IN A,(#FE) ; B7 RLA RR E JR $+2 JR $+2 JR $+2 JR $+2 JR $+2 NOP NOP IN A,(#FE) ; B STOP ; последний стоп-бит RLA JR C,RXERR ; если стоп-бит не 0 -> ошибка LD A,E CPL LD (IX),A INC IX JP RXNEXT ; приём следующего байта (ожидание старт-бита) ; произошла ошибка (сбой синхронизации) в приёмнике RXERR LD A,(TXMASK) OUT (C),A ; отключение CTS -- запрет передачи для ПЦ JP RXEND ; возврат с индикацией ошибки ; SEND BLOCK IN MDMBUFF BC=SIZE LTRANS DI PUSH IX LD E,C LD D,B LD IX,(M_BUFF) LD BC,TXPORT TXBYTE LD A,(TXMASK) OR #08 OUT (C),A LD A,(IX) CPL LD L,A LD H,8 JR $+2 LD A,0 TXBIT RR L SBC A,A AND #08 OR 0 TXMASK EQU $-1 OUT (C),A JP $+3 JP $+3 JP $+3 LD A,0 DEC H JR NZ,TXBIT JR $+2 LD A,0 LD A,(TXMASK) OUT (C),A JR $+2 JR $+2 JR $+2 INC IX DEC DE LD A,D OR E JR NZ,TXBYTE LD B,4 DJNZ $ POP IX RET К сожалению тут есть одна ошибка себя никак не проявляющая при правильной работе ПЦ-шного COM-порта но потенциально очень опасная (как всегда переполнение буфера). Ошибка там заключается в том, что после заполнения приёмного буфера спектрум сбрасывает CTS чтобы писюк прекратил передачу, после этого спектрум принимает последний байт (сигнал CTS блокирует передачу следующего байта, но текущий уже начал передаваться). Только вот в процессе приёма последнего байта спектрум принимает никак не один байт, а сколько дадут. Больше одного обычно писюк не даёт, но если будет давать то спектрум будет принимать до победного конца. В данном случае критерием конца передачи для спектрума служит длинный стоп-бит, то есть пауза в передаче в несколько битовых интервалов. Я этот баг обязательно исправлю, сейчас просто уже лень... === cut here === А это из письма модератора, где у него 115200: === cut here=== KF>>> HЕВОЗМОЖHО. Пpиёмник RS232 пpогpаммный без туpбо-pежима только на KF>>> 38400бит/сек. стабильно pаботает. Больше быстpодействие KF>>> пpоцессоpа не позволяет в пpоцедуpе синхpоницации по стаpт-биту KF>>> -- синхpонизация недостаточно точная, появляются ошибки. SZ>> "HЕВОЗМОЖHО" ... еще и большими буквами :). А у меня pаботает, стpанно. SZ>> Загpузка всех 48к памяти длится пpиблизительно секунд 5-6, пpичем только SZ>> половина вpемени ( пpи очень гpубой пpикидке ) идет на собственно SZ>> пеpедачу байта. SZ>> "Hикогда не говоpи никогда." У меня свидетели есть, что это SZ>> pаботает :). KF> Код пpиёмника на Z80 пpиведи! Пожалуйста : ( в скобках pастактовка, частота 3.5 Мгц ) in A,(C) ; ждем стаpт-бит (12) jp P,*-2 (10) ld A,(0) ; задеpжка (13) in A,(C) ; очеpедной бит (12) rla rr L ; пpинимаемый байт (8) inc DE ( или dec DE, чеpез pаз ) (6) ... повтоpяется 8 pаз с чеpедованием inc dec nop nop nop in A,(C) ; стоп-бит jp P,... ; нет ошибки ошибка: ... Код pаботает из ПЗУ. В том смысле, что из "быстpой" памяти. KF> Вот у меня на метке RXWAIT ловится пеpедний фpонт стаpт-бита. KF> Момент нужно опpеделить достаточно точно, иначе к концу пеpедачи байта KF> накопится ошибка в последних битах (там нужно выдеpжать ~5%, точно не KF> помню). Пеpиод квантования сигнала 20 тактов = 5.7мкс, в то вpемя как KF> пеpиод пеpедачи бита на скоpости 115200 будет всего 8.6мкс. Меньше 20-и KF> тактов сделать нельзя уже (одна команда IN занимает 11 тактов). У меня 26 тактов на бит. Один такт пpи 3.5 Мгц pавен 0.2857 мксек. 0.2857 * 26 = 7.4282 мксек , у меня вот так получилось. KF> То есть получается, что KF> на 3.5Mhz Z80 в пpинципе не способен с достаточной точностью поймать KF> пеpедний фpонт стаpт-бита, а значит и пpовести битовую синхpонизацию. KF> Ошибка получается в те самые 5.7мкс, а если к концу байта поскладывать все KF> погpешности получится полная еpунда вместо пpинятого байта. Почему-то pаботает. И ошибок нет. Интеpесно, почему ? :) === cut here === Я считаю, что 115200 это уже на той грани, где сегодня и на этой машине работает, а завтра и на другой -- нeизвестно. AVM>> А что еще он сможет делать в момент приема-передачи? Hичего? Hу и зачем AVM>> он такой нужен? >> Он ещё и передавать в момент приёма не может. Так порт-же >> асинхронный, никаких проблем. Для блокировки приёма в момент передачи >> есть CTS. AVM> Где? Расскажи подробнее про железо и софт. Что где? Порт, полноценный в писюке или модеме. Другой неполноценный в спектруме. Для нормальной работы одного полноценного достаточно. Hеполноценный порт спектруме может вести приём или передачу строго в определённый момент времени, а в остальное время он блокирует передачу в писюке (модеме) сигналом CTS. Два спектрума связать так может быть сложней -- они должны будут работать синхронно, один в передаче, другой в приёме. Hо в Interface-1 это работало, там целая сеть спектрумов так была организована. Софт, для связи с писюком, я использовал MMD (Macro Modem) на спектруме и его совместимый аналог для писюка. MMD -- это программа для модемной связи спектрума (модемы свои, не писишные, с писишными не совместимые). Туда-сюда передавались файлы и можно было давать команды для писюка со спектрума и наоборот. Можно было линухом управлять со спектрума. >> Вот я и говорю -- программно проще оказывается. Хотя, для модема >> лучше 580ВВ51 (можно одновременно буковки в терминале отрисовывать). AVM> Для модема лучше родной Z80SIO. Hе лучше. Он и программируется нестандартным/непривычным образом, и его нужно где-то взять ещё. Программно лучше 16550A подходит, но его тоже неоткуда взять, проще сразу уж писишную "мультикарту" прикрутить.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Мысли - Macros.
Sketches among the Ruins of my Mind - Для нaчaлa o рeaкции нaрoдa нa пeрвый выпycк Eрecи. Нe cкaжy, чтo былo mнoгo oтзывoв, mнe дaжe пришлo в гoлoвy mыcль, чтo нaрoдy тaкaя гaзeтa нaхрeн нe нyжнa...
Ретро - 40 лучших процедур: Составление списка переменных.
X-Files - Воздействие НЛО на технику.
Хуй тебе - Чапай-разъебай.

В этот день...   8 мая