mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik externer Interrupt steigende Flanke


Autor: carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich möchte mittels externen Interrupt Impulse zählen. Bei steigender 
Flanke soll ein Interrupt ausgelöst werden. Wenn die Impulse eine kurze 
Dauer haben funktioniert das auch wunderbar. Bei längeren Impulsen wird 
leider bei steigender und bei fallender Flanke ein Interrupt ausgelöst.

Interruptkonfiguration:

  GICR |= (1<<INT0);
  GICR &= ~((1<<IVSEL)|(1<<IVCE));

  MCUCR |= ((1<<ISC01)|(1<<ISC00));

Kann mir bitte jemand sagen wieso bei längeren Impulsen der Interrupt 
bei fallender Flanke auch ausgelöst wird?

Mfg. Carl

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welcher Prozessor?

vielleicht prellt die fallende Flanke?

Autor: carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
atmega8 verwende ich mit einem 3.684Mhz Quarz

Autor: carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich die fallende Flanke entprellen?
Mfg. Carl

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wie kann ich die fallende Flanke entprellen?

Kommt drauf an was du am Interrupt Pin angeschlossen hast.
Bei mechanischen Kontakten hilft nur eine längere Zeit warten.

Autor: carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
am interrupt pin ist der ausgang eines komperators angeschlossen

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was für einen Komparator? Und was vergleicht der?
Gib doch mal die Schaltung preis..

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Komparator zum Schmitt-Trigger umbauen, d.h. eine Hysterese 
einbauen, damit Rauschen an der Schaltgrenze kein Bündel von 
Flankenwechseln auslöst.

Autor: carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich verwende den internen komperator dey µC.



#include <avr/io.h>  // Deklarationen
#include <stdio.h>

#define BAUD 9600  // Symbol fuer Baudrate
#define TAKT 3686400  // Symbol fuer Controllertakt
#define TEILER (long)TAKT/(16*(long)BAUD) - 1   // Symbol fuer Teiler

#include <avr/interrupt.h>
//#include <avr/signal.h>



void UART_Init(void)  // UART initialisieren
{
  UBRRL = TEILER;      // Baudrate einstellen
  UCSRB |= (1<<RXEN);    // Empfaenger ein
  UCSRB |= (1<<TXEN);    // Sender ein
  UCSRB |= (1<<RXCIE);  // Empfaengerinterrupt frei
}


void UART_putch(unsigned char data)         // warten und Zeichen nach Sender  
{
  //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313
  while (!(UCSRA&0x20));
  //sende
  UDR = data;
}


void UART_putstr(unsigned char *zeiger)    // String bis Endemarke ausgeben
{
  while (*zeiger != 0)
  {
    while (!(UCSRA&0x20));    // warte bis Datenregister frei
    UDR = *zeiger;        // Zeichen nach Sendedatenregister
    zeiger++;                         
  }
}




SIGNAL(SIG_INTERRUPT0)
{
  
    UART_putstr("steigende Flanke \r\n");
  
}

int main(void)  // Hauptfunktion
{


  UART_Init();        // UART initialisieren

  /*
     PD2 mit PC0 verbinden
     PD6 mit POTI
     PD7 mit Sensor braun
     PC0 mit PD2 verbinden
     PC1 mit LED auf AVR Platine verbindne
     PC2 mit LED auf Sensor schwarz

     grau, weiß auf +5V
     violett GND
  */


  DDRD &= ~((1<<PB2)|(1<<PB6)|(1<<PB7));
  PORTD&= ~((1<<PB2)|(1<<PB6)|(1<<PB7));

  
  DDRC |= ((1<<PC0)|(1<<PC1)|(1<<PC2));
  PORTC |= ((1<<PC0)|(1<<PC1));
  PORTC &= ~(1<<PC2);

  GICR |= (1<<INT0);
  GICR &= ~((1<<IVSEL)|(1<<IVCE));

  MCUCR |= ((1<<ISC01)|(1<<ISC00));


  sei();


  ACSR &= ~((1 << ACD)|(1 << ACBG));


  
  while(1)      // Arbeitsschleife ist leer
  {

    if(bit_is_set(ACSR,5)==0)
    {
      PORTC |= ((1<<PC0)|(1<<PC1));
      PORTC &= ~(1<<PC2);
    }

    else 
    {
      PORTC &= ~((1<<PC0)|(1<<PC1));
      PORTC |= (1<<PC2);
    }
    
    
  } //end while(1)

} // Ende main



Autor: Frank B_. (frank_b) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was nu ? INT0 oder Komparator. Im Programm hast Du die ISR auf INT0 
liegen,
machst aber auch Einstellungen für den Komparator.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der interne Komparator hat einen eigenen Interrupt, der ebenfalls auf 
fallende oder steigende Flanke konfigurierbar ist. Das was Du da machst, 
macht so keinen Sinn.

BTW:
SIGNAL ist veraltet. Nimm ISR und die dazu passenden Vektornamen. Schau 
Dir mal Kapitel 19 im AVR-GCC-Tutorial und die libc-Dokumentation 
an.

Autor: Ingmar Rosenhagen (irosenhagen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.