Forum: Mikrocontroller und Digitale Elektronik Nadelimpulse 18uS sicher an INT Pin erkennen


von Nadel (Gast)


Lesenswert?

Hallo,

ich habe 8 Signalquellen, die einen Nadelimpuls von 18uS High mit einer 
Freq bis max 1KHz ausgeben. Diese würde ich gerne mit einem Mega644 
erfassen und die Impulse je Sekunde aufaddieren.
Erkennt der Mega644 an seinen interruptfähigen Eingängen die 
Nadelimpulse von 18uS sicher?
Dass die entsprechende Interruptroutine kurz sein sollte ist klar.

Viele Grüße

Die Nadel

von spess53 (Gast)


Lesenswert?

Hi

Lt. Datenblatt:

Minimum pulse width for asynchronous external interrupt    50 ns

MfG Spess

von Ich (Gast)


Lesenswert?

Datenblatt Seite 61- Table 11-2

Minimum pulse width for asynchronous external interrupt:  50ns

Evtl. mal genau mit dem Kapitel des Datenblattes beschäftigen, welches 
man braucht ;)

von Nadel (Gast)


Lesenswert?

Perfekt, danke!

von DIETER (Gast)


Lesenswert?

Hey Nad(d)l, HIER IST  Dieter :-D

von Peter D. (peda)


Lesenswert?

Etwas tricky ist, 8 Eingänge mit 8 verschiedenen Interruptvektoren zu 
finden.

Die Pin-Change-Eingänge reagieren auf beide Flanken, d.h. da mußt Du ne 
Totzeit >18µs programmieren, damit nur eine Flanke zählt.


Peter

von Nadel (Gast)


Lesenswert?

Ich hatte vor, mir den Status der 8 Bits in einer 8 Bit Variable in der 
Int-Routine zu sichern und dann zu vergleichen ob die Pins von 0->1 
gewechselt haben. Damit umgeht man auch das Problem, dass auftreten 
würde, wenn 2 oder mehr der Impulse überlappend auftreten und JEWEILS 2 
mal den Int auslösen.

von Nadel (Gast)


Lesenswert?

Hallo

nur zur Info, habe das Problem mit folgender ISR zur vollsten 
zufriedenheit lösen können

volatile uint8_t g_pinc;
volatile uint8_t g_ticks[8];

void init(void)
{
  uint8_t i;

  //Input
  DDRC = 0x00;
  PORTC = 0xFF;

  // External Interrupt
  PCICR |= (1<<PCIE2);
  PCMSK2 = 0xFF;

  // Misc
  for (i=0; i<8; i++)
  {
    g_ticks[i] = 0;
  }
  g_pinc = 0xFF;
  sei();
}

// External Interrupt from PORT C
ISR(SIG_PIN_CHANGE2)
{
  uint8_t l_pinc, l_new_ticks, i;
  l_pinc = PINC;
  l_new_ticks = (l_pinc ^ g_pinc) & (~l_pinc);
  if (l_new_ticks)
  {
    for (i=0; i<8; i++)
    {
      g_ticks[i] += (l_new_ticks & 0x01);
      l_new_ticks >>= 1;
    }
  }
  g_pinc = l_pinc;

}

von Achso (Gast)


Lesenswert?

Du willst nicht die ca. 18µs Werte addieren, sondern die Ereignisse mit 
max. 1kHz zählen. Dann ist die Geschichte unkritisch.

von Klaus (Gast)


Lesenswert?

18 Mikrosievert? Also das wird schwer ohne zusätzliche Hardware zu 
detektieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.