Эмуляция светофора на макетной плате с использованием Raspberry Pi и языка ассемблера
Я пытаюсь работать над заданием, в котором нам предлагается создать программу на языке ассемблера с использованием Raspberry Pi, подключенного к макетной плате. Я не очень хорошо разбираюсь в языке ассемблера и изо всех сил старался основывать свою программу на коде RGB Led моего профессора. Тем не менее, это вышло совсем не так. По крайней мере, мне удалось скомпилировать мою программу, но ничего не происходит, когда я нажимаю кнопку на макетной плате. Вот подсказка вопроса:
Уличный переход - состоит из уличного фонаря (красный, желтый, зеленый ряд светодиодов), отдельного красного и зеленого светодиодов (ходить/не ходить) и кнопки. При нажатии кнопки загораются красные лампочки и загорается зеленый индикатор ходьбы. В конце концов замигают зеленый и желтый, указывая на то, что время ходьбы истекло, затем загорится красный индикатор «Не ходить» и зеленый индикатор «Светофор».
Вот изображение моей макетной платы: https://imgur.com/a/sI24Wae
Вот изображение таблицы gpio wirepipi: https://raspberrypi.stackexchange.com/questions/40203/pinout-difference
Вот мой код языка ассемблера:
.equ INPUT, 0
.equ OUTPUT, 1
.equ LOW, 0
.equ HIGH, 1
.equ RED_PIN1, 26 // wiringPi 26
.equ YLW_PIN1, 27 // wiringPi 27
.equ GRN_PIN1, 28 // wiringPi 28
.equ RED_PIN2, 24 // wiringPi 24
.equ GRN_PIN2, 25 // wiringPi 25
.equ STP_PIN, 29 // wiringPi 29 - STOP PIN
.equ PAUSE_S, 1 // pause in seconds
.align 4
.section .rodata
out_s: .asciz "%d, r4=%d, r5=%d\n"
.align 4
.text
.global main
main:
//int main()
push {lr} //{
bl wiringPiSetup // wiringPiSetup(): // initialize the wiringPi library
mov r0, #STP_PIN
bl setPinInput
mov r0, #RED_PIN1
bl setPinOutput
mov r0, #GRN_PIN2
bl setPinOutput
lp:
mov r0, #GRN_PIN2
mov r1, #RED_PIN2
mov r2, #PAUSE_S
bl action
cmp r0, #1
beq end_lp
mov r0, #RED_PIN1
mov r1, #YLW_PIN1
mov r2, #PAUSE_S
bl action
cmp r0, #1
beq end_lp
mov r0, #YLW_PIN1
mov r1, #GRN_PIN1
mov r2, #PAUSE_S
bl action
cmp r0, #1
beq end_lp
bal lp
end_lp:
mov r0, #RED_PIN1
bl pinOff
mov r0, #YLW_PIN1
bl pinOff
mov r0, #GRN_PIN1
bl pinOff
mov r0, #0 //return 0:
pop {pc} //}
setPinInput:
push {lr}
mov r1, #INPUT
bl pinMode
pop {pc}
setPinOutput:
push {lr}
mov r1, #OUTPUT
bl pinMode
pop {pc}
pinOn:
push {lr}
mov r1, #HIGH
bl digitalWrite
pop {pc}
pinOff:
push {lr}
mov r1, #LOW
bl digitalWrite
pop {pc}
readStopButton:
push {lr}
mov r0, #STP_PIN
bl digitalRead
pop {pc}
action:
push {r4, r5, lr}
mov r4, r1
mov r5, r2
bl pinOff
mov r0, r4
bl pinOn
mov r0, #0
bl time
mov r4, r0
do_whl:
bl readStopButton
cmp r0, #HIGH
beq action_done
mov r0, #0
bl time
sub r0, r0, r4
cmp r0, r5
blt do_whl
mov r0, #0
action_done:
pop {r4,r5,pc}
Я использую библиотеку wireingPi в своем коде. RED_PIN1, YLW_PIN1 и GRN_PIN1 предназначены для светодиодных индикаторов на правой стороне моей макетной платы. RED_PIN2 и GRN_PIN2 предназначены для светодиодных индикаторов на левой стороне моей макетной платы. Я чувствую себя довольно потерянным в этом проекте и намерен поговорить с моим профессором в рабочее время в эту среду, но я хотел узнать, может ли кто-нибудь из StackOverflow предложить мне предложения. Спасибо за ваше время.