22 _irqSystem(irqSystem),
37 irqSystem.DebugVerifyInterruptVector(_vector0,
this);
41 return _pcifr & (1<<pcifrBit);
72 cerr <<
"HWPcir: invalid PCIFR bit specified.." << endl;
79 if(_pcifr & (1<<pcifrBit)){
84 _pcifr |= (1<<pcifrBit);
86 unsigned vector = convertBitToVector(pcifrBit);
88 if(vector == (
unsigned)~0){
89 cerr <<
"HWPcir: Attempt to set invalid pin-change interrupt." << endl;
93 if(_pcicr & (1<<pcifrBit)){
94 _irqSystem.SetIrqFlag(
this,vector);
105 for(
unsigned i=0;i<8;++i){
112 unsigned vector = convertBitToVector(i);
113 _irqSystem.ClearIrqFlag(vector);
127 unsigned char pcicrChanges = _pcicr ^ val;
128 for(
unsigned i=0;i<8;++i){
129 if(pcicrChanges & (1<<i)){
135 unsigned vector = convertBitToVector(i);
136 _irqSystem.SetIrqFlag(
this,vector);
143 unsigned vector = convertBitToVector(i);
144 _irqSystem.ClearIrqFlag(vector);
163 if(vector == _vector0){
165 _irqSystem.ClearIrqFlag(vector);
168 if(vector == _vector1){
170 _irqSystem.ClearIrqFlag(vector);
173 if(vector == _vector2){
175 _irqSystem.ClearIrqFlag(vector);
178 if(vector == _vector3){
180 _irqSystem.ClearIrqFlag(vector);
183 if(vector == _vector4){
185 _irqSystem.ClearIrqFlag(vector);
188 if(vector == _vector5){
190 _irqSystem.ClearIrqFlag(vector);
193 if(vector == _vector6){
195 _irqSystem.ClearIrqFlag(vector);
198 if(vector == _vector7){
200 _irqSystem.ClearIrqFlag(vector);
203 cerr <<
"HWPcir: Attempt to clear non-existent irq vector";
209 unsigned pcifrBit)
throw():
213 pcmsk_reg(core,
"PINCHANGE.PCMSK",
229 if(_pcmsk & (1<<bit)){
230 _pcifrApi.setPcifr(_pcifrBit);
238 _pcmskPinApi(pcmskPinApi),
243 pin.RegisterCallback(
this);
247 bool currentState = (bool)*pin;
248 if(currentState == _prevState){
252 _prevState = currentState;
254 _pcmskPinApi.pinChanged(_pcmskBit);
void setPcifr(unsigned pcifrBit)
Basic AVR device, contains the core functionality.
HWPcmsk(AvrDevice *core, HWPcifrApi &pcifrApi, unsigned pcifrBit)
Pin class, handles input and output to external parts.
unsigned char getPcicrMask()
bool getPcifr(unsigned pcifrBit)
HWPcir(AvrDevice *avr, HWIrqSystem &irqSystem, unsigned vector0=~0, unsigned vector1=~0, unsigned vector2=~0, unsigned vector3=~0, unsigned vector4=~0, unsigned vector5=~0, unsigned vector6=~0, unsigned vector7=~0)
PinChange(Pin &pin, HWPcmskPinApi &pcmskPinApi, unsigned pcmskBit)
void setPcicrMask(unsigned char val)
void PinStateHasChanged(Pin *)
unsigned convertBitToVector(unsigned bit) const
void setPcifrMask(unsigned char val)
void pinChanged(unsigned bit)
unsigned char getPcifrMask()
unsigned char getPcmskMask()
void setPcmskMask(unsigned char val)
void ClearIrqFlag(unsigned int vector)