mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt entprellen


Autor: herbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Ich will mit einem Programm eine Spannung überwachen. Wenn die 
Eingangsspannung größer als die Refernzspannung ist soll ein Interrupt 
ausgelöst werden und eine Variabel inkrementiert werden. Nun zu meinem 
Problem: wenn die Eingangsspannung die Rfernzspannung erreicht wird mehr 
mals der Interrupt ausgelöst. Wie kann ich den Interrupt entprellen?

Source Code:

#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++;                         
  }
}

int i = 0;
char buffer[20];

SIGNAL(SIG_COMPARATOR)
{
  i++;
  sprintf(buffer, "Impulse: %d \r\n", i);
   UART_putstr(buffer);
}



int main(void)  // Hauptfunktion
{


  UART_Init();        // UART initialisieren

  DDRD = 0x00;
  PORTD =0x00;

  ACSR |= ( (1<<ACIS0) | (1<<ACIS1) | (1<<ACIE));
  ACSR &= ~( (0<<ACI) | (0<<ACD));
  

  sei();
;
  
  while(1)      // Arbeitsschleife ist leer
  {
  
  

  } //end while(1)

} // Ende main



Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ herbert (Gast)

>Problem: wenn die Eingangsspannung die Rfernzspannung erreicht wird mehr
>mals der Interrupt ausgelöst. Wie kann ich den Interrupt entprellen?

Entweder per Software oder mit einem exteren Comparator mit Hysterese.

Entprellung
Schmitt-Trigger

MFG
Falk

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt eine Software- und eine Hardwarelösung. Welche soll es denn 
sein?

MW

Autor: herbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Software wäre mir lieber.
(Die Eingangsspannung muss ca. 500 mal pro Sekunde abgetastet werden)

Mfg. herbert

Autor: Christian F. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
z.B. nur jeden 5ten oder x-ten Interrupt auswerten, oder im jeweiligen 
Interrupt das ADC Register auslesen und mit einem kurzen Timer 
überprüfen ob sich der Wert nochmals verändert und dann die ausgaben 
machen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ herbert (Gast)

>Software wäre mir lieber.
>(Die Eingangsspannung muss ca. 500 mal pro Sekunde abgetastet werden)

Bei Abtastung prellt nix. Denn da hast du einen festen Timerinterupt mit 
2ms und liest einfach den Status des Comparators aus. Fertig. Ohne 
Comparator-Interrupt.

MFG
Falk

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das jetzt richtig gesehen habe, ist es der Analog-Komparator 
Interrupt. 500 x in der Sekunde entspricht 2 ms. Wenn der Interrupt 
kommt, starte einen Timer für eine gewisse Zeit in der kein Int kommen 
darf. Nach Ablauf ist das Signal entweder stabil (Timer Int wurde nicht 
unterbrochen) oder es kommen weitere Ints (Rauschen). Hardware wäre mir 
sicherer (nur 1 Widerstand, evtl. mit einem C gegen Ripple).

MW

Autor: herbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort. Kannst du mir bitte die Hardware Lösung genauer 
erklären?
Mfg. Herbert

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Eingangsspannung fast gleich der Schwellspannung ist, kannst Du 
Dich auf den Kopf stellen, der Komparator wird immer zappeln.

Wenn dieser Bereich garantiert innerhalb einer Maximalzeit durchfahren 
wird, kannst Du mit einer größeren Zeit (>2-fach) als Abtastintervall in 
Software entprellen.

Ansonsten brauchst Du ne Hysterese und das geht nur in Hardware durch ne 
Mitkopplung vom Komparatorausgang auf den +Eingang.


Peter

Autor: herbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für deine antwort peter. dann bleibtmir wohl nichts anderes über 
als die Hardware version zu implementieren.

Mfg. Herbert

Autor: Peter H. (pehe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Herbert,

die Hardwarelösung kommt auch ohne externen Operationsverstärker (s. 
Bild im Schmitt-Trigger Artikel)aus, man ersetze ihn durch den AVR:
die Eingänge + und - sind sowieso schon bei Dir angeschlossen, und der 
Rückkopplungswiderstand (R3) wird an einen Portausgang angeschlossen.
Zum Verschieben der Schaltschwelle, also zur Erzeugung einer Hysterese, 
kann in der Interruptroutine dieser Port auf VCC, GND oder Tristate 
geschaltet werden - je nachdem, was sinnvoll ist.
Wenn die Ausgangsimpedanz der Quelle für das IN Signal einigermaßen 
paßt, kann R3 auch an den - Eingang angeschlossen werden, die Hysterese 
entsteht dann durch Veränderung des zu messenden Signals.

Noch eine Anmerkung zu Deiner Interruptroutine: sprintf() und 
UART_putstr() sollten dort nicht enthalten sein, die haben u.U. lange 
Laufzeiten, und der UART kann -je nach Implementierung von putstr- die 
Interruptroutine für lange Zeit blockieren. Rechne doch mal nach, ob Dir 
dabei nicht Meßwerte verloren gehen.

Tip: Für die Simulation solcher Schaltungen bietet sich VMLab an, falls 
Du es nicht sowieso schon kennst (kostenlos).


Gruß,
Peter H.

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.