Préampli - Affichage et contrôle (bas-niveau)
Date: 2016-05-14
Tags: DIY elec preamp reverse_engineering
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 :
- 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),
- ← Previous page
Oregon Scientific RM822 - Next page →
Nexx WT3020
Electronics Électronique puissance semiconducteur semiconductors power Hardware CPE INSA Xavier Bourgeois