Analog Comparator Tiny13

Gast #1193693
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:
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?
#1193755
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
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
Gast #1193853
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

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.

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.