8bit
Electronics & Computers
Inspiromat
2023.08.04 08:39:07 end Expanduino Gilhad

Expanduino_I-nahled.png

Poznámky k Expanduino_I

1   inspiromat

  • (ok) popsat piny u I2C a SPI konektorů
  • (ok) v další verzi popsat nepoužité piny (D5-D9), aby se snadno hledaly
  • fixnout umístění R/C 5 a 6 (pravý horní roh R/C)
  • !!! přidat montážní díry
  • (ok) popisky pod obvody (74 279 a pod., velikost písma viz znak diody u SR2, umístění od dolní diody níž, podél v ose)
  • přidat univerzální tišťák (síť prokovených dírek, plus +5V, GND, I2C a volné piny poblíž)
  • přidat SPI RAM - třeba 1Mb = 128kB 23LCV1024 (cena kolem 70 Kč - insane)
  • přidat I2C OLED
  • PS/2 konektor
  • jelikož mám vyvedené všechny Arduino piny, jde snadno udělat shield (koprocesor) klidně i s dalším arduinem, kde by se třeba bavili po I2C a zbytek pinů by šel používat na nejrůznější interface (a byla by to další 10x10cm destička, ale nepotřebovala by pro komunikaci tolik chipů)
  • ostatně I2C - ten koprocesor by vlastně měl například přístup k flashi v RTC a klidně by tam mohl jet DMA :)
  • a když DMA, tak i 23LCV1024 přez SPI by se dalo upravit na společnou sběrnici, kde by SS byl přez pull-up a arduina by se jeho řízení vzdaly tím, že nahodí high-Z a před znovuzmocnění se sběrnice by testovaly, zda na ní někdo už nekecá ... (a furt je na té desce nevyužité SR hradlo, stačilo by trošku drátování a ... (a nepotřebuju pak ani edge, protože můžu posílat rovnou pulzy))
  • 6809 knihy
  • FIFO knihovna - inspirace
  • SdFat na její starší verzi je založená Arduino SD
  • read ... https://github.com/Arakula/f9dasm https://forums.arcade-museum.com/threads/what-6809-assembler-disassembler-is-best.101108/
  • Disasm a další programy ,`6809-Single-Board-Computer <https://oshwlab.com/tranter/6809-Single-Board-Computer>`__
  • 80x25 video Arduino shield 1 Arduino shield 2
  • (ok) Při zápisu do Serial přenos do počítače proběhne "hned", ale pokud není připojený, tak timeout je odporný - pořešit si to nějak, že se zahazuje, když není připojení
    • Problém je se zavěšováním linky - screen ji nezavěšuje, picocom ano (a pak nejsou problémy). Nebo se dá zavěsit ručně. Více viz Arduino Stack Exchange
  • Měl bych jako StatusReg použít 74HC245, mnohem lepší průchodka a rozumější konfigurace pinů

2   Errata a chyby

  • (ok) Pro SD kartu mám špatně dekodér, který počítá s pozitivní logikou, zatímco enable je v logice negativní. Možná by stačilo předřadit NOT3C před NAND4C-9 a NAND4D-12 (= spojené SD_Enable) a nastavit clock na 0 dřív, než SD vyberu a tak ho mezi výběry držet na 0 pořád. Potřebuju si líp popsat, co se děje s clock (a data) u chipů, které nerespektují chip select. Možná tam dám redukci a místo NAND tam dám PAL a nastavím si tam co chci...
    • detaily v SPI on Arduino včetně časového grafu SPI_timing.png
    • v podstatě to je "skoro" v pořádku, akorát že z 74HC138 Demux2 mi leze SD_Enable a do NAND4C-9 by mělo jít invertované (tedy SD_Enable) - čili ten NOT před tím postačí a když to bude disablované, tak clock i data budou v nule, kde mají být, když se nic neděje
  • picocom -b 115200 --flow n  --noreset --hangup --quiet -s cat /dev/ttyUSB0
    
  • (ok) pulzovače pulzují, světýlka jsou obráceně (GND má být u okraje, aby ho 1 rozsvítila, pořadí u kraje GG YG YG YG je správně)

  • (ok) 595 mají blbě zapojený SRCLR (clear) na GND místo na +5V

  • Nějak jsem se zamotal do úrovní Enable pro SD, správně to má být takto (negovaný signál aktivní v nule):
    • schema Expanduino_I_fix_001_schema.png
    • fix Expanduino_I_fix_001_spoje.png
    • foto Expanduino_I_galerie_DSC_7875.s.jpg
  • 74HC595 mají blbě zapojený SRCLR (clear) na GND místo na +5V
    • schema Expanduino_I_fix_002_schema.png
    • fix Expanduino_I_fix_002_spoje.png
    • foto Expanduino_I_galerie_DSC_7873.s.jpg Expanduino_I_galerie_DSC_7874.s.jpg
  • světýlka jsou obráceně (GND má být u okraje, aby ho 1 rozsvítila, pořadí u kraje GG YG YG YG je správně)

3   Různé zápisky

3.1   abclinuxu.cz

Z éry 8biťáků mám pořád ještě nedokončených (spíše polozačatých) textových her, které bych někdy rád dodělal (a teď už by to zase šlo, zvlášť když bych mohl vyvíjet na velkém ppočítač s gitem, rychlou odezvou a spolehlivým ukládáním/načítáním).

Pro tu desku samotnou chci upravit původní Monitor, aby v prvním kroku uměl komunikovat jak s vestavěnou MC6850 ACIA, tak s Expanduinem a pokud bude zapojené, tak mu na začátku vyslat nějaký prompt. Expanduino ho rozezná a nabuší tam (jakoby ručně) přez Monitor vlastní kód pro komunikaci se sebou a pak tam přez něj přepošle poslední verzi "firmwaru" abych nemusel furt přepalovat (EEP)ROMku. Čili takový "bootsektor".

A pak už to půjde rozbalit - komunikace v barevném ANSI textu, systémové rutiny pro menu, práci se soubory, reálným časem, vším možným a nemožným a do toho už půjde začít s těma hrama, které budou používat "BIOS" pro řadu společných věcí (a asi přez nějakou úvodní tabulku, která půjde snadno přepsat, pokud se BIOS přemístí a změní, takže by pak šly rozjet i na jiném HW, který by jen emuloval služby Expanduina)

Navíc, protože je tam to Arduino a má ještě asi 6 pinů volných (+I2C, +2 SPI zařízení, +USB komunikaci s PC, +SD karty), tak by tam mělo jít časem přidat děsná spousta dalších zařízení jako PS/2 klávesnice, nějaké LCD, možná i připojit modul/desku s grafickou kartou (například Rapsberry Pi přez I2C a posílat mu grafická primitiva jako zprávy a ať to rozkreslí samo - takže klidně i sprity a vyšší abstrakce) a vůbec, pro Arduino je teď všude modulů ...

Takže když vhodně rozdělím problém, tak ho šikovný BIOS bude schopný zobrazovat mnoha kreativními způsoby.

Ale s nepatrnými náklady spousta zábavy na mnoho dalších let :)

3.2   HWkitchen.cz

Tady

Tak jsem ty odpory nakonec oželel s tím, že jsem si zkusil zapojit pár zelených a žlutých ledek paralelně na jeden odpor a ono to svítilo celkem slušně. (Červené taky ještě šly, ale modré vůbec ... moc různá napětí).

Podařilo se mi tam nacpat ještě nepatrné mezery mezi dvojice párů ledek takže je zjevnější, co je na jedné adrese. (4 LED, protože tam jsou dva registry, jeden pro zápis a druhý pro čtení - z hlediska retropočítače, z hlediska Arduina je to naopak).

Takže po dlouhém přemýšlení a simulace s barevnýma kostkama na stole jsem došel k závěru, že nejpřehlednější mi to přijde takhle:

Dvě řady LED (víc se nevejde) řada na kraji je pohled retropočítače (protože to je ten hlavní, deska je sice větší ale jen přídavná) Status registr (registr na adrese 00 pro čtení), který se stejně musí číst nejdřív a nejčastěji, abych viděl, zda vůbec můžu číst/psát něco jiného je na kraji v rohu, odj něj to jde pak pravidelně dál (control registr - adresa 00 pro zápis), mezera, adresa 1 čtení a zápis, mezera, adresa 2 čtení a zápis, mezera, adresa 3 čtení a zápis.

Každý registr je zobrazen dvojicí LED, zelená pro relaxovaný stav, žlutá, pokud je ho nutno zpracovat. Takže registry pro zápis mají zelenou u retropočítače a registry pro čtení u desky.

Ono to asi bude normálně svítit pouze zelenýma, protože klidový stav je, že je vše přečteno a je možno psát.

A pokud to nebude chodit dobře, tak to odpájím a dám prostě zelenou dopředu a žlutou dozadu.

Takže takhle jsem to upravil a odeslal a teď čekám, co přijde a zda to bude fungovat. Na jejich stránkách je jakýsi náhled na tu desku, je malý ale vypadá dobře ... tak snad ... ;)

3.3   arduino.stackexchange.com

  • Problém je se zavěšováním linky - screen ji nezavěšuje, picocom ano (a pak nejsou problémy). Nebo se dá zavěsit ručně. Více viz Arduino Stack Exchange

3.3.1   How to detect, if Serial is really connected to listening PC program? (on atmega32u4)

I need to connect from PC to Arduino Micro Pro over USB Serial and disconnect again and not slow down the Arduino with timeouting on all Serial.print. * fast before screen connects, fast when screen connected, slow after screen ends, fast when screen reconnected

3.3.2   Details

I have Arduino Micro Pro managing a lot of things at its own, but I want sometimes connect to it via USB from my computer. I open screen /dev/ttyACM0 115200 and get a lot of debugging info and so on. Then I close the screen and let it work in peace. But there is problem with timeouts - when I stop listening, it waits for me and everything is terribly slow, until I connect there again.

3.3.3   Problem

When I connect the Arduino to PC (so it gets powered, I do not have much of the rest HW completed yet), it starts to do Something Important as fast as it can and every second the yellow LED blinks too fast to see that Green was off. It is OK.

Then I connect with screen /dev/ttyACM0 115200 and it gets new long line every second. Still the Green looks all time on and Yellow can be seen just blink. Still OK.

Then I end screen and it went slow - Yellow is on for like 7 second, while Green is on for 1 sec. And it is BAD.

Then I connect with screen /dev/ttyACM0 115200 and it gets new long line every second. The Green looks all time on and Yellow can be seen just blink. Again OK.

3.3.4   Question

How to detect, if I am connected or not?

Or maybe better, how to prevent the terrible slowdown, when I am not connected?

3.3.5   Thanks to Nick Gammon for his answer, the problem is really in the screen program.

There is detailed explanation from Majenko in if(Serial) not working correctly on micro or pro micro

The problem is, that some programs (like screen) or some systems, or drivers, or so do not pull down RTS and DTR signals for Micro. (The DTR down is supposed to restart Uno and other non-USB arduinos).

It could be solved by running some small program to close the USB Serial properly after the screen is done with it - here are two which works for me

3.3.6   C program

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>

int main(int argc, char *argv[]) {
        // Check if the correct number of command-line arguments is provided
        if (argc != 2 ) {
                fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
                fprintf(stderr, "  %s /dev/ttyACM0 - close USB Serial for Arduino on the port\n", argv[0]);
                return 1; // Return an error code
        }
        int fd;
        fd = open(argv[1],O_RDWR | O_NOCTTY );//Open Serial Port

        int RTS_flag;
        RTS_flag = TIOCM_RTS;

        int DTR_flag;
        DTR_flag = TIOCM_DTR;

//      ioctl(fd,TIOCMBIS,&RTS_flag);//Set RTS pin
//      ioctl(fd,TIOCMBIS,&DTR_flag);//Set DTR pin

        ioctl(fd,TIOCMBIC,&RTS_flag);//Clear RTS pin
        ioctl(fd,TIOCMBIC,&DTR_flag);//Clear DTR pin
        close(fd);
}

3.3.7   Python

#!/usr/bin/python -u

import serial
import sys

# Check if the correct number of command-line arguments is provided
if not len(sys.argv) in {2,3}:
        print("Usage: {} <filename> [baudrate]".format(sys.argv[0]))
        print(" {} /dev/ttyACM0 - close USB Serial for Arduino on the port".format(sys.argv[0]))
        sys.exit(1)  # Exit with a non-zero error code

# Get the filename from the command-line argument
baudrate=115200
filename = sys.argv[1]
if len(sys.argv) > 2:
        baudrate=sys.argv[2]

# Open the serial port
ser = serial.Serial(filename, baudrate, xonxoff=False , rtscts=True , dsrdtr=True )
ser.rts=False
ser.dtr=False

3.3.8   Can I somehow "type in" file to picocom?

As if I open picocom /dev/ttyACM0 communicate with Arduino over its Serial.read and then "type-in file lorem.txt" and Arduino will get impression, that I am typing really fast really long texts. (the Serial.read will just receive lots of chars - the content of the file)

picocom -b 115200 -s cat /dev/ttyUSB0
then C-a C-s ./test_serial.002.0200.s.x.hex

4   Expanduino AVR

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D8
avrdude: safemode: efuse reads as CB
avrdude: safemode: Fuses OK (E:CB, H:D8, L:FF)
  • RTC
    • Flash AT24C32 / AT24C64 The address “rollover” during read is from the last byte of the last memory page, to the first byte of the first page. The address “roll over” during write is from the last byte of the current page to the first byte of the same page.
      • Page size is 32 bytes
  • Wire
    • The Wire library implementation uses a 32 byte buffer, therefore any communication should be within this limit. Exceeding bytes in a single transmission will just be dropped.
    • to znamená při zápisu 2 byty adresa + max 30 bytů data

5   Changelog

  • 2023.09.10 SD karta chodí nějak, ale přeteče do proměnných, je nutné to razantně ořezat
    • a navíc teda listuje na Serial, já potřebuju do FIFO
    • Sketch uses 26888 bytes (93%) of program storage space. Maximum is 28672 bytes.
    • Global variables use 1959 bytes (76%) of dynamic memory, leaving 601 bytes for local variables. Maximum is 2560 bytes.
  • 2023.09.13 Když to nejde po dobrém, vem si větší kladivo - tak jsem vzal Arduino Nano Every a odkomentoval přemrštěné úspory
    • Sketch uses 29516 bytes (60%) of program storage space. Maximum is 49152 bytes.
    • Global variables use 2120 bytes (34%) of dynamic memory, leaving 4024 bytes for local variables. Maximum is 6144 bytes.
  • 2023.09.14 Místo 74HC373 by měl být 74HC245 !!!