Analog Comparator Tiny13

Gast #1193693
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:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
char on = 0;
5
void toggleLED()
6
{
7
  if (on == 0)
8
  {
9
    PORTB |=  (1<<PB4);
10
    on = 1;
11
  }
12
  else
13
  {
14
    PORTB &= ~(1<<PB4);
15
    on = 0;
16
  }
17
}
18

19
ISR (ANA_COMP_vect)
20
{
21
  toggleLED();
22
}
23

24
int main()
25
{
26
  ADCSRA &=~(1 << ADEN);
27
  ADCSRB |= (1 << ACME);
28

29
  ADMUX = (1 << MUX0);
30

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

33
  sei();
34

35
  while (1) { }
36
}
37

38
Leider togglet der Pin PB4 nicht. Was mache ich falsch?
Gast #1193707
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
#1193755
Toggeln macht man mit einem EXOR, da braucht man auch keine zusätzliche 
Variable.
1
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...
Gast #1193778
Ok,

ich habe als erste Zeile in
1
main()
 folgendes eingefügt:
1
    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.
Gast #1193815
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
Gast #1193853
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.