www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analog Comparator löst keinen IRQ aus


Autor: Martin Zunke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich versuche, einen Ultraschallsensor über den Analog-Comparator  des
ATmega8535 auszuwerten. D.h., wenn er etwas empfängt, soll der AC in
der entsprechenden Frequenz (40 kHz) Interrupts auslösen.

Ich habe den negativen Eingang auf Masse gelegt, den positiven Eingang
mit dem Sensor, und dann auch mal mit einem Funktionsgenerator,
verbunden. Da müßte er doch bei der geringsten
Gelegenheit zucken, oder?! Es wird aber kein Interrupt ausgelöst. Was
mache ich falsch?

Bisher:

PortB als Input, Pull-ups ausgeschaltet (laut Atmel-Doku, an PortB
liegen die Eingänge des AC: AIN0 und AIN1)

AC mit IRQ enabled und IRQ bei toggle gestartet

globale IRQ enabled, Endlosschleife

in der Routine (SIG_COMPARATOR) soll später ein Zähler inkrementiert
werden

Passiert aber nix... bitte helft mir. Habe ich einen Denkfehler?

QUELLTEXT:

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

#define START_AC 0xAB /* 10001011 (ACSR)*/

/* INTERRUPTHANDLER Analog Comparator */
SIGNAL(SIG_COMPARATOR)
{
  sbi(PORTA,PA0); /* LED anschalten */
}

void main(void)
{
  outp(0xFF,DDRA); /* Port A as output */
        cbi(PORTA,PA0);  /* eine LED ausschalten, die beim
                            Ausführen des IRQ Handlers
                      angeschaltet wird */

  outp(0x00,DDRB); /* Port B as input */
  outp(0x00,PORTB);/* switch internal pull-up's off*/

  /* Comparator starten */
  outp(START_AC,ACSR);

        /* globaler Interrupt enable */
  sei();

  /* neverending loop */
  for(;;);
}

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du solltest den -Eingang nicht auf Masse legen, sondern eine kleine
Mindestspannung anlegen.

Autor: Martin Zunke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, will ich später, wenn ich den Wert genauer kenne (wird was zwischen
100..300 mV werden) auch tun. Aber meinst Du, das es daran liegt?
Theoretisch ist doch einfach jede Spannung größer Masse, also müßte er
doch wenigstens irgendwann mal auslösen...

Autor: Martin Zunke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...habe es aber probiert. 100mV an den negativen Eingang.
Das Signal am positiven gibt über den Sensor 0.2 Vrms (schwingt).
Müßte also passen....

Tuts aber immer noch nicht.

???

Autor: Martin Zunke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...habs gefunden, die zur Kenntnisnahme:

Es ist extrem wichtig, in welcher Reihenfolge das Register des AC
beschrieben wird:

        /*Interrupt disablen*/
        outp((0<<ACIE),ACSR);
        /* Comparator ausschalten*/
  outp((1<<ACD),ACSR);

  /* modus setzen (rising edge) */
  outp((1<<ACIS0),ACSR);
  outp((1<<ACIS1),ACSR);
  /* ACI clearen (optional) */
  outp((0<<ACI),ACSR);

  /* AC anschalten */
  outp((0<<ACD),ACSR);
        /* JETZT ERST Interrupt enablen */
  outp((1<<ACIE),ACSR);

Das in der Mitte kann natürlich auch in einem Rutsch passieren.
...und dann klappts ooch mit'm nachbarn

:-) mz

Autor: Jürgen Lang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nehme an, du willst mit outp((0<<ACD),ACSR) das einzelne bit ACD
löschen. Tatsächlich werden aber alle gelöscht! Es wird immer ein
komplettes Byte geschrieben. 0<<ACD ist übrigens das gleiche wie 0 (die
Null wird um ACD Stellen nach links verschoben und ist immer noch
Null). Du kannst alle Bits sofort in einem Rutsch so setzen wie du
willst:
outp((1<<ACIS0)+1<<ACIS1)+(1<<ACIE),ACSR)
(ist zumindest in asm so; wird in C wahrscheinlich nicht viel anders
sein)

Autor: Martin Zunke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jau!!

Jürgen rulez!

Jetzt erhebt sich die Frage, warum überhaupt was ging...?!

Naja, das gucke ich morgen..


Danke nochma....

mz

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.