PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : serielle Datenübertragung ohne vernünftiges Protokoll



enoritz
04.02.2006, 10:54
Hallo,

ich habe hier einen Controller der über eine serielle Schnittstelle verfügt. Allerdings werden die Daten ohne richtiges Protokoll übertragen, soll heißen es werden einfach nur 8Bit nacheinander ausgegeben.

Da ich jetzt aber eine verbindung zum PC aufbauen möchte und da Start- bzw. Stop-Bits brauche habe ich ein kleines Problem.

Kennt ihr eine Möglichkeit, wie ich das Start und Stop Bit evtl. über eine Schaltung generieren lassen kann? Es soll natürlich so wenig aufwendig wie möglich sein, es soll einfach nur schnell funktionieren.

Danke...

tobimc
04.02.2006, 11:15
HI

Was ists denn für einer (controller)?
Normalerweise kann man das in den entsprechenden Registern einstellen...
Ein UART ohne Start/Stopbits wär ja schlimm.

VLG Tobi

enoritz
04.02.2006, 11:21
Tja, ist eben schlimm.

Das ist ein Z80 Derivat - aka Gameboy. Ich versuch gerade ne Softwarelösung, bin allerdings gerade nicht allzu optimistisch und außerdem wird die wohl langsamer sein als ne Schaltung, was die Ausführung anderen Codes auf dem Gameboy anbelangt.

tobimc
04.02.2006, 11:37
HI

Hm. Kannst du die Signale via MAX232 am PC auslesen?

Meines Wissens hat der Z80 keinen UART. Da brauchst du einen Erweiterungsbaustein...
Meines Wissens ein SIO-Register...

VLG Tobi

enoritz
04.02.2006, 13:31
Ja... also das läuft über ein Schieberegister am Gameboy. Ein Byte wird rausgeschoben und gleichzeitig von außen wieder rein. (Taktsignal kann man als intern oder extern auswählen)

Den Pegelwandler hab ich mir schon zusammengelötet, nur würde ich nicht so gerne den PC an den GB anpassen sondern eher andersrum. Ich werds wahrscheinlich mal mit nem AVR probieren, der dem GB den Takt angibt und dann die 8Daten-Bits aufnimmt und anschließend über eine vernünftige Schnittstelle zum PC sendet. Allerdings wäre es mir lieber dafür nen speziellen IC nehmen zu können und keine programmierbare Logik (wegen dem geringeren Aufwand).

tobimc
04.02.2006, 17:15
Hi!

...aha...

Dann schau mal nach dem Z80 SIO, das ist so eine vernünftige Schnittstelle...

VLG Tobi

Vogon
05.02.2006, 01:50
Willst du so etwas bauen ?
http://www.work.de/nocash/gbatek.htm
http://www.work.de/nocash/gbatek.htm#siouartmode
http://www.charmedlabs.com/xportrobot.htm
http://www.reinerziegler.de/GBA/gba.htm

http://www.charmedlabs.com/xport2a.jpg http://www.charmedlabs.com/robot2.jpg
Edit: UART-Interface gefunden :oops:
http://www.reinerziegler.de/GBA/UART.gif

enoritz
12.02.2006, 18:51
Vielen dank für deine Mühen. Allerdings habe ich leider keinen GB-Advance sondern ein Uraltmodell zur Verfügung.

Ich bin jetzt schonmal soweit, dass ich Daten über die Schnittstelle verschicken kann. Das läuft alles in einer Assembler-Routine, welche mir Start- und Stopbit generieren kann.

Vogon
13.02.2006, 01:12
Dann bist du am schreiben einer Software-UART ?

Ich hab da mal was aus meinem Historischen Museum.
Ist für einen 8080 ASM - sollte aber mit ein wenig Mühe auf Z80_ASM umzubauen sein.

; Dokumentation zum Speakeasy I/O Board von George Morrow Mikro Stuff
;
;
; THE SERIAL DATA INPUT ROUTINE WITH READER CONTROL AND ECHO OPTIONS:
; Aufrufbedingungen:
; (A) Die Speicherstelle SCON muss auf den richtigen wert ge-
; setzt sein, vorzugsweise unter Benutzung der unten beschrie-
; benen DETCT-Routine. Dies ist notwendig, damit die Länge
; einer Bitzelle, wie sie von der Routine erwartet wird, mit
; der Länge der Bitzelle der an das Interface angeschlossenen
; Einheit übereinstimmt.
; (B) Register B dient als Optionsregister.
; 1. Ist Bit 0 eine Eins, so werden Echos an den Drucker
; unterdrückt; anderfalls werden die Zeichen sofort nach
; vollständiger Übernahme der zugehörigen Bits ausgedruckt.
; 2. Ist Bit 7 eine Eins, so wird ein eventuell am Interface
; angeschlossener Lochstreifenleser eingeschaltet bis
; ein Startbit auftritt und dann abgeschaltet.
; (C) Die Routine kehrt mit dem empfangenen Datenwort in Register
; D in das übergeordnete Programm zurück.

816f 78 INPUT MOV A,B ;Conditionally -
8170 07 RLC ;Turn ON -
8171 D3 06 OUT READR ;the paper tape reader.
8173 2A F3 83 LHLD SCON ;Get The Speed Constant -
8176 E5 SWAIT PUSH H ;and save on the stack.
8177 1E FF MVI E,-1 ;initialize the shift reg
8179 DB 05 SLOOK IN SERAL ;get the input data -
817b 1F RAR ;and test it -
817c da 79 81 jc slook ;for a start bit.
817f cd a0 81 call delay ;wait half a -
8182 e1 pop h ;bit time -
8183 db 05 in seral ;and verify -
8185 if rar ;that a start -
8186 da 76 81 jc swait ;bit is present.
8189 16 ff mvi d,-1 ;initialize other of shift reg
818b af xra a ;stop the -
818c d3 06 out readr ;reader.
818b e5 GTBIT push h ;update the stack
818f 29 dad h ;calculate the speed -
8190 2b dcx h ;constant for a full bit time.
8191 db 05 in seral ;get the input
8193 5f mov e,a ;update the shift reg
8194 cd a0 81 call delay ;delay 1 bit time and shift d-e
8197 e1 pop h ;get the speed constant
8198 da 8e 81 jc gtbit ;was the start bit shifted to carry?
819b 3e 01 mvi a,1 ;yes. leave with the -
819d d3 05 out seral ;printer in the space made.
819f c9 ret
;
; Serial delay routine used in conjunction with the
; serial input and output rotines.
; calling conventions:
; (A) H-L is initialized with a value which
; determines the time before the routine
; returns to the calling program given
; by 53(H-L) + 58 machine cycles.
; (B) Bits 0 of registers B and E are
; initialized to values consistent with
; these bits being ored together and
; to the serial output device.
; all timings assumed 1 wait state per fetch.
81a0 7b DELAY mov a,e ;conditionaly -
81a1 b0 ora b ;output bit 0 of e -
81a2 d3 05 out seral ;to the serial device.
81a4 2b dcx h ;decrement -
81a5 7c mov a,h ;the h-l pair -
81a6 b5 ora l ;and test -
81a7 c2 a0 81 jnz delay ;for zero
81aa 7a mov a,d ;rotate d-e -
81ab 1f rar ;one -
81ac 7b mov a,e ;bit -
81ad 1f rar ;position -
81ae 5f mov e,a ;to the -
81af 7a mov a,d ;right -
81b0 1f rar ;with end around -
81b1 57 mov d,a ;bit preserved.
81b2 c9 ret

; Serial output routine.
; Calling conventions:
; (A) reg a is initialized to an 8-bit value
; to be serially sent to the serial output device.
; (B) the on-board ram location SCON (serial
; speed constant) must be initialized to
; the proper value preferable using the
; DETCT routine below. this is so that
; the cell time assumed by the routine and
; the cell time for the device connected
; to the interface are compatible.
; The routine starts by sending a zero for one cell
; time to the serial device connected to the interface.
; it next sends bit 0 of reg a, followd by bits
; 1 through 7. it then sends a one for two cell times
; as rest bit and returns to the calling program.
; all timing assumes 1 wait state per fetch.
; including the return address of the calling program,
; 4 levels of the stack are used by the routine.
;
; Register Map:
; A: Serial Output Data.
; B: The Routine loads B with 2(A) to force
; output when the delay routine is called.
; C: used as a bit counter and inittialized
; to 11 decimal.
; DE: 16-bit storage shift register for output
; to the serial output device.
; HL: delay time count.

81b3 87 SROUT add a ;add a start bit
81b4 47 mov b,a ;make bit 0 of b a zero
81b5 5f mov e,a ;shifted data to e
81b6 3e 0b mvi a,11 ;this is the bit count & the rest bits
81b8 4f mov c,a ;count to reg c
81b9 17 ral ;load d with the rest -
81ba 57 mov d,a ;bits and high order data bit.
81bb 2a f3 83 OLOOP lhld SCON ;get the speed constant
81be 2a f3 83 lhld SCON ;padding
81c1 29 dad h ;adjust for output -
81c2 2b dcx h ;loop.
81c3 cd a0 81 call delay ;output data bit and shift
81c6 0d dcr c ;decrement bit count
81c7 c2 bb 81 jnz OLOOP
81ca c9 ret

; Serial Device Speed Detection Routine:
; Diese Routine sollte benutzt werden wenn das Gesamtsystem ein-
; geschaltet wird. Die benutzte serielle Eingabeeinheit sollte an
; das Interface angeschlossen sein. Die serielle Einheit ist dann ein-
; zuschalten und danach die Routine zu starten.
; Dann sollte der Benutzer die Wagenrücklauftaste (return, carriage return)
; betätigen. Die DETCT-Routine erwartet den Empfang dieses ASCII-Zeichens
; und kann damit die Baudrate der Einheit messen und den Speicherplatz SCON setzen.
; Die Routine bleibt dann auf dem dynamischen Halt stehen.

81cb 31 e0 83 lxi sp,83e0h ;initialize the stack pointer
81ce 16 06 DETCT mvi d,6 ;transition counter
81d0 4a mov c,d ;bit 0 of c is -
81d1 0c TLOOP inr c ;the important bit here.
81d2 21 01 00 lxi h,1 ;offset for hl
81d5 db 05 GETIN in SERAL ;get the input
81d7 d3 05 out SERAL ;echo
81d9 a9 xra c ;compare with bit 0 of c
81da 1f rar
81db 23 inx h
81dc d2 d5 81 jnc GETIN ;wait if no transition
81df e5 push h ;save the delay time
81e0 15 dcr d
81e1 c2 d1 81 jnz TLOOP
81e4 e1 pop h ;get the 3 zero bits time
81e5 e1 pop h ;get the 2 one bits time
81e6 c1 pop b ;get the 1 zero bit time
81e7 09 dad b ;add together
81e8 c1 pop b ;get the 1 one bit time
81e9 09 dad b ;add to previous subtotal
81ea c1 pop b ;discard the start bit -
81eb c1 pop b ;and the infinite string -
81ec 16 03 mvi d,3 ;of rest bits.
81ee af SLOOP xra a ;divide -
81ef 7c mov a,h ;the -
81f0 1f rar ;total -
81f1 67 mov h,a ;by -
81f2 7d mov a,l ;eight -
81f3 1f rar ;to -
81f4 8f mov l,a ;calculate -
81f5 15 dcr d ;half the -
81f6 c2 ee 81 jnz SLOOP ;data bit time -
81f9 2b dcx h ;adjust for other -
81fa 22 f3 83 shld SCON ;routines and save.
81fd c3 fd 81 STOP jmp STOP ; dynamic halt

; 1975 - Bill Godbout and George Morrow (who would later build the Morrow Computer)
; build the first 16-bit computer with RAM and a built-in cassette interface.
; An advertisement for the unnamed computer appears in the first issue
; of Byte Magazine, but not one of the computers is sold.


Das Bord steckt in so einem Computer (1975)
http://www.imsai.net/images/global/8080logo.jpg