velxio/test/test_circuit/plan/phase_5_avr_integration.md

2.0 KiB
Raw Blame History

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; // 05V

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, AVRTimer igual 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:
    1. Inicia ADC (ADMUX=0x40 para AVCC ref + canal 0; ADCSRA=0x87)
    2. Dispara conversión (set ADSC)
    3. Espera fin
    4. Escribe ADCH en OCR1AL (PWM timer1)
    5. Salta al paso 2

Ese programa cabe en ~30 instrucciones y se asembla manualmente a bytes.

Archivos

  • src/avr/AVRHarness.js
  • src/avr/intelHex.js
  • src/bridge/CircuitAVRBridge.js
  • test/avr_blink.test.js
  • fixtures/blink.hex — del fixture existente de Velxio
  • fixtures/pot_pwm.hex — ensamblada a mano