用覆盆子皮和皮脸迪吉打断

2024-04-20 07:53:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚用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。在


Tags: 代码eventregisteriftimedefcounterglobal
1条回答
网友
1楼 · 发布于 2024-04-20 07:53:06

所以我问题的答案就在我提供的2nd link的评论中。我只需要在终端上运行程序,而不是IDLE3。在

我相信原因在于Linux中如何处理中断。Linux ISR不是真正的ISR,处理器会将ISR置于休眠模式,直到它被调用。有人能解释一下为什么IDLE3不支持中断吗?在

相关问题 更多 >