Forum: Mikrocontroller und Digitale Elektronik ATTiny13A: Internen Komparator nutzen


von Chris (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

für ein Projekt will ich einen ATTiny13A nutzen, um ein analoges Signal 
und eine "feste" Referenzspannung (= Poti) mithilfe des Internen 
Komparators zu vergleichen und bei Veränderung des Ausgangs einen 
Interrupt auszulösen.

Wie auch sonst hat das natürlich nicht geklappt, weshalb ich den 
Programmcode auf das minimale heruntergekürzt habe (also kein Interrupt 
sondern pollen von ACO, etc...)

Aber auch mit gekürzen Programmcode klappt es noch nicht (die LED bleibt 
aus, egal wie ich die Potis umstelle, also bleibt ACO dauerhaft auf 0).


Zum Programmieren des ATTiny nutze ich die einen Arduino Nano als ISP 
und den MicroCore (github.com/MCUdude/MicroCore).

Der Programmcode (in gekürzter form) ist wie folgt:
1
#define TOGGLE_OUT 3
2
3
void setup() {
4
  //Disable Digital Input for AIN0 and AIN1
5
  DIDR0 |= bit(AIN0D)
6
    | bit(AIN1D);
7
8
  ADCSRB &= ~bit(ACME);//Analog Comparator Multiplexer Enable = 0
9
10
  ACSR &= ~bit(ACD);//Analog Comparator Disable = 0
11
  ACSR &= ~bit(ACBG);//Analog Comparator Bandgap Select = 0
12
13
  pinMode(TOGGLE_OUT, OUTPUT);
14
  digitalWrite(TOGGLE_OUT, HIGH);
15
  delay(5000);
16
}
17
18
void loop() {
19
  //set led to state of analog comparator
20
  digitalWrite(TOGGLE_OUT, (ACSR & bit(ACO)) == 1);
21
}

Die Schaltung ist als Anhang dabei, falls sich da ein Fehler 
eingeschlichen hat.

Grüße
Chris

von TinyNerd (Gast)


Lesenswert?

Kenne kein Arduino, aber wäre
1
digitalWrite(TOGGLE_OUT, (ACSR & bit(ACO)) != 0);

bzw.
1
digitalWrite(TOGGLE_OUT, (ACSR & bit(ACO)) == ACO);

nicht richtiger?

von Chris (Gast)


Lesenswert?

Oh, da hast du recht. Mit
1
digitalWrite(TOGGLE_OUT, (ACSR & bit(ACO)) != 0);
klappt der Programmcode schon mal. Heißt pollen von ACO würde 
funktionieren, und einrichten vom Komparator klappt soweit auch.

Aber eigentlich wollte ich am liebsten einen Interrupt nutzen, wofür ich 
dann den Programmcode etwas umgeschrieben habe. Leider klappt es immer 
noch nicht (scheint mir so als würde der Interrupt nie feuern)...

Hier der Programmcode (mit Interrupt):
1
#define TOGGLE_OUT 3
2
3
ISR(ANALOG_COMP_vect)
4
{
5
  digitalWrite(TOGGLE_OUT, LOW);
6
}
7
8
void setup() {
9
  setupAnalogComparator();
10
11
  pinMode(TOGGLE_OUT, OUTPUT);
12
  digitalWrite(TOGGLE_OUT, HIGH);
13
}
14
15
void setupAnalogComparator() {
16
  noInterrupts();
17
18
  //Disable Digital Input for AIN0 and AIN1
19
  DIDR0 |= bit(AIN0D)
20
    | bit(AIN1D);
21
22
  ADCSRB &= ~bit(ACME);  //Analog Comparator Multiplexer Enable = 0
23
24
  ACSR &= ~bit(ACD);    //Analog Comparator Disable = 0
25
  ACSR &= ~bit(ACBG);    //Analog Comparator Bandgap Select = 0
26
  ACSR |= bit(ACI);    //Analog Comparator Interrupt Flag = 1 (Clear Flag)
27
  ACSR |= bit(ACIE);    //Analog Comparator Interrupt Enable = 1
28
29
  ACSR &= ~bit(ACIS1);    //Analog Comparator Interrupt Mode Select = 0 (output toggle)
30
  ACSR &= ~bit(ACIS0);    //Analog Comparator Interrupt Mode Select = 0 (^^)
31
32
  interrupts();
33
}


Grüße
Chris

von Chris (Gast)


Lesenswert?

Hat sich wohl erledigt...
Anscheinend muss man beim ATTiny13 (bzw. MicroCore) nicht 
"ANALOG_COMP_vect" als Interruptvektor nutzen sondern stattdessen 
"ANA_COMP_vect".

Heißt aus
1
ISR(ANALOG_COMP_vect)
2
{
3
  digitalWrite(TOGGLE_OUT, LOW);
4
}
muss man
1
ISR(ANA_COMP_vect)
2
{
3
  digitalWrite(TOGGLE_OUT, LOW);
4
}
machen.

Damit funktioniert es dann aber auch einwandfrei, inklusive 
Interrupt-Modus  (also der Mode, der durch ACIS0/1 gesetzt wird)

von Holger L. (max5v)


Lesenswert?

Ich bin in Arduino auch nicht bewandert, aber evtl. ist das die Lösung:

[Datasheet ATtinny13A, S.81]
"When changing the ACIS1/ACIS0 bits, the Analog Comparator Interrupt 
must be disabled by
clearing its Interrupt Enable bit in the ACSR Register. Otherwise an 
interrupt can occur when the
bits are changed."

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.