Общайтесь с Arduino, используя язык ассемблера 8086

Мне нужно использовать язык ассемблера 8086 для подключения к Arduino в моем задании. Когда я запускаю программу сборки, звучит зуммер. Я запускаю программу сборки с помощью DOSBox.

int buzzer = 11;
int val;

void setup() {
  pinMode(buzzer, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val = Serial.read();
  if(-1 != val) {
    if('H' == val) {
      unsigned char i;
      for(i = 0; i < 80; i++) {
        digitalWrite(buzzer, HIGH);
        delay(1);
        digitalWrite(buzzer, LOW);
        delay(1);
      }
      for(i = 0; i < 100; i++) {
        digitalWrite(buzzer, HIGH);
        delay(2);
        digitalWrite(buzzer, LOW);
        delay(2);
      }
    }
  }
}

Выше мой код Arduino. Когда COM1 получает «H», звучит зуммер.

.MODEL SMALL
.STACK 64
.DATA
.CODE
MAIN PROC
        MOV AX,@DATA
        MOV DS,AX
        MOV AH,00
        MOV AL,11101011b
        MOV DX,00
        MOV AH,1
        MOV AL,'H'
        MOV DX,00
        INT 14H
        MOV AX,4C00H
        INT 21H
MAIN ENDP
END MAIN

Выше мой ассемблерный код. Когда я запускаю ассемблерный код, он должен отправить «H» на COM1, и прозвучит зуммер. Однако ничего не происходит, когда я запускаю программу сборки. В чем проблема?


person LianChyn    schedule 17.07.2017    source источник
comment
Вы должны инициализировать последовательный порт, а затем отправить свои данные.   -  person Usagi Miyamoto    schedule 17.07.2017
comment
Вы имеете в виду инициализировать последовательный порт в файле конфигурации dosbox?   -  person LianChyn    schedule 17.07.2017
comment
После того, как я изменил serial1=directserial realport:COM1 в dosbox-0.74.conf, DOSBox продолжает показывать сообщение об ошибке Serial1: Errors: Framing 0, Parity 0, Overrun RX960 (IF0:0), TX:0, Break 0.   -  person LianChyn    schedule 17.07.2017


Ответы (1)


MOV AH,00
MOV AL,11101011b
MOV DX,00

Этот код пытается настроить последовательный порт COM1:

  • 9600 бод
  • нечетная четность
  • 1 стоповый бит
  • 8 бит данных

Но здесь отсутствует одна важная инструкция! Вам по-прежнему нужно запросить у BIOS сделать это:

int 14h

MAIN PROC
    xor   dx, dx        ; Select COM1
    mov   ah, 00h       ; InitializeCommunicationsPort
    mov   al, 11101011b ; 9600, odd, 1, 8
    int   14h
    mov   ah, 01h       ; WriteCharacterToCommunicationsPort
    mov   al, 'H'
    int   14h
    test  ah, ah
    jns   OK
    ... function failed with errorcode in bits 0-6 of AH
  OK:
    mov   ax, 4C00h     ; TerminateWithReturnCode
    int   21h
MAIN ENDP
END MAIN
person Sep Roland    schedule 23.07.2017