Préampli : Affichage et contrôle (bas-niveau)
2016-05-14
J'avais récupéré un KVM qui avait quelques défauts (image bruitée sur certains canaux, clavier non-fonctionnel avec certains PC) et ne m'était pas utile. De ce fait, je n'ai gardé que le boîtier en acier et la face avant pour l'utiliser dans un projet de préampli.
Face avant
Il y a un PCB avec 2 latches 74HC273 et un latch 74HC374, 9 boutons poussoirs, 16 LEDs et un buzzer. Chaque groupe de boutons et de LEDs est relié à un latch, relié à un bus 8 bits.
Le second bus sert au contrôle des latches, du buzzer et du switch de droite.
Pinouts
Control_bus :
Data_bus :
Interface bas-niveau
Pour commencer, j'ai utilisé un Arduino Mega en reliant le bus de données sur le port F ([A0..A7]), et le bus de contrôle au port K ([A8..A15]).
La fonction ledOut() permet d'allumer les LEDs vertes et rouges en fonction des variables ledG et ledR (uint8_t).
Références
Face avant
Il y a un PCB avec 2 latches 74HC273 et un latch 74HC374, 9 boutons poussoirs, 16 LEDs et un buzzer. Chaque groupe de boutons et de LEDs est relié à un latch, relié à un bus 8 bits.
Le second bus sert au contrôle des latches, du buzzer et du switch de droite.
Pinouts
Control_bus :
- BUZ: 0
- SWI: 1 (input)
- !CLR: 2 (active low)
- CLKG: 3 (green)
- CLKR: 4 (red)
- !OE: 5 (active low)
- CLKS: 6 (switches)
- NC: 7
- Vdd: 8 (+5V)
- Vdd: 9 (+5V)
- Vdd: 10 (+5V)
Data_bus :
- DATA: [0..7] (TTL in/out)
- Vss: 8 (GND)
- Vss: 9 (GND)
- Vss: 10 (GND)
Interface bas-niveau
Pour commencer, j'ai utilisé un Arduino Mega en reliant le bus de données sur le port F ([A0..A7]), et le bus de contrôle au port K ([A8..A15]).
La fonction ledOut() permet d'allumer les LEDs vertes et rouges en fonction des variables ledG et ledR (uint8_t).
void ledOut(void) { //set bus out DDRF = 0xFF; // clear latches PORTK &= ~_CLR; ndelay(); PORTK |= _CLR; // reset bus PORTF = 0x00; //write bit PORTF |= ledG; ndelay(); //write CLK up PORTK |= CLKG; //1st row ndelay(); //write CLK down PORTK &= ~CLKG; //reset bus PORTF &= ~ledG; //write bus PORTF |= ledR; ndelay(); //write CLK up PORTK |= CLKR; //2nd row ndelay(); //write CLK down PORTK &= ~CLKR; //reset bus PORTF &= ~ledR; }La fonction swIn() écrit l'état des interrupteurs dans les variables swstatus et oldswstatus.
void swIn(void) { // save old value oldswstatus = swstatus; //set bus in DDRF = 0x00; //write CLK (up) PORTK |= CLKS; ndelay(); PORTK &= ~CLKS; ndelay(); //write !OE PORTK &= ~_OE; ndelay(); ndelay(); ndelay(); //read bus swstatus = ~PINF; //write OE PORTK |= _OE; //set bus out //DDRF = 0xFF; //Serial.print(swstatus); }Ici, la macro ndelay() est équivalente à un NOP, soit 1 cycle à 16MHz (62.5ns). Le latch 74HC374 est donné pour supporter un temps de transition de 45ns, en pratique, la transition entre !OE et les sorties donne quelques glitches lorsqu'on attend que 125ns, et le fonctionnement est correct avec une pause de 187.5ns (3 NOPs à la suite).
Références
- Documentation KVM
- Datasheet 74HC374
- Datasheet 74HC273
- C source file (easily portable to any architecture, only the Serial Arduino lib is used for debug),
No comments
Flux RSS des commentaires de cet article