2.0 KiB
2.0 KiB
Fase 5 — Integración con avr8js
Cómo Velxio usa avr8js
frontend/src/simulation/AVRSimulator.ts:
this.cpu = new CPU(programUint16, sramBytes);
this.portB = new AVRIOPort(this.cpu, portBConfig);
this.adc = new AVRADC(this.cpu, adcConfig);
this.peripherals = [new AVRTimer(this.cpu, timer0Config), ...];
// En el loop:
avrInstruction(this.cpu);
this.cpu.tick();
// Inyectar voltaje analógico:
this.adc.channelValues[channel] = voltage; // 0–5V
Velxio dispara listeners de pines al escribir PORTB/C/D y enruta al PinManager. Los ADC se leen cuando el sketch hace analogRead.
En la sandbox replicamos ese patrón
src/avr/AVRHarness.js:
- Carga .hex via
hexToUint8Array(implementado localmente, mismo formato Intel HEX) - Instancia
CPU,AVRIOPort,AVRADC,AVRTimerigual que Velxio - Expone
step(cycles),setAnalogVoltage(channel, v),getPin(arduinoPin),onPinChange(pin, cb),getPWMDuty(pin)
Puente circuito ↔ MCU
src/bridge/CircuitAVRBridge.js:
cada N ciclos (por defecto cada 1 ms):
1. leer estado GPIO → actualiza VoltageSources del circuito
2. leer duty PWM → actualiza V_pwm = Vcc · duty
3. solveDC() del circuito
4. inyectar voltajes de nodos conectados a pines ADC
HEX files requeridos
Como no tenemos avr-gcc disponible, usamos:
- HEX ensamblada a mano para blink y programas simples
- HEX de
frontend/src/__tests__/fixtures/avr-blink/avr-blink.ino.hex(copiada) - Para el test de potenciómetro + PWM escribimos un loop AVR assembly mínimo que:
- Inicia ADC (ADMUX=0x40 para AVCC ref + canal 0; ADCSRA=0x87)
- Dispara conversión (set ADSC)
- Espera fin
- Escribe ADCH en OCR1AL (PWM timer1)
- Salta al paso 2
Ese programa cabe en ~30 instrucciones y se asembla manualmente a bytes.
Archivos
src/avr/AVRHarness.jssrc/avr/intelHex.jssrc/bridge/CircuitAVRBridge.jstest/avr_blink.test.jsfixtures/blink.hex— del fixture existente de Velxiofixtures/pot_pwm.hex— ensamblada a mano