i2c bit-banging on Z80 with 8255A.

This article is mainly aimed at my Polish readers, owners of the educational computer CA80, but the i2c bit-banging for Z80+8255A may come useful on other Z80 platforms. As always source code can be found on my GitHub page.

8255 port control challenge.

There are many websites that cover i2c in detail, so I’m not going to spend any time doing that here, but in the context of this article, the key issue is the fact I’m trying to use a very basic “software-only” implementation of i2c – later used to pull date and time information from hardware real-time clock (HW RTC). I2c uses two lines to implement it’s the bus: SDA (for data) and SCL (for clock). Those two lines have to be independently controlled via software, additionally, SDA is bi-directional, sometimes used as output and sometimes as input. The 8255 offers 3 ports (A, B, C) of 8 lines of general-purpose I/O connectivity. Unfortunately, the way it operates, all lines of each port can only be configured as input or output all at the same time. So if we “plug” our SDA and SCL lines to the same port (for example port B lines 0 and 1), we would not be able to implement the i2c bus this way. The only solution is to use two independent ports (for example port A, and B, or A and C). One more “trick” you can use is the fact that port C, is actually split in half and can be controlled independently (port 0-3 in one group, and 4-7 in another). This is exactly what I’ve done. Let’s see the diagram:

Diagram_v1

 

As you can see, I’ve used PC.0 for SDA and PC.4 for SCL signals. R1 and R2 are pull-up resistors (I used 10k, but 4.7k would be ok as well) required for all implementation of i2c, R3 and R4 are used for current limiting, for situations where software might be misbehaving sending data at the same time other transmissions are in progress. In my example I’m communicating with a popular RTC from Dallas – DS1308Z (you can use a cheap module from eBay – be aware of issues with those modules where the “trickle charge” circuit may cause the re-chargeable 2032 battery to explode. This has happened to my module, so I removed all the extra components, and I used a non-rechargeable 2032 battery).

The GitHub repository contains the required code RTC_0x2000_0x2300_v1.4.asm The file contains a read and write procedures for the RTC. The code is a bit of a mess of stuff I found on other projects and my own code – but since I haven’t done Z80 assembly language for the last 20 years there is much scope for improvement. Feel free to contribute, but in its current form, the program works and serves its purpose ­čÖé

The next section is more useful to my Polish audience, so I’ll attempt to write it in Polish.

Dla polskich u┼╝ytkownik├│w Mikrokomputera CA80 firmy MIK.

Niedawno uda┼éo mi si─Ö ÔÇ×reanimowa─çÔÇŁ m├│j emulator pami─Öci EPROM ERMAX100, wiec w ko┼äcu mog─Ö zabra─ç si─Ö ze par─Ö projekt├│w na CA80 kt├│re odwleka┼éem przez prawie ÔÇŽ. 20lat.

CA80 to by┼é prawdziwie m├│j pierwszy…hmm “komputer?”. Posk┼éada┼éem go jeszcze w podstaw├│wce! I dzia┼éa┼é. Powsta┼éo kilka projekt├│w, pami─Ötam dobre czasy pisania program├│w na kartce papieru i ÔÇ×kompilacjiÔÇŁ z ksi─ů┼╝k─ů w r─Öku, oraz ┼╝mudne wklepywanie kodu przez klawiatur─Ö CA80.

Dzi┼Ť, m├│j CA80 rzadko jest u┼╝ywany (chocia┼╝ teraz gdy mam mo┼╝liwo┼Ť─ç ┼éatwej emulacji EPROM, mam nadziej─Ö ze to si─Ö zmieni). Wi─Ökszo┼Ť─ç czasu sp─Ödza na moim biurku, wy┼Ťwietlaj─ůc ÔÇ×CA80ÔÇŁ. Dobrze by by┼éo chocia┼╝ na co dzie┼ä u┼╝ywa─ç go jako taki ÔÇ×retroÔÇŁ zegar. Ja mam now─ů wersje komputera z wy┼Ťwietlaczem VFD. Niestety brak podtrzymania pami─Öci czy sprz─Ötowego zegara czasu rzeczywistego (HW RTC) bardzo ogranicza CA80 w funkcji zegara. W tym projekcie chcia┼éem uzyska─ç nast─Öpuj─ůc─ů funkcjonalno┼Ť─ç:

  1. Zegar ÔÇ×tykaÔÇŁ gdy brak zasilania ÔÇô aka HW RTC na magistrali i2c z potrzymaniem bateryjnym.
  2. CA80 automatycznie wy┼Ťwietla czas gdy zasilanie powr├│ci (komenda *E[0] startuje automatycznie).

Postanowi┼éem i2c zrobi─ç w programie, poprzez tak zwane ÔÇ×bit bangingÔÇŁ. Elektronika to tylko podstawowe elementy standardowej implantacji DS1307Z (gotowy modu┼é mo┼╝na kupi─ç na eBay za par─Ö dolar├│w).

Kod ┼║r├│d┼éowy programu jest na GitHub. Plik RTC_0x2000_0x2300_v1.4.asm nale┼╝y skompilowa─ç darmowym ÔÇ×z80-asmÔÇŁ asemblerem. Jest zaprojektowany by zosta┼é zaprogramowany do EPROM w podstawce U9 CA80, zaraz ponad podstawowym kodem pod adresem 0x2000h. Ja mia┼éem w U9 pami─Ö─ç 2764, kt├│r─ů wymieni┼éem na 27128.

Aby uzyska─ç automatyczna synchronizacj─Ö po starcie oraz automatyczne wy┼Ťwietlenie czasu, nale┼╝y te┼╝ zast─ůpi─ç komend─Ö skoku do g┼é├│wnego menu w monitorze CA80, skokiem do mojego programu:

2764_after

Pod addresem 0x0269h zamieni─ç komend─Ö:

JR START ( 18 05 )

na:

JP 2000h ( C3 00 20)

Na GitHub zamie┼Ťci┼éem obraz binarny dla pami─Öci EPROM 27128 oraz 27256 kt├│ry zawiera ju┼╝ dodatkowy kod i zmiany w monitorze, nale┼╝y tylko go zaprogramowa─ç i zainstalowa─ç w CA80 w podstawce U9 (zak┼éadam ze wszystkie po┼é─ůczenia konfiguracyjne s─ů w fabrycznej pozycji). Elektronik─Ö mo┼╝na zlutowa─ç na wewn─ůtrz CA80 lub pod┼é─ůczy─ç do z┼é─ůcza u┼╝ytkownika, wymaga tylko 4 po┼é─ůcze┼ä (VCC,GND, SDA-PC.0 i SCL-PC.4).

Program automatycznie odczyta czas i dat─Ö po starcie CA80 z HW RTC and nastepnie automatycznie przejedzie do wy┼Ťwietlania czasu. Wszytkie inne zlecenia powinny dzia┼éa─ç bez zmian. Do monitora mo┼╝na wr├│ci─ç naciskaj─ůc klawisz “M”.

┼╗eby zaprogramowa─ç aktualy czas do nowego uk┼éadu RTC, nale┼╝y najpierw ustawi─ç czas w CA80 zleceniem *E[1][sek].[min].[godz]= a nast─Öpnie wywo┼éa─ç program u┼╝ytkownika pod adresem 0x2100h komend─ů *E[G][2100]=, kt├│ra zapisze aktualny czas do HW RTC.

Kod jest napisany tak “na szybko”, cz─Ö┼Ť─ç jest skopiowana z innych projekt├│w online, wyszed┼éem z wprawy nie pisz─ůc w assembly prze 20lat ­čÖé Zapraszam do ulepszenia.

Tymczasem zostawiam was ze zdj─Öciem mojego CA80, dumnie wy┼Ťwietlaj─ůcego czas.

CA_80