我试图让一个引脚上的输出与另一个播放 a 的输出相关tone()
,但有 35us @8MHz 或 158us @1MHz 时钟的延迟。似乎有一个固定的 16us +142 个时钟周期延迟,因为延迟与时钟频率不成反比。它们非常非常长!为什么?
这是代码:
/* Per ATTINY85:
1: I/O5 PB5 A0 RS
2: I/O3 PB3 A3 - Geiger inverted earphone out
3: I/O4 PB4 A2 - Geiger earphone out
4: GND
5: I/O0 PB0 MOSI SDA - Battery test/Geiger LED out
6: I/O1 PB1 MISO
7: I/O2 PB2 A1 SCLK SCL INT0 - Geiger probe in (via NPN transistor)
8: Vcc
*/
#include<avr/sleep.h>
byte state;
volatile byte P;
int B;
int Bo;
byte LED=0;
unsigned long t=0;
void particella()
{
P=1;
}
ISR(PCINT0_vect)
{
if (!(PINB & (1<<PB4)))
PORTB |= (1<<PB3);
else
PORTB &= ~(1<<PB3);
}
void setup()
{
pinMode(0, OUTPUT); // Al LED.
pinMode(2, INPUT); // Dal transistor dal tubo Geiger.
pinMode(2, INPUT_PULLUP); // Pull-up per il collettore del transistor.
pinMode(4, OUTPUT); // All'auricolare.
pinMode(3, OUTPUT); // All'auricolare (copia invertita del 4).
GIMSK = 0x60; // turns on external and pin change interrupts.
PCMSK = 0x10; // turn on interrupts on pin PB4.
sei(); // set interrupts (enable).
tone(4,2000,100); // Power on beep
PORTB|=0b00000001;
delay(700);
PORTB&=0b11111110;
delay(1000);
readVcc();
for(byte n=1; n<=state; n++)
{
PORTB|=0b00000001; // Accende il LED su I/O0 = PB0
tone(4,2000,25); // Bip acuto a ogni lampo.
delay(30);
PORTB&=0b11111110; // Spegne il LED su I/O0 = PB0
delay(250);
}
delay(350);
attachInterrupt(0, particella, FALLING);
}
void loop()
{
if(P)
{
P=0;
t=millis();
PORTB|=0b00000001; // Accende il LED su I/O0 = PB0
LED=1;
tone(4,1000,5); // Fa TIC nell'auricolare.
}
if(millis()-t>=10 && LED==1)
{
LED=0; PORTB&=0b11111110; // I/O0 = PB0 LED OFF after 10ms.
}
}