Forum: Mikrocontroller und Digitale Elektronik Attiny45 ADC


von Anfänger (Gast)


Lesenswert?

Hallo liebe Community,

ich habe bereits kleine Programme in C geschrieben, aber hier komme ich 
einfach nicht weiter; ich möchte den Umgang mit dem ADC des Attiny45 
lernen und habe dazu ein Testprogramm geschrieben.
Der ADC soll im Freerunning Mode laufen und in der ISR eine Variable mit 
dem Wert des Registers ADCH besetzt werden. Bei Sannungen über 2,5V soll 
eine LED an PB0 ein-, unter 2,5V ausgeschaltet werden.

Im fertigen Steckbrett bleibt die LED aber einfach aus; ich habe bereits 
die LED an Vcc gehängt, sie funktioniert, auch die an PB2 vom Poti 
abgegriffene Spannung stimmt. Der Reset Pin liegt auf Vcc.

Ich gehe daher von einem Fehler im Code aus, finde ihn aber nicht.
Könnt ihr mir helfen?

[c]
#include <avr/io.h>
#include <avr/interrupt.h>

volatile int i = 0;
int main(void)
{
  ADMUX |= (0<<REFS0) | (0<<REFS1) | (1<<ADLAR) | (1<<MUX0);  //Vcc as 
Vref, Value shifted to the left, PinB2 as ADC
  ADCSRA |= (1<<ADEN) | (1<<ADATE) | (1<<ADIE) | (1<<ADPS1);  //enable 
ADC, auto trigger mode, enable ADC interrupts, prescaler = 4
  ADCSRA |= (1<<ADSC);  //start Conversion
  sei();  //allow global interrupts
  DDRB = 0x01;
  PORTB = 0x00;
  while (1)
    {
    if(i < 128)
    {
      PORTB = 0x00;
    }
    else
    {
      PORTB = 0x01;
    }
  }
}
ISR(ADC_vect)
{
  i = ADCH;
}
[c/]

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

ADCSRA:
Bit 5 – ADATE: ADC Auto Trigger Enable
When this bit is written to one, Auto Triggering of the ADC is enabled. 
The ADC will start a conversion on a positive
edge of the selected trigger signal. The trigger source is selected by 
setting the ADC Trigger Select bits, ADTS in
ADCSRB.

Du benutzt ADCSRB nicht, wo die Triggerquelle eingestellt werden müsste.

Wobei - Kommando zurück -

ADCSRB:
Bits 2:0 – ADTS[2:0]: ADC Auto Trigger Source
If ADATE in ADCSRA is written to one, the value of these bits selects 
which source will trigger an ADC conversion.
If ADATE is cleared, the ADTS[2:0] settings will have no effect. A 
conversion will be triggered by the rising edge of
the selected Interrupt Flag. Note that switching from a trigger source 
that is cleared to a trigger source that is set,
will generate a positive edge on the trigger signal. If ADEN in ADCSRA 
is set, this will start a conversion. Switching
to Free Running mode (ADTS[2:0]=0) will not cause a trigger event, even 
if the ADC Interrupt Flag is set .

0-0-0 der Free-running-mode wäre, Der hier gewünscht ist.
Sollte also doch passen.



Wird der Interrupt denn laufend ausgelöst?
(Scheint ja nicht so, sonst müsste ja der an PB2 gemessene Wert 
übernommen werden).
Lasse im Interrupt das PotoB hochzählen - dann hast Du zumindest 256 
Interrupts Zeit, irgendwas zu sehen.

MfG

von Anfänger (Gast)


Lesenswert?

Dank dir für die Antwort!
Ich verstehe leider nicht ganz, was du mit PotoB hochzählen meinst, und 
wie ich dann von außen erkennen könnte, ob der Interrupt ausgelöst 
wurde.

von S. Landolt (Gast)


Lesenswert?

Sicher, dass die Verdrahtung stimmt, auch das Programmiergerät 
abgezogen? Das Programm sieht eigentlich gut aus.

von S. Landolt (Gast)


Lesenswert?

Also bei mir läuft das.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

PotoB sollte PortB heißen :/
Ich meine damit, daß Du im Interrupt eine Zahl hochzählen lässt und 
Diese auf PortB ausgibst - dadurch 'läuft das Port voll' - der oberste 
Pin wackelt mit 127tel des Interrupt-Takt - die LEDs sollten merklich 
unterschiedlich hell leuchten bzw. es sollte erst Mal mehr als eine LED 
leuchten.

Da schon Meldungen kamen, daß der Code lauffähig ist, vll. doch nur der 
Programmer Schuld, daß Es bei Dir nicht so will.

MfG

von Anfänger (Gast)


Lesenswert?

Danke für eure Antworten, ich habe in der Zwischenzeit mal ein einfaches 
Testprogramm geschrieben, welches PortB auf High schaltet, und auch da 
hat sich nichts getan. Ihr habt also Recht, es liegt am Programmer oder 
am MC. Seltsam, da sich der MC durchaus bei Anschluss an den PC auslesen 
lässt. Aber nun weiß ich zumindest, dass mit dem Programm alles stimmt, 
danke nochmals für's Testen!
Ich habe bereits neue Attinys bestellt, da dies mein letzter war, und 
werde es dann mit den neuen probieren. Ich hätte das viel früher machen 
müssen, habe aber den Wald vor lauter Bäumen nicht gesehen...

Freundliche Grüße!

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.