Forum: Mikrocontroller und Digitale Elektronik Attiny45 ADC


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Anfänger (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also bei mir läuft das.

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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!

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]
  • [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.