Below in the function oneMillisecondDelay, delay(1) does generate a one millisecond delay, but in the function tenMillisecondDelay, delay(10) generates only a two millisecond delay.
I am using a scope to see what is happening
void setup()
{
pinMode(0, INPUT_PULLUP);
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, OUTPUT);
pinMode(9, INPUT_PULLUP);
pinMode(10, OUTPUT);
}//endof setup
// the loop function runs over and over again forever
void loop()
{
volatile int val = 1;
volatile unsigned int PatsDelay = 0x00;
val = digitalRead(9);
if (val == 0)
{
//tenMicrosecondDelay();
if (digitalRead(0) == 0) PatsDelay = 0xFE;
if (digitalRead(1) == 0) PatsDelay = 0xFD;
if (digitalRead(2) == 0) PatsDelay = 0xFB;
if (digitalRead(3) == 0) PatsDelay = 0xF7;
if (digitalRead(4) == 0) PatsDelay = 0xEF;
if (digitalRead(5) == 0) PatsDelay = 0xDF;
if (digitalRead(6) == 0) PatsDelay = 0xBF;
if (digitalRead(7) == 0) PatsDelay = 0x7F;
switch (PatsDelay)
{
case 0xFE:
oneMicrosecondDelay();
break;
case 0xFD:
tenMicrosecondDelay();
break;
case 0xFB:
hundredMicrosecondDelay();
break;
case 0xF7:
oneMillisecondDelay();
break;
case 0xEF:
tenMillisecondDelay();
break;
case 0xDF:
hundredMillisecondDelay();
break;
case 0xBF:
oneSecondDelay();
break;
case 0x7F:
tenSecondDelay();
break;
}//endof switch
}//endof if val == 0
}//endof main
void oneMicrosecondDelay()
{
asm volatile("cli");
PORTB = PORTB | 0x01;
asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");
PORTB = PORTB & 0xFE;
asm volatile("sei");
//flash LED for 1/2 second
PORTB = PORTB | 0x04;
delay(500);
PORTB = PORTB & 0xFB;
delay(3000);
}
void tenMicrosecondDelay()
{
asm volatile("cli");
PORTB = PORTB | 0x01;
delayMicroseconds(10);
PORTB = PORTB & 0xFE;
asm volatile("sei");
//flash LED for 1/2 second
PORTB = PORTB | 0x04;
delay(500);
PORTB = PORTB & 0xFB;
delay(3000);
}
void hundredMicrosecondDelay()
{
asm volatile("cli");
PORTB = PORTB | 0x01;
delayMicroseconds(100);
PORTB = PORTB & 0xFE;
asm volatile("sei");
//flash LED for 1/2 second
PORTB = PORTB | 0x04;
delay(500);
PORTB = PORTB & 0xFB;
delay(3000);
}
void oneMillisecondDelay()
{
asm volatile("cli");
PORTB = PORTB | 0x01;
delay(1);
PORTB = PORTB & 0xFE;
asm volatile("sei");
//flash LED for 1/2 second
PORTB = PORTB | 0x04;
delay(500);
PORTB = PORTB & 0xFB;
delay(3000);
}
void tenMillisecondDelay()
{
asm volatile("cli");
PORTB = PORTB | 0x01;
delay(10);
PORTB = PORTB & 0xFE;
asm volatile("sei");
//flash LED for 1/2 second
PORTB = PORTB | 0x04;
delay(500);
PORTB = PORTB & 0xFB;
delay(3000);
}
void hundredMillisecondDelay()
{
asm volatile("cli");
PORTB = PORTB | 0x01;
delay(100);
PORTB = PORTB & 0xFE;
asm volatile("sei");
//flash LED for 1/2 second
PORTB = PORTB | 0x04;
delay(500);
PORTB = PORTB & 0xFB;
delay(3000);
}
void oneSecondDelay()
{
asm volatile("cli");
PORTB = PORTB | 0x01;
PORTB = PORTB | 0x04;//LED on
delay(1000);
PORTB = PORTB & 0xFE;
PORTB = PORTB & 0xFB;//LED off
asm volatile("sei");
delay(3000);
}
void tenSecondDelay()
{
asm volatile("cli");
PORTB = PORTB | 0x01;
PORTB = PORTB | 0x04;//LED on
delay(10000);
PORTB = PORTB & 0xFE;
PORTB = PORTB & 0xFB;//LED off
asm volatile("sei");
delay(3000);
}
