OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 28.03.2024, 18:57

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 67 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5  Další
Autor Zpráva
PříspěvekNapsal: 06.11.2019, 19:46 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 898
Has thanked: 51 times
Been thanked: 230 times
Este prijem dat, tam bude limit 57k6
Napisal som to z hlavy, takze mozno tam bude nejaka chybka, ale princip bude zrejmy.
Je to bez hw riadenia toku.

M1
Kód:
; --------------------------------------------
; prijem jedneho bajtu po seriovej linke
; rychlostou 57600 Bd, sirka bitu je 61T
; --------------------------------------------
R57k6:
;               DI
                LD      BC, port        ; in port
                DEC     IX              ; zniz ukazatel, bude zvyseny pocas cakania
; kontrola, ci uz nezacal prenos
RXD0:           IN      A, (C)          ; nacitaj stav port
                RLCA                    ; do CY
                JP      NC, LINE_ERROR  ; reportuj chybu
; caka sa na start bit
RXD1:           IN      A, (C)          ; nacitaj stav portu    12T
                RLCA                    ; do CY                 4T
                JP      C, RXD1         ; opakuj do startbitu   10T (spolu 26T)
; zacal start bit, pocka sa na bit 0
; dlzka cakania je zvolena tak, aby bit 0 bol niekde vo svojej polovici
; od hrany startbitu uplynulo najmenej 15T, najviac 41T, berieme priemer 28T
; treba este cakat 1.5 x 61T - 28T = 63T (z toho 11T na dalsiu instrukciu IN)
                LD      A, (IX+0)       ; cakanie               19T
                LD      A, R            ; cakanie               9T
                LD      A, 00h          ; a este cakanie        7T
                INC     IX              ; uprav ukazatel        10T
                LD      H, 8            ; cita sa 8 bitov       7T (spolu 52T)
; teraz je bit 0 niekde v polovici, mozme citat 8 krat s odstupom 61T
RXD2:           IN      A, (C)          ; nacitaj port          12T
                RLCA                    ; A.7 nesie data, do CY 4T
                RLC     L               ; buduj bajt v L        8T
                LD      A, 00h          ; cakanie               21T
                LD      A, 00h
                LD      A, 00h
                DEC     H               ; pocitadlo             4T
                JR      NZ, RXD2        ; citaj dalsie bity     12/7T (spolu 61T)
; konecne je cely bajt nacitany, treba ho len ulozit
                LD      (IX+00), L      ; uloz bajt             19T
;
                DEC     DE              ; zniz pocitadlo        6T
                LD      A, D            ; vsetky data prijate?  4T
                OR      E               ; skontroluj            4T
                JR      NZ, RXD0        ; cakaj na dalsi bajt   12T (spolu 45T)
; na ulozenie staci 1 stop bit, este treba 11T na dalsie nacitanie portu v RXD0
;
; prenos uspesny, koniec
;               EI
                RET



Nahoru
 Profil  
 
PříspěvekNapsal: 06.11.2019, 23:06 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Martin1 píše:
Napisal som to z hlavy, takze mozno tam bude nejaka chybka...
Kód:
                RLC     L               ; buduj bajt v L        8T   

Jednu som našiel, treba použiť inštrukciu RL.

A ešte mi to nesedí s poradím vysielaných bitov (0 7 6 5 4 3 2 1).
Tam bude asi tiež chybka.


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 00:05 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2062
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 323 times
To čakanie na startbit nemá timeout? Čo keď sa niečo pokazí, vstup bude stále log.1, a program teda ostane zacyklený?

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 01:25 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2331
Has thanked: 303 times
Been thanked: 637 times
-> danhard: opravím, nopy jsou přehlednější

-> Martin1: 115200bps fakt funguje, sice jsem musel opravit rotaci na RRC L a předrotovat 4x vpravo, protože začínáme LSB a končíme MSB, ale funguje to. Při přenosu sekvence mi pauza, resp. trvání stop bitů vychází asi na 3.1 bitu, to vůbec není špatné.

Analyzérem vychází log. 1 okolo 9.5us a log. 0 okolo 7.9us, ale nakonec trvání celého bytu je docela ok.

-> PotPalo: Jasně, nějaký BREAK by měl být možný, v RS232 ROM to je vyřešené... dostanu se k tomu časem.

Ostatní budu zkoušet později. Teď už je pozdě a nedostanu se k tomu dřív než v pátek večer, možná.

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 10:46 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
zxcygnus píše:
Martin1 píše:
zxcygnus píše:
Můžu to použít ve větším článku o ZX RS232 na svém webu? S uvedením autora pochopitelně, jen bych to okomentoval (takty ke každé instrukci), barevné zvýraznění syntaxe, proměřím a vyzkouším na šedé +2 a DG192k atd...
Ak myslis moje, tak jasne.
jj, myslím, resp. oboje i Busyho, ozve-li se.
Samozrejme, mozes pouzit aj vsetko odo mna :)

Pre uplnost este pridavam rutinku na prijem jedneho bajtu 57600 Bd aj s testom parity.
Nastavenie seriaku: com:57600,e,8,2
Kód:
73     807a f3         bytget di                       57600 Bd
74     807b                                            Prijatie jedneho bajtu    (c) Busy soft 17.03.1996
75     807b                                            Vystup: CY=1 ok
76     807b 015f09            ld   bc,#095f                    ak ok tak A=prijaty bajt
77     807e ed70       tstwww in   (hl),(c)            cakanie na
78     8080 fa7e80            jp   m,tstwww            zaciatocnu     Dlzka
79     8083                                            hranu startu   impulzu: 61.57 T
80     8083 00                nop
81     8084 00                nop
82     8085 00                nop
83     8086 00                nop
84     8087                                            4-28
85     8087             
86     8087 c38a80     rotbit jp   $+3                 w //39
87     808a c38d80            jp   $+3                 w
88     808d 0e55              ld   c,#55               w 27
89     808f             
90     808f 87                add  a,a                 /
91     8090 cb1b              rr   e
92     8092 db5f              in   a,(#5f)
93     8094 10f1              djnz rotbit              \35 => 62-35=27
94     8096 e29a80            jp   po,$+4
95     8099 2f                cpl
96     809a 87                add  a,a
97     809b 7b                ld   a,e
98     809c c9                ret
Pre detekciu zaciatku start bitu pouzivam trik kde instrukcia IN r,(C) nielen nacita bajt z portu, ale zaroven podla tohto bajtu nastavi priznaky. Takze staci uz len podmieneny skok a takto s presnostou 22T viem kedy zacal startbit. Dalo by sa tym zvladnut aj 115200 Bd ale to je uz dost na hranici (startbit trva cca 31T).


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 10:48 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 898
Has thanked: 51 times
Been thanked: 230 times
zxcygnus píše:
-> Martin1: 115200bps fakt funguje, sice jsem musel opravit rotaci na RRC L a předrotovat 4x vpravo, protože začínáme LSB a končíme MSB, ale funguje to. Při přenosu sekvence mi pauza, resp. trvání stop bitů vychází asi na 3.1 bitu, to vůbec není špatné.


Tam by si mohol pouzit Busyho sympaticku konstrukciu, kde netreba nic predrotovavat, automaticky robí z CF bud FFh alebo 00h, co sa dalej vymaskuje na potrebny bit A.3


Kód:
                RRC     L               ; 8T
                SBC     A, A            ; 4T
                OR      11110111b       ; 7T
                OUT     (C)             ; 12T (spolu 31T)



Stop bit by si mohol dost pod 3

Kód:
SENDBLOCK:      LD      A, (HL)         ; 7T
                EXX                     ; 4T
                ; tu je rutina na odvysielanie 1 byte
                EXX                     ; 4T
                INC     HL              ; 6T
                DEC     BC              ; 6T
                LD      A, B            ; 4T
                OR      C               ; 6T
                JP      NZ, SENDBLOCK   ; 10T (spolu 48T)
; treba pripocitat este 30T na pripravu na zaciatku


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 11:17 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 898
Has thanked: 51 times
Been thanked: 230 times
Busy píše:
Pre detekciu zaciatku start bitu pouzivam trik kde instrukcia IN r,(C) nielen nacita bajt z portu, ale zaroven podla tohto bajtu nastavi priznaky.


Ale to sa vztahuje len na MSB, nie? Cize musim mat na to spravny hw (co v tomto pripade sedi).
M.


Naposledy upravil Martin1 dne 07.11.2019, 11:21, celkově upraveno 1

Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 11:21 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 898
Has thanked: 51 times
Been thanked: 230 times
PotPalo píše:
To čakanie na startbit nemá timeout? Čo keď sa niečo pokazí, vstup bude stále log.1, a program teda ostane zacyklený?


Mas pravdu, nema, lebo je tam tazke dostat timeout counter pri tak malo cykloch. Pri nizsich rychlostiach timer pouzivam, hlavne ako detekciu konca prenosu dat.
M1


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 11:41 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Martin1 píše:
Busy píše:
Pre detekciu zaciatku start bitu pouzivam trik kde instrukcia IN r,(C) nielen nacita bajt z portu, ale zaroven podla tohto bajtu nastavi priznaky.
Ale to sa vztahuje len na MSB, nie? Cize musim mat na to spravny hw (co v tomto pripade sedi).
Zalezi na tom aky priznak pouzivas na test. Najvyssi siedmy bit ma vyhodu, ze sa priamo kopiruje do znamienka, takze jeho test moze byt nezavisly od stavu ostatnych bitov. Ale pokial je stav ostatnych bitov nejak presne definovany (napr. v pripade 8255 su styri spodne vystupne a na zvysnych troch hornych mozu byt pull-up odpory) tak sa da pouzit aj parita. Pokial su vsetky ostatne bity nulove, da sa pouzit zero flag.
Martin1 píše:
PotPalo píše:
To čakanie na startbit nemá timeout? Čo keď sa niečo pokazí, vstup bude stále log.1, a program teda ostane zacyklený?
Mas pravdu, nema, lebo je tam tazke dostat timeout counter pri tak malo cykloch. Pri nizsich rychlostiach timer pouzivam, hlavne ako detekciu konca prenosu dat.
Ja som to riesil tak, ze na PeCedle (s ktorym som mal ZX seriovo prepojene) som mal kratucku utilitku (zopar bajtov v asembleri) ktora po seriaku poslala jeden bajt. Kod na ZX sa tym padom dostal dalej az k testu breaku.

Ale da sa to riesit napriklad aj nejakym tlacidlom ktore na RxD vnuti nulovu uroven. Toto riesenie som pouzil pri pripajani externeho kazetaku k +2. Port #FE v load rutinke som prepisal na #3F (port B na 8255) takze signal sa cital z bitu 6 tohto portu, a ako break som mal male tlacidlo pripojene na bit 0 ktore tym padom akoze simulovalo stlacenie medzery.


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 12:09 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2062
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 323 times
Ja som myslel na stav, keď zlyhá interface (napríklad 8255 bude nesprávne nastavená), a bude posielať stále 1. Vtedy hw tlačítko nebude fungovať, a soft bude čakať.

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 12:25 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 898
Has thanked: 51 times
Been thanked: 230 times
Busy píše:
Ale da sa to riesit napriklad aj nejakym tlacidlom ktore na RxD vnuti nulovu uroven.


Z mojho pohladu je vacsi problem rozoznat koniec prenosu.
Ondra to ma vyriesene tak, ze na zaciatku je hlavicka, ktora definuje dlzku dat, takze si nastavim pocitadlo a viem, kedy skoncit.
Na Z88 a ZBerry som to vyriesil timeoutom, ked neprichadzaju data nejaky cas, tak sa povazuje prenos za ukonceny, ale tam mam dost T navyse.

M


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 12:46 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Busy píše:
Ale da sa to riesit napriklad aj nejakym tlacidlom ktore na RxD vnuti nulovu uroven.
PotPalo píše:
Ja som myslel na stav, keď zlyhá interface (napríklad 8255 bude nesprávne nastavená), a bude posielať stále 1. Vtedy hw tlačítko nebude fungovať, a soft bude čakať.
Tak potom este zostavaju tlacidla NMI alebo RESET...
Martin1 píše:
Z mojho pohladu je vacsi problem rozoznat koniec prenosu.
Ondra to ma vyriesene tak, ze na zaciatku je hlavicka, ktora definuje dlzku dat, takze si nastavim pocitadlo a viem, kedy skoncit.
Koniec prenosu je uz vec pouziteho protokolu. Toto som ja riesil podobne ako Ondra, vzdy pred blokom si posielam dlzku dat kolko ich bude v bloku. Tlacidlo ktore vnuti nulu na TxD je len pre nudzove a nestandartne situacie, ked nieco zlyha (strati sa bajt po ceste, zamrzne vysielacia strana...).
Martin1 píše:
Na Z88 a ZBerry som to vyriesil timeoutom, ked neprichadzaju data nejaky cas, tak sa povazuje prenos za ukonceny, ale tam mam dost T navyse.
Toto by som prave nerobil, pretoze druha strana sa moze na nejaky cas seknut (napr. nejaky rezident v msdose zacne daco intenzivne robit). A zase davat dlhe timeouty tiez nie je dobre, zbytocne to potom predlzi celkove doby odozvy.


Nahoru
 Profil  
 
PříspěvekNapsal: 07.11.2019, 13:52 
Offline
Profík

Registrován: 06.02.2019, 11:47
Příspěvky: 898
Has thanked: 51 times
Been thanked: 230 times
Busy píše:
Toto by som prave nerobil, pretoze druha strana sa moze na nejaky cas seknut (napr. nejaky rezident v msdose zacne daco intenzivne robit). A zase davat dlhe timeouty tiez nie je dobre, zbytocne to potom predlzi celkove doby odozvy.


Toto sa mi možno stane v 1% prípadov prenosu a to sériový prenos pri písaní programov naozaj využívam intenzívne: upravím kód a odošlem, na Z88 sa mi spustí a hneď vidím, čo robí. Timeout mám asi pol sekundy. Keďže neovládam jadrovú elektráreň ani bojové hlavice, myslím, že to raz za týždeń prežijem, že musím prenos opakovať.

Pri Ondrovi mi tú hlavičku generuje priamo kompiler do binárneho kódu, takže s tým tiež nemám žiadnu prácu navyše. Jednoducho prvých 5 byte v súbore je hlavička. Je tam aj adresa, od ktorej sa ukladajú dáta.

M1


Nahoru
 Profil  
 
PříspěvekNapsal: 09.11.2019, 14:52 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2331
Has thanked: 303 times
Been thanked: 637 times
Doplnil jsem na web Martinovy kódy 57600bps a 115200bps s měřením a komentářem na ZX 128k +2. Obojí po drobném přizpůsobení a opravě rotace funguje perfektně.

https://cygnus.speccy.cz/popis_zx-spect ... _rs232.php

Busyho kód budu důkladněji testovat až zas přehodím počítače a budu mít na stole DG192k s 8255.

Mezitím bych se rád důkladněji podíval na kód Paula Farrowa z RS232 ROM (jeho web během psaní článku stihl zmizet http://www.fruitcake.plus.com/Sinclair/ ... _RS232.htm) a k něčemu určitě zkusím přidat čekání na CTS, pravděpodobně ke kódu 57600bps od Martina1.

Pak bude na řadě příjem dat.

Mezitím viz na webu, co a jak funguje. Těch 115200bps se stop bitem trvajícím cca 2.7 bitu je fakt síla :)

A možná někdy v budoucnu by bylo fajn upravit SIFTRD i pro softwarovou RS232 (jen 57600bps, protože řízení a oběma směry), aby se interface SIF/ZX 128k dal přepínat přímo v programu a možná napsat rutinu pro tisk skrz RS232 pomocí LPRINT/LLIST i ve 48k BASICu, to bude relativně triviální.

-> Možná by bylo fajn vlákno oddělit od zpomalených portů do samostatného "softwarová RS232 v ZX Spectrum 128k"

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
PříspěvekNapsal: 09.11.2019, 15:10 
Offline
Pan Generální

Registrován: 01.12.2017, 21:01
Příspěvky: 2062
Bydliště: BA-Petržalka :(
Has thanked: 18 times
Been thanked: 323 times
Mňa by zaujímalo, čo z toho by fungovalo na Didaktiku M (iná ULA, iný takt procesoru).

_________________
Oznamy o novom príspevku mi na mail chodia iba sporadicky, takže keď sa nehlásim v diskusii, tak je to tým. V 80% nepríde mail vôbec.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 67 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 7 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz