我刚刚用PiFace数字元素14 I/O板设置了一个Raspberry Pi。到目前为止,我已经完成了几个步骤来让它正常工作,这样我就可以与I/O端口接口(控制LED和操作交换机来完成任务),我编写的python代码运行良好,我可以让它完成任务。在
目前我只是在混日子,对Pi编程有一种感觉,并试图对特性有一个了解。我想为一个简单的6位二进制计数器设置一个状态机,当我告诉它的时候,它会上下计数,我可以很容易地做到这一点。但是当我试图把它提升到下一个层次,并使用中断来设置状态时,我遇到了问题。在
我跟随Manual和{a2}得到激活中断的代码。在
我编写的代码执行时没有错误,但是,要么没有检测到中断,要么它们什么都不做,我不确定是哪个。我的代码在下面。我知道while循环适用于'waiting'和'counting'状态,因为我可以定义初始条件。它很正常,所以我很确定while循环是正常的,只是没有状态变化。在
import pifacedigitalio as pfio
import os
import time
def startCounter(event):
global state
state = 'counting'
print('counter started')
def stopCounter(event):
global state
state = 'waiting'
def stopProg(event):
global state
state = 'stop'
def resetCounter(event):
global state
state = 'reset'
def setLEDs(stateArray):
i = 0
for state in stateArray:
pfio.digital_write(i,state)
i = i + 1
def calcBools(count):
binString = bin(count).rsplit('0b')[1]
stringLength = len(binString)
zeroString = '0' * (8 - stringLength)
newString = zeroString + binString
i = 0
boolsOut = [0,0,0,0,0,0,0,0]
for bit in newString:
if bit == '1':
boolsOut[i] = 1
i = i + 1
return boolsOut
####################
### MAIN PROGRAM ###
####################
pfio.init()
pifacedigital = pfio.PiFaceDigital()
listener = pfio.InputEventListener(chip=pifacedigital)
signalDirection = pfio.IODIR_RISING_EDGE
listener.register(0, signalDirection, stopProg)
listener.register(1, signalDirection, startCounter)
listener.register(2, signalDirection, stopCounter)
listener.register(3, signalDirection, resetCounter)
listener.activate()
counter = 0
running = True
state = 'waiting'
setLEDs([0,0,0,0,0,0,0,0])
direction = 'up'
while(running):
if state == 'stop':
running = False
listener.deactivate()
counter = 0
elif state == 'waiting':
time.sleep(1)
print('waiting...')
elif state == 'counting':
if direction == 'up':
counter = counter + 1
else:
counter = counter - 1
if counter > 63:
direction = 'down'
elif counter == 0:
direction = 'up'
elif state == 'reset':
counter = 0
else:
time.sleep(0.1)
setLEDs(calcBools(counter))
print(counter)
time.sleep(0.25)
因此,这段代码不起作用,我尝试了其他一些同样无法使用pifacecommon库的方法,将一些代码行替换为:
^{pr2}$在此之后,两个方法的侦听器命令是相同的。同时,我试图使用pfc.mcp23s17。写下命令,但显然它不存在或是一些愚蠢的借口。在
如果你有更多的阅读请提前回复我!在
-本
编辑(已解决):我的答案是在我提供的第二个链接的注释中:(原来我写的东西都是正确的,我只需要从终端运行文件,而不是IDLE3。在
所以我问题的答案就在我提供的2nd link的评论中。我只需要在终端上运行程序,而不是IDLE3。在
我相信原因在于Linux中如何处理中断。Linux ISR不是真正的ISR,处理器会将ISR置于休眠模式,直到它被调用。有人能解释一下为什么IDLE3不支持中断吗?在
相关问题 更多 >
编程相关推荐