Пример #1
0
        private void UpdateInterrupts()
        {
            for (var i = 0; i < State.Length; ++i)
            {
                var externalPin = targetExternalPins[i];
                if (!interruptEnable[externalPin])
                {
                    continue;
                }
                var isEdge = State[i] != previousState[externalPin];
                previousState[externalPin] = State[i];
                if (isEdge && State[i] == (interruptTriggers[externalPin] == InterruptTrigger.RisingEdge))
                {
                    externalInterrupt[externalPin] = true;
                }
                //no clear as it must be set manually with InterruptFlagClear
            }

            var even = false;
            var odd  = false;

            for (var i = 0; i < interruptEnable.Length; i += 2)
            {
                even |= externalInterrupt[i];
            }
            for (var i = 1; i < interruptEnable.Length; i += 2)
            {
                odd |= externalInterrupt[i];
            }
            EvenIRQ.Set(even);
            OddIRQ.Set(odd);
        }
Пример #2
0
 private void InnerReset()
 {
     registers.Reset();
     configurationLocked = false;
     EvenIRQ.Unset();
     OddIRQ.Unset();
     for (var i = 0; i < NumberOfExternalInterrupts; ++i)
     {
         externalInterrupt[i] = false;
         interruptEnable[i]   = false;
         interruptTriggers[i] = InterruptTrigger.None;
     }
     for (var i = 0; i < targetExternalPins.Length; ++i)
     {
         targetExternalPins[i] = 0;
     }
     for (var i = 0; i < externalInterruptToPinMapping.Length; ++i)
     {
         //both arrays have the same length
         externalInterruptToPinMapping[i]  = i % 4;
         externalInterruptToPortMapping[i] = 0;
     }
 }