mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analog Comparator Tiny13


Autor: Mr. X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte, dass mein Tiny13 bei jeder Flanke an ADC1 (verglichen mit 
der internen Referenzspannung) einen Interrupt auslöst und einen anderen 
Pin togglet.

Hier ist mein Code:
#include <avr/io.h>
#include <avr/interrupt.h>

char on = 0;
void toggleLED()
{
  if (on == 0)
  {
    PORTB |=  (1<<PB4);
    on = 1;
  }
  else
  {
    PORTB &= ~(1<<PB4);
    on = 0;
  }
}

ISR (ANA_COMP_vect)
{
  toggleLED();
}

int main()
{
  ADCSRA &=~(1 << ADEN);
  ADCSRB |= (1 << ACME);

  ADMUX = (1 << MUX0);

  ACSR = (0 << ACD) | (1 << ACBG) | (1 << ACIE) | (1 << ACIS1) | (1 << ACIS0);

  sei();

  while (1) { }
}

Leider togglet der Pin PB4 nicht. Was mache ich falsch?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ich möchte, dass mein Tiny13 bei jeder Flanke an ADC1 (verglichen mit...

Datenblatt:

ACIS1  ACIS0     Interrupt Mode
  1      1       Comparator Interrupt on Rising Output Edge.

MfG Spess

Autor: Mr. X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,

aber dann müsste er trotzdem mit halber Frequenz blinken. Der Interrupt 
wird aber garnicht ausgelöst!

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

Bewertung
0 lesenswert
nicht lesenswert
Toggeln macht man mit einem EXOR, da braucht man auch keine zusätzliche 
Variable.
PORTB ^= 1 << PB4;
macht das, wofür Du oben ne ganze Funktion geschrieben hast...

Wenn da allerdings an dem Pin tasächlich etwas nach außen sichtbares 
passieren soll, wäre es vielleicht sinnvoll, den Port auch als Ausgang 
zu konfigurieren...

Autor: Mr. X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Hinweis! :-)

Aber mein eigentliches Problem löst das nicht... :-(

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest noch den Portpin als Ausgang programmieren (das war das, was 
Johnny meinte)

Autor: Mr. X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,

ich habe als erste Zeile in
main()
 folgendes eingefügt:
    DDRB |= (1 << PB4);

Damit ist PB4 als Ausgang definiert. Ich kann den Pin auch normal 
togglen (in der while-Schleife, mit Delays dazwischen). Das Problem 
liegt wirklich darin, dass der Interrupt nicht ausgelöst wird. Ich habe 
eine Dreieckspannung mit 0,5Hz von 0V bis 3V an ADC1 gelegt. Die ISR 
müsste also wirklich aufgerufen werden. Tut sie aber nicht.

Autor: Diensthabender Troll (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mister Icks, meinst Du, dass Du mit Versuch und Irrtum bei penetranter 
Vermeidung eigenen analytischen Denkens jemals zum Erfolg kommen wirst? 
Solange Du nicht verstehst, was Du da tust, wird das sowiso nichts. Wenn 
es (noch) zu hoch für Dich ist, dann beginne mit kleineren Dingen.

TvD

Autor: Mr. X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, es funktioniert. War ein Hardware-Problem in der Schaltung.

Jetzt wird die ISR aufgerufen, jedoch immer zweimal. Das merke ich 
daran, dass die LED nicht (bei 0,5Hz Dreieckspannung) an und ausgeht 
sondern mit 1Hz blitzt. Ich denke, dass hier eine kleine Hysterese nicht 
schlecht wäre. Oder mache ich etwas anderes falsch, dass die ISR immer 
zweimal aufgerufen wird?

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.