Po odczekaniu na produkcję płytek i po przerwie urlopowej całość dokończyłem.
Mamy nowy wsad, który obsługuje dwa warianty pracy:
- wersję uproszczoną - czyli sam tylko wyświetlacz tracków, bez żadnych bajerów,
- wersję pełną - z dodatkową obsługą przycisków, którymi można zmieniać numer stacji d1,d2,d3,d4
W najprostszej wersji podłączamy tylko podstawową płytkę, na której jest wyświetlacz i mikrokontroler.
Wystarczy podpiąć tylko zasilanie (VCC i GND) i trzy kabelki bezpośrednio ze złacza flopa: TRACK0, STEP, DIR.
Takie podpięcie daje nam działający w pełni wyświetlacz tracków bez dodatkowych bajerów.
Dodatkowo do płytki podstawowej można dopiąć dwie diody LED, które zapalają się sygnalizując pracę górnej i dolnej głowicy.
Żeby to zadziałało, to musimy ze złącza flopa dopiąć jeszcze czwarty kabelek z sygnałem SIDE.
Do tego momentu wyżej opisane rzeczy zadziałają nam z dowolną stacją 3,5" lub 5,25" na złączu shugart/ibm. Czyli nie tylko w XF551, ale również np. w stacjach od Atari ST, Amigi, czy PC.
Idąc dalej możemy jeszcze dopiąć do płytki podstawowej dwa przyciski oznaczone jako lewy i prawy.
Przycisk lewy służy do zmiany numeru stacji d1,d2,d3,d4. Zmiana następuje natychmiastowo i stacja od razu jest przełączona na odpowiedni numerek i tak widziana przez Atari.
Prawy przycisk natomiast służy do zapisania aktualnie wybranego numeru stacji (wyświetlonego na wyświetlaczu) w pamięci EEPROM mikrokontrolera jako numeru domyślnego. Po ponownym włączeniu stacja będzie się zgłaszała nam z tym numerkiem.
Zmiana numeru stacji polega na wystawianiu odpowiedniej kombinacji 00,01,10,11 na dwóch dodatkowych wyjściach z płytki oznaczonych S1 i S2. Żeby nam to działało w XF551, to musimy tutaj podpiąć dwa dodatkowe kabelki, które trzeba doprowadzić do elektroniki XF551 w miejsce dipswitchy/zworek, które trzeba wylutować lub rozłączyć, i zabezpieczyć, żeby nie było możliwości ich zwarcia do przeciwnego stanu niż podawany przez mikrokontroler.
Jeżeli nigdy nie wybieraliśmy numeru stacji i nie zapisywaliśmy go do EEPROM, to wyświetlacz nie będzie nam pokazywał numeru przy starcie i mamy tylko czysty wyświetlacz tracków Taka jest sytuacja początkowa zaraz po zaprogramowaniu mikrokontrolera. Natomiast jeśli już numer stacji wybierzemy i zapiszemy w EEPROM, to zawsze przy włączaniu wyświetlacz pokaże nam aktualny numer stacji przez dwie sekundy na powitanie. Jeżeli nie chcemy mieć tego powitania, to należy włączyć zasilanie trzymając prawy przycisk - powoduje to wykasowanie EEPROM-u, co sygnalizowane jest wyświetleniem się na chwilę 88 i powrót do uproszczonej wersji. W przypadku gdy nie ma ustawionego żadnego numeru stacji dyskietek, to piny S1 i S2 ustawione są tak jak dla stacji d1.
Załączam szereg zdjęć jak to sobie poskładałem u siebie. Stacja NEC 720kB 3,5" z epoki, elektronika to klon XF551 z ROM-em HyperXF, całość zbudowana w obudowie od SF354. Podłużne przyciski dopasowane również z epoki ze starego magnetowidu:-) Jak ktoś chce zobaczyć całość w działaniu, to wrzucam link do filmiku: https://drive.google.com/open?id=14raEa … At2voSyeDg
I teraz tak. Są dwie możliwości zanabycia drogą kupna ode mnie tego cudeńka.
1. Samo PCB - płytka podstawowa, oraz dorzucam płytkę pod przyciski/LED-y, chociaż zaznaczam, że płytka ta była robiona pod indywidualny mój jedyny w swoim rodzaju egzemplarz z przyciskami od magnetowidu - płytka ta druga jest dorzucona gratis, można wykorzystać, nie trzeba.
Koszt samego PCB to 15zł.
2. PCB +gratisowe pcb pod przyciski/LED-y opisane powyżej +zestaw elementów (zaprogramowany Attiny2313, wyświetlacze siedmiosegmentowe, tranzystory, rezystory, kondensatory, goldpiny). Zestaw nie będzie zawierał przycisków, dwóch diod LED, oraz kabelków - są to elementy, które trzeba sobie dobrać pod indywidualnie grzebane swoje jedyne i niepowtarzalne DIY:-)
Koszt takiego zestawu to 45zł.
W obu wariantach koszt wysyłki 9zł poleconym priorytetem, jak ktoś woli, to może być kurierem za 14zł, innych opcji wysyłki nie przewiduję.
Bardzo proszę o zapisy w miarę możliwości kto chce i może to jak najszybciej, bo potrzebuję oszacować ile kupić tych wyświetlaczy, bo ich nie mam, a nie chcę za dużo przestrzelić z ilością. Komplet elementów będę miał w ciągu kilku dni, pod koniec nadchodzącego tygodnia będę mógł realizować wysyłki. Ilość płytek ograniczona, więc kto pierwszy ten lepszy.
Na koniec publikuję kod źródłowy z komentarzami w celach edukacyjnych. W załączniku wrzucam też skompilowany wsad.
/*
* trackDisplayProg.c
* rev B
* Created: 2019-05-19 18:37:50
* Author : Mq
*/
#define F_CPU 1000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#define AnL (1<<PA0)
#define AnR (1<<PA1)
#define Leds (1<<PB0)
#define S1 (1<<PD4)
#define S2 (1<<PD5)
#define Btns (1<<PD6)
#define Trk00 (1<<PD0) // fdd pin 26
#define Dir (1<<PD1) // fdd pin 18
#define Step (1<<PD2) // fdd pin 20
#define Side (1<<PD3) // fdd pin 32
uint8_t Digits[] = {0x81,0xf3,0x49,0x61,0x33,0x25,0x05,0xf1,0x01,0x21,0x43};
// 0 1 2 3 4 5 6 7 8 9 d
volatile uint8_t Mode = 0; //0 track; 1 drive
uint8_t DrvNr = 0;
uint8_t DrvNrOld = 0;
volatile uint8_t TrkNr = 0;
volatile uint8_t DisplNr = 0;
uint8_t Autobit = 0;
uint8_t SideTmp = 0b1000;
volatile uint8_t BtnL = 0;
volatile uint8_t BtnR = 0;
volatile uint8_t Led1 = 0;
volatile uint8_t Led2 = 0;
volatile uint16_t LedsOff = 0;
int main(void)
{
DDRD &= ~(Trk00 | Dir | Step | Side | Btns); //Trk00,Dir,Step,Side,Btns 0 in
DDRD |= S1 | S2; //numer stacji 1 out
DDRA |= AnL | AnR; //AnL, AnR 1 out
DDRB = 0xff; //port B - wyjscia 1 out
PORTD |= Trk00 | Dir | Step | Side | Btns; //Trk00,Dir,Step,Side,Btns 1 pull-up
PORTD &= ~(S1 | S2); //numer stacji 0 D1
PORTA |= AnL | AnR; //AnL, AnR 1 off
PORTB = 0xff; //port B 1 off
DrvNr = eeprom_read_byte( (uint8_t *) 0x00);
if (DrvNr>3) { DrvNr = 0; }
else { DisplNr = 101+DrvNr; } //ustalenie powitania: nr stacji lub zero jesli nie ustawiono
DrvNrOld = DrvNr;
if (DrvNr==1) PORTD |= S2; //d2
if (DrvNr==2) PORTD |= S1; //d3
if (DrvNr==3) PORTD |= S1 | S2; //d4
//int0 - impulsy step
GIMSK |= (1 << INT0); //włącz przerwanie z INT0
MCUCR=0x02; //przerwanie z INT0 wyzwalane zboczem opadającym
//timer1 - multipleksowanie wyswietlaczy
TCCR1B |= (1 << WGM12); //ustaw timer w tryb CTC
OCR1A = 31; //ustaw do ilu liczy timer -1MHz/64=15625(1Hz) -31(500Hz)
TCCR1B |= ((1 << CS10) | (1 << CS11)); //CS10 włącza timer, CS11 ustawia preskaler na Fcpu/64
TIMSK |= (1 << OCIE1A); //zezwolenie na przerwania dla CTC timer1
sei(); //zezwolenie globalne na przerwania
_delay_ms(100); //czas na sprawdzenie przyciskow
if (BtnR==1) { //wcisniety prawy przycisk podczas startu
DrvNr = 0; //d1
DrvNrOld = 0; //d1
PORTD &= ~(S1 | S2); //d1
eeprom_write_byte( (uint8_t *) 0x00, 0xff); //kasuje eeprom
DisplNr = 88; //zapalenie wszystkich segmentow wyswietlaczy
BtnR = 0;
}
_delay_ms(2000); //wyswietlanie powitania przez 2sek.
while (1)
{
if (SideTmp!=(PIND&Side)) { LedsOff = 3500; SideTmp = (PIND&Side); } //uaktywnienie ledow przy zmianie Side
if (Mode==0) { //Mode=0 wyswietlanie tracków
DisplNr = TrkNr; //wyswietlaj tracki
if (LedsOff>0 && !(PIND&Side)) { Led1=0;Led2=1; }
if (LedsOff>0 && (PIND&Side)) { Led1=1;Led2=0; }
if (LedsOff==0) { Led1=0;Led2=0; }
}
if (Mode==1) { //Mode=1 wybór stacji
DisplNr = 101+DrvNr; //wyświetlaj nr stacji
Led1=0; Led2=0;
if (BtnL==1) { //lewy przycisk zmiana nr stacji
if (DrvNr>2) DrvNr=0; else DrvNr++;
if (DrvNr==0) PORTD &= ~(S1 | S2); //d1
if (DrvNr==1) { PORTD &= ~S1; PORTD |= S2; } //d2
if (DrvNr==2) { PORTD |= S1; PORTD &= ~S2; } //d3
if (DrvNr==3) PORTD |= S1 | S2; //d4
_delay_ms(300); BtnL=0;
}
if (BtnR==1) { //prawy przycisk zapis nr stacji w eeprom
unsigned char i;
for (i = 0; i < 20; i++)
{
Led1 ^= 1;
Led2 ^= 1;
_delay_ms(25);
}
if (DrvNr != DrvNrOld) { DrvNrOld = DrvNr; eeprom_write_byte( (uint8_t *) 0x00, DrvNr); }
BtnR = 0;
}
}
if (BtnL==1 && Mode==0) { Mode = 1; _delay_ms(300); BtnL=0; } //lewy przycisk mode:zmiana stacji
if (BtnR==1) BtnR=0; //prawy przycisk nic
}
}
ISR(INT0_vect) //obsluga przerwania z INT0
{
if (TrkNr<79 && !(PIND&Dir)) TrkNr++;
if (TrkNr>0 && (PIND&Dir)) TrkNr--;
LedsOff = 3500; //czas do wygaszenia ledow -3500(7sek)
Mode = 0;
}
ISR(TIMER1_COMPA_vect) //przerwanie compare timera1
{
if (TrkNr>0 && !(PIND&Trk00)) TrkNr = 0; //wyzeruj licznik jesli glowica na track00
if (LedsOff>0) LedsOff--; //odliczaj czas do wygaszenia ledow
Autobit ^= 1;
PORTB = 0xff; //off
if (Autobit==1)
{
PORTA &= ~AnL; //0 on
PORTA |= AnR; //1 off
PORTB = Digits[DisplNr/10]; //wyswietlenie dziesiatek
if(Led2==1) PORTB &= ~(Leds); //dolna glowica
if(!(PIND&Btns)) BtnL=1; //przycisk lewy
}
else
{
PORTA |= AnL; //1 off
PORTA &= ~AnR; //0 on
PORTB = Digits[DisplNr%10]; //wyswietlenie jednosci
if(Led1==1) PORTB &= ~(Leds); //gorna glowica
if(!(PIND&Btns)) BtnR=1; //przycisk prawy
}
}