Forum: Mikrocontroller und Digitale Elektronik Hilfe ADC ATMEGA8


von Huber M. (michael_h784)


Lesenswert?

Hallo,

Ich möchte gerne ein Poti in den Atmega8a an PC0 (ADC0) einlesen. Und, 
wenn dieses funktioniert, an PD0 ab einen bestimmten Wert eine Led 
einschalten.Da ich anfänger bin stellt mich dieses aber vor eine grosse 
Herrausforderung.

-mein erstes Problem ist, das ADATE bit bleibt schwarz (da es 
warscheinlich anders benannt werden muß)jetzt zeigt er mir natürlich 
Fehler beim übersetzen an. Wie muss das beim Atmega8A richtig heissen.

-Fehler gerade gefunden ADATE Atmega32 ADFR Atmega8

- Aber wie kann ich jetzt mit dem Poti etwas umsetzem zb. wert 800 led 
an PD0 an

wäre um eure hilfe sehr dankbar

/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */


#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  PORTC = ADCH;
}
int main(void)
{
    DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes

  //ADC konfiguration

  ADMUX |= (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIE) | 
(1<<ADPS2) |(1<<ADPS1);
  sei();


  while(1)
    {

    }

}

: Verschoben durch User
von Huber M. (michael_h784)


Lesenswert?

Hallo,

ich würde hiemit gerne ein Poti an ADC0  auslesen und an PD0 ein led bei 
einem Wert von 800 einschalten und bei 1000 wieder aus. könnte mir bitte 
jemand zeigen oder tips geben wie ich das mit nachfolgenden Code 
umzusetzen ist?
wäre euch sehr dankbar

grüsse huber

atmega8a avr studio 6.0 mk2 programmer


/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */


#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  PORTC = ADCH;
}
int main(void)
{
    DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes

  //ADC konfiguration

  ADMUX |= (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2)
|(1<<ADPS1);
  sei();


  while(1)
    {

    }

}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das hat mit "PC-Programmierung" nichts zu tun.

Nein, Du musst keinen neuen Thread eröffnen.

von Huber M. (michael_h784)


Lesenswert?

Wo wäre denn das besser aufgehoben. kann man den Thread dorthin 
verschieben?

von Arduinoquäler (Gast)


Lesenswert?

Huber M. schrieb:
> wäre euch sehr dankbar

Google kaputt?  Hilf dir selbst.

z.B.

http://www.electronicsplanet.ch/mikrocontroller/source-code/ATmega8/ATmega8-ADC-index.htm

Gleich das erste Beispiel passt gut zu deinen Anforderungen.

von Arduinoquäler (Gast)


Lesenswert?

Huber M. schrieb:
> Wo wäre denn das besser aufgehoben.

Rufus hat dich schon verschoben.

von spess53 (Gast)


Lesenswert?

Hi

Was hast du an AREF angeschlossen?

MfG Spess

von Huber M. (michael_h784)


Lesenswert?

nein Google ist nicht kaputt. Ich würde es mir gerne mit meinen Code 
weiter  erstellen. Um es besser zu lernen bzw. verstehen. der Code ist 
ja ganz anders geschrieben. ichI bräuchte bei mir den weiteren richtigen 
Ansatz.

: Bearbeitet durch User
von Huber M. (michael_h784)


Lesenswert?

>
> Was hast du an AREF angeschlossen?
>
Das poti aussen AREF,den anderen GND, potipin an ADC0

von spess53 (Gast)


Lesenswert?

Hi

>Das poti aussen AREF,den anderen GND, potipin an ADC0

Gibt es diesen Satz auch in verständlichem Deutsch?

MfG Spess

von Huber M. (michael_h784)


Lesenswert?

Sorry ich versuchs nochmal. Also an POTI-pin n habe ich AREF. Am 
Schleifer ADC0 und an POTI-pin h habe ich GND angeschlossen.

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

Bei REFS1/0 = 00 muss eine Referenzspannung an AREF gelegt werden.

MfG Spess

von Dieter F. (Gast)


Lesenswert?

Zeige mal bitte Deine Schaltung und den verwendeten Code ... sonst kann 
Dir hier keiner helfen (Glaskugeln alle in Reparatur :-) )

von Huber M. (michael_h784)


Lesenswert?

Ok, das heißt ich schließe Poti-pin n , an die 5V der 
Versorgungsspannung (oder  an AVCC?) und den Schleifer an AREF und 
Poti-pin h an GND ?

von Huber M. (michael_h784)


Lesenswert?

hier ist er noch mal

Hallo,

ich würde hiemit gerne ein Poti an ADC0  auslesen und an PD0 ein led bei
einem Wert von 800 einschalten und bei 1000 wieder aus. könnte mir bitte
jemand zeigen oder tips geben wie ich das mit nachfolgenden Code
umzusetzen ist?
wäre euch sehr dankbar

grüsse huber

atmega8a avr studio 6.0 mk2 programmer


/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */


#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  PORTC = ADCH;
}
int main(void)
{
    DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes

  //ADC konfiguration

  ADMUX |= (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2)
|(1<<ADPS1);
  sei();


  while(1)
    {

    }

}

von spess53 (Gast)


Lesenswert?

Hi

>Ok, das heißt ich schließe Poti-pin n , an die 5V der
>Versorgungsspannung (oder  an AVCC?) und den Schleifer an AREF und
>Poti-pin h an GND ?

Das hört sich wirr an. Mach einen Schaltplan. Dann wissen alle was du 
meinst.

MfG Spess

von Huber M. (michael_h784)


Angehängte Dateien:

Lesenswert?

Hoffe das genügt auf die schnelle

von Alexander S. (alesi)


Lesenswert?

Huber M. schrieb:
> Hoffe das genügt auf die schnelle

Lese Dir erstmal das hier durch:

    https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

von spess53 (Gast)


Lesenswert?

Hi

Damit kannst maximal eine veränderbare Referenzspannung einstellen, aber 
nichts messen.

Mein Vorschlag: Du stellst mit REFS1/0= 01 AREF auf VCC (Kondensator an 
AREF nicht vergessen). Dann das Poti mit einem Ende an VCC, das andere 
Ende an GND. Den Schleifer dann an deinen ADC-Eingang.

MfG Spess

von Huber M. (michael_h784)


Lesenswert?

>
> Lese Dir erstmal das hier durch:
>
>     https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

Genau das ist der Grund warum ich hier um hilfe bitte. Um eine für euch 
einfache Grundbeschaltung bei mir am atmega8a zum laufen zu bringen. Um 
diese u.a. im Tutorial dann besser nachvollziehen zu können.

das heißt ich will ein Poti am pin(PC0(ADC0) im Freerunning Mode mit ISR 
anschließen. Und die ISR soll mir dann bei einem bestimmten Wert zb PD0 
High or Low schalten

dazu habe ich auch schon folgendes geschrieben und mir fehlt noch 
grundsätzlich wie ich das in der ISR umsetze. zb. if (PINC <800)
                                                    {
                                                     PORTD |= (1<<PD0)
                                                    }
und den Spannungsteiler (POTI) müsste ich ja dann in ADC0 einlesen


/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */


#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  PORTC = ADCH;
}
int main(void)
{
    DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes

  //ADC konfiguration

  ADMUX |= (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2)
|(1<<ADPS1);
  sei();


  while(1)
    {

    }

}

von spess53 (Gast)


Lesenswert?

Hi

>>     https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

>Genau das ist der Grund warum ich hier um hilfe bitte. Um eine für euch
>einfache Grundbeschaltung bei mir am atmega8a zum laufen zu bringen. Um
>diese u.a. im Tutorial dann besser nachvollziehen zu können.

Und was verstehst du an der dort gezeigten Grundschaltung ('Beschaltung 
von AREF') nicht?

MfG Spess

von Huber M. (michael_h784)


Lesenswert?

also, das ist ja eigentlich sogar genau das was ich in meinem Code 
geschrieben habe oder, so wie ich das verstehe?
An PC0 Poti einlesen, mit externer Referrenz spannung.
Jetzt kann ich das Poti an PC0 einlesen, aber da ich noch nicht so 
fortgeschritten bin um mir den Wert 0-1023 auf einem LCD anzeigen zu 
lassen. Würde ich gerne an PD0, bei einem wert zb. < 800 den Ausgang Auf 
High schalten, um zu sehen das da irgendwas funktioniert was ich drauf 
gespielt habe.
 Da ist eigentlich mein Hauptproblem wie ich das in der ISR umsetze. 
Kurz gesagt will ich am Poti drehen und sehen das sich etwas verändert 
zb. LED an PD0 an. mir ist natürlich bewusst das ich PD0 noch als 
ausgang festlegen muss, aber wie ich dann in der ISR weiter machen soll 
komm ich nicht drauf zb. if (PC0 < 800) PD0, an , else (PC0 > 800) PD0 
aus. der Weg dorthin macht mir probleme.

von Mitlesa (Gast)


Lesenswert?

Huber M. schrieb:
> Kurz gesagt will ich am Poti drehen und sehen das sich etwas verändert
> zb. LED an PD0 an. mir ist natürlich bewusst das ich PD0 noch als
> ausgang festlegen muss, aber wie ich dann in der ISR weiter machen soll
> komm ich nicht drauf zb. if (PC0 < 800) PD0, an , else (PC0 > 800) PD0
> aus. der Weg dorthin macht mir probleme.
1
  uint16_t  val16;
2
3
  val16 = ADC;
4
  if ( (val16 >= 800) && (val16 <= 1000)  )
5
  {
6
    PORTD |=  0x01;
7
  }
8
  else
9
  {
10
    PORTD &= ~0x01;
11
  }

von Huber M. (michael_h784)


Lesenswert?

Ok, danke der Code sieht jetzt bei mir  wie nachfolgend aus. Bringt mir 
jetzt aber beim kompileren einen Fehler. das er irgendwie ADMUX nicht 
mehr kennt. was habe ich denn hier nicht beachtet ?




/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */


#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  uint16_t  val16;

  val16 = ADC;
  if ( (val16 >= 800) && (val16 <= 1000)  )
  {
    PORTD |=  0x01;
  }
  else
  {
    PORTD &= ~0x01;
  }
}
int main(void)
{
    DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes
  DDRD = (1<<PD0)   //Ausgang PD0 LED

  //ADC konfiguration

  ADMUX |= (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) 
|(1<<ADPS1);
  sei();


  while(1)
    {

    }

}

von Gcc (Gast)


Lesenswert?

Semikolon am ende der zeile davor!

von Mitlesa (Gast)


Lesenswert?

Huber M. schrieb:
> Ok, danke der Code sieht jetzt bei mir  wie nachfolgend aus.

Ja und bitte du auch die C-Formatierung beachten wie sie
unter "Antwort schreiben" jedes mal angemahnt wird.

von Huber M. (michael_h784)


Angehängte Dateien:

Lesenswert?

Danke das hätte ich wirklich selber sehen müssen. Compilieren und 
flashen funktioniert jetzt auch. Aber die Funktion bleibt aus. 
Vielleicht verstehe ich in diesem Fall das Poti anschliessen doch 
falsch. Oben im Bild mal mein Aufbau.Und nachfolgend der dazugehörige 
Code der aufgespielt ist.


/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */


#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  uint16_t  val16;

  val16 = ADC;
  if ( (val16 >= 800) && (val16 <= 1000)  )
  {
    PORTD |=  0x01;
  }
  else
  {
    PORTD &= ~0x01;
  }
}
int main(void)
{
    DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes
  DDRD = (1<<PD0) ;  //Ausgang PD0 LED

  //ADC konfiguration

  ADMUX |= (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) 
|(1<<ADPS1);
  sei();


  while(1)
    {

    }

}

von spess53 (Gast)


Lesenswert?

Hi

Wenn ich dein Bild richtig verstanden habe ist einerseites der AREF-Pin 
unbeschaltet aber im Programm als Referenzspannung die Spannung am 
AREF-Pin ausgewählt. Das passt nicht zusammen.

MfG Spess

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dann steckst du bitte noch 100nF Kondensatoren direkt am Chip:
* Von VCC nach GND
* von AVCC nach GND
* von AREF nach GND

und ADMUX mal so initialisieren:
1
ADMUX = (1 << REFS0) | (1 << ADLAR);
Nochwas zu AREF. AREF ist nicht belastbar. Man kann ohne externen Buffer 
kein Poti oder sowas an AREF zapfen, ohne das die Spannung deutlich 
zusammenbricht.
Hey, ausserdem sehe ich gerade, das du AVCC gar nicht angeschlossen hast 
- böser Fehler. AVCC muss mit an VCC, am besten über eine Drossel der 
10µH - 100µH Klasse.

: Bearbeitet durch User
von Huber M. (michael_h784)


Angehängte Dateien:

Lesenswert?

Ok, ist das jetzt die im tutorial beschriebene Mindestbeschaltung?
Die Drossel kann ich mir allerdings erst am Montag besorgen. ich habe 
jetzt derweilen einen Widerstand eingebaut, oder doch einfach nur ne 
Brücke? Code wie nachfolgend überspielt und wie im bild verdrahtet, 
funktion bleibt immer noch aus

/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */


#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  uint16_t  val16;

  val16 = ADC;
  if ( (val16 >= 800) && (val16 <= 1000)  )
  {
    PORTD |=  0x01;
  }
  else
  {
    PORTD &= ~0x01;
  }
}
int main(void)
{
    DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes
  DDRD = (1<<PD0) ;  //Ausgang PD0 LED

  //ADC konfiguration

  ADMUX |= (1 << REFS0) | (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) 
|(1<<ADPS1);
  sei();


  while(1)
    {

    }

}

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn ich das im Foto richtig sehe, hast du AVCC (Pin 20) jetzt mit GND 
verbunden, das muss aber an +5V, also VCC. Widerstand ist schlecht, nimm 
lieber die Brücke.

: Bearbeitet durch User
von Huber M. (michael_h784)


Angehängte Dateien:

Lesenswert?

also ich habe jetz ne brücke von (pin 20) nach (pin7) VCC gesteckt siehe 
bild, und nachfolgenden code aber ohne funktion.

ps den grauen draht vom Poti der im bild an + geht. Habe ich von + 
entfernt und nachträglich mit AREF verbunden


/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */


#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  uint16_t  val16;

  val16 = ADC;
  if ( (val16 >= 800) && (val16 <= 1000)  )
  {
    PORTD |=  0x01;
  }
  else
  {
    PORTD &= ~0x01;
  }
}
int main(void)
{
    DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes
  DDRD = (1<<PD0) ;  //Ausgang PD0 LED

  //ADC konfiguration

  ADMUX |= (1 << REFS0) | (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) 
|(1<<ADPS1);
  sei();


  while(1)
    {

    }

}

: Bearbeitet durch User
von Gcc (Gast)


Lesenswert?

Ich glaube, die portc-pins als ausgang zu konfigurieren, hilft deinem 
vorhaben auch nicht so richtig nach vorn. Lass die portc-pins mal auf 
eingang.

von Huber M. (michael_h784)


Lesenswert?

Gcc schrieb:
> Ich glaube, die portc-pins als ausgang zu konfigurieren, hilft deinem
> vorhaben auch nicht so richtig nach vorn. Lass die portc-pins mal auf
> eingang.

stimmt, abgeändert, keine Funktion. jetzt weiß ich nicht mehr weiter.


/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */


#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  uint16_t  val16;

  val16 = ADC;
  if ( (val16 >= 800) && (val16 <= 1000)  )
  {
    PORTD |=  0x01;
  }
  else
  {
    PORTD &= ~0x01;
  }
}
int main(void)
{
    DDRC = 0b0000000; //Eingang des ADC-Meßwertes
  DDRD = (1<<PD0) ;  //Ausgang PD0 LED

  //ADC konfiguration

  ADMUX |= (1 << REFS0) | (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) 
|(1<<ADPS1);
  sei();


  while(1)
    {

    }

}

von Gcc (Gast)


Lesenswert?

Lass mal zu anfang die led blinken, um sicherzustellen, dass der teil 
funzt:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#define F_CPU 8000000
4
#include <util/delay.h>
5
6
ISR(ADC_vect)
7
{
8
  uint16_t  val16;
9
10
  val16 = ADC;
11
  if ( (val16 >= 800) && (val16 <= 1000)  )
12
  {
13
    PORTD |=  0x01;
14
  }
15
  else
16
  {
17
    PORTD &= ~0x01;
18
  }
19
}
20
int main(void)
21
{
22
  
23
  DDRD = (1<<PD0) ;  //Ausgang PD0 LED 
24
25
  // blink 
26
  PORTD |=  0x01;
27
  _delay_ms(500);
28
   PORTD &= ~0x01;
29
  _delay_ms(500);
30
  PORTD |=  0x01;
31
  
32
33
34
  //ADC konfiguration
35
36
  ADMUX |= (1 << REFS0) | (1<<ADLAR);
37
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) 
38
|(1<<ADPS1);
39
  sei();
40
41
42
  while(1)
43
    {
44
45
    }
46
47
}

von Gcc (Gast)


Lesenswert?

Du brauchst den adc raw-wert eher rechtsbündig, dh 0...1023, daher muss 
ADLAR bit 0 sein. Und dann ändere mal die grenzen in der if abfrage, ob 
ein oder aus auf die mitte des bereiches, dh wenn val16>511 dann on, 
sonst off

von Huber M. (michael_h784)


Lesenswert?

Ja, sie leuchtet einmal auf, und geht wieder aus

von Gcc (Gast)


Lesenswert?

Genaugenommen sollte die led 2 mal aufleuchten und dann eingescaltet 
bleiben oder wieder verlöschen, wenn du den code genauso kopiert hast...

von spess53 (Gast)


Lesenswert?

Hi

Wenn ADLAR gesetzt ist, dann bewegt sich der ADC-Wert zwischen 0 und 
255. Also entweder ADLAR löschen oger diee Schwellwerte durch 4 teilen.

MfG spess

von Huber M. (michael_h784)


Lesenswert?

Ja ich habe ihn hier raus kopiert. ich mache es noch einmal

von S. Landolt (Gast)


Lesenswert?

an Spess:

Ich hätte gedacht zwischen 0 und 65472, d.h. bei ganz vorsichtigem 
Drehen im unteren Bereich hätte er mal etwas sehen sollen.

von Gcc (Gast)


Lesenswert?

@spess: ich bin der meinung, bei adlar=1 sinds nach wie vor 10 bit, 
jedoch linksbündig im adc-register. Wenn er nur adch auslesen würde, 
dann hättest du recht, aber er liest ja das gesamte 16bit register

von Huber M. (michael_h784)


Angehängte Dateien:

Lesenswert?

Also sie leuchtet ein zwei sec. auf geht aus, blitzt einmal kurz, dann 
bleibt sie aus. Sie sollte aber 500ms aufleuchte, dann wieder ausgehen, 
dann dauerhaft leuchten richtig ?


ps der graue draht vom poti ist einstweilen auf AREF verlegt.

ich benütze ATMEL studio 6.0 und den MK2 programmer original und 
Atmega8a

von Gcc (Gast)


Lesenswert?

Led verhält sich richtig, an, aus, an und dann wird sie in der isr vom 
adc sofort wieder ausgeschaltet. Dh der code funktioniert. Irgendwas an 
deiner schaltung ist faul.

von Huber M. (michael_h784)


Lesenswert?

also aus unerklärlichen gründen klpt es jetzt mit dem Poti die LED ein 
zu schalten. Habe es noch einmal auf gespielt es geht voerst mal. habt 
schon mal herzlichen Dank

von Huber M. (michael_h784)


Lesenswert?

habe mich wohl zu früh gefreut, egal welchen Wert ich in der if 
Anweisung eingebe. Schaltet sie immer an der gleichen Stellung am Poti 
ein.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Huber M. schrieb:
> ps der graue draht vom poti ist einstweilen auf AREF verlegt.

Wie oben schon gesagt, darfst du AREF nicht belasten. Klemm die äusseren 
Enden des Potis wieder auf +5V und Masse. Schleifer geht auf ADC0.

von Huber M. (michael_h784)


Angehängte Dateien:

Lesenswert?

Hallo,

mal wieder :-) also ich habe jetzt vom Poti den Schleifer an PC0. Die 
beiden äusseren ,den einen auf +5 und und den anderen auf Masse. Und die 
kondensator wie beschrieben gesteckt.

jetzt wäre es doch so, wenn das Poti die linke Stellung hat, wäre es 
doch nach der Wandlung null. Und in der rechten Stellung 1023 ?


wenn ich jetzt die Werte if ( (val16 >=1000) && (val16 <= 1100)  ) dann 
sollte die LED eher in der rechten Stellung angehen oder ?

wenn ich jetzt die Werte if ( (val16 >=100) && (val16 <= 200)  ) dann 
sollte die LED eher in der linken Stellung angehen oder ?

oder habe ich einen kompletten Denkfehler. Denn es scheint das sie immer 
nur an der gleichen position mit minimalen abweichungen angeht.


/*
 * Analog_Dgital_Umsetzer.c
 *
 * Created: 09.09.2016 18:10:19
 *  Author: HUBER
 */



#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000
#include <util/delay.h>

ISR(ADC_vect)
{
  uint16_t  val16;

  val16 = ADC;
  if ( (val16 >=1000) && (val16 <= 1100)  )
  {
    PORTD |=  0x01;
  }
  else
  {
    PORTD &= ~0x01;
  }
}
int main(void)
{

  DDRD = (1<<PD0) ;  //Ausgang PD0 LED

  // blink
  PORTD |=  0x01;
  _delay_ms(500);
  PORTD &= ~0x01;
  _delay_ms(500);
  PORTD |=  0x01;



  //ADC konfiguration

  ADMUX |= (1 << REFS0) | (1<<ADLAR);
  ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2)
  |(1<<ADPS1);
  sei();


  while(1)
  {

  }

}

von Dieter F. (Gast)


Lesenswert?

Huber M. schrieb:
> Denn es scheint das sie immer
> nur an der gleichen position mit minimalen abweichungen angeht.

Ist schon mehrfach geschrieben worden - und Du hast Dir den Link auf das 
Tutorial wohl immer noch nicht angeschaut.

Wenn Du ADLAR auf 1 setzt wird das Ergebnis Linksbündig in die Register 
geschrieben. Dann macht es keinen Sinn, mit einer 16-Bit-Variablen 
zuzugreifen - bzw. die Werte sind dann deutlich höher, wie erwartet.

Schau Dir das Tutorial an - da ist es gut beschrieben.

von Huber M. (michael_h784)


Lesenswert?

> Ist schon mehrfach geschrieben worden - und Du hast Dir den Link auf das
> Tutorial wohl immer noch nicht angeschaut.

das Stimmt nicht, ich habe es mir sogar ausgedruckt. Und es steht ja 
direkt da ADLAR 0 rechtsbündig. Und ADLAR 1 Linksbündid. Und das kann 
ich im ADMUX Register einstellen.Das heisst dann ich soll das ADLAR bit 
wieder auss dem Code löschen ?


Und schon gehts, sollte wohl mal ne pause machen.

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Huber M. schrieb:
> Das heisst dann ich soll das ADLAR bit
> wieder auss dem Code löschen ?

Wenn Du Werte zwischen 0 und 1023 "sehen" willst - ja.

von spess53 (Gast)


Lesenswert?

Hi

>wenn ich jetzt die Werte if ( (val16 >=1000) && (val16 <= 1100)  ) dann
>sollte die LED eher in der rechten Stellung angehen oder ?

Wenn du ADLAR setzt und den 16-Bit Wert von ADC ausliest bekommst du 
folgende Werte:

0    Poti am masseseitigen Ende
64
128
192
..
65408
65472  Poti am VCC-seitigen Ende

Bei ADLAR = 0 liest du ADC als

0    Poti am masseseitigen Ende
1
2
...
1022
1023  Poti am VCC-seitigen Ende

ADLAR= 1 macht eigentlich nur Sinn wenn man die 10-Bit Auflösung des ADC 
nicht braucht und mit den 8 Bit aus ADCH auskommt. Dann liest du ADCH 
als

0    Poti am masseseitigen Ende
1
2
...
254
255  Poti am VCC-seitigen Ende

Wenn du in deinem Programm ADLAR=0 setzt kannst du mit Vergleichswerten 
im Bereich 0...1023 rechnen.

MfG Spess

von Huber M. (michael_h784)


Lesenswert?

Danke für die ausführliche Erklärung. Jetzt würde ich es noch gerne auf 
einen Attiny24a testen. Und habe folgendes dazu umgewandelt. Danach 
wollte ich es kompilieren, prommt einen fehler habe ich hier ein bit zu 
setzen vergessen ?
wäre nett wenn ihr mir dabei auch noch helfen würdet

/*
 * Analog_Dgital_Umsetzer für Attiny24A.c
 * im Freerunningmode mit interner Referenzspannung
 *
 *  Created: 09.09.2016 18:10:19
 *  Author: HUBER
 *
 *Verkabelung.:
 *
 * Poti VCC/GND Schleifer auf PC0 (ADC0)
 *
 */



#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL
#include <util/delay.h>

ISR(ADC_vect)
{
  uint16_t  val16;

  val16 = ADC;
  if  (val16 >=500)
  {
    PORTB |=  (1<<PB0);
  }
  else
  {
    PORTB &= ~(1<<PB0);
  }
}
int main(void)
{

  DDRB = (1<<PB0) ;  //Ausgang PB0 LED

  // blink
  PORTB |=  0x01;
  _delay_ms(250);
  PORTB &= ~0x01;
  _delay_ms(250);





  //ADC konfiguration

  ADMUX |=  //REFS1 REFS0 Voltage Reference Selection
            //0 0 VCC used as analog reference, disconnected from PA0 
AREF

ADCSRA |= (1<<ADEN) | (1<<ADSC) |  (1<<ADIE) | (1<<ADPS2)|(1<<ADPS1);
ADCSRB |= //kein bit Freerunningmode
sei();


  while(1)
  {

  }

}

von Arduinoquäler (Gast)


Lesenswert?

Huber M. schrieb:
> Jetzt würde ich es noch gerne auf einen Attiny24a testen.

Kannst du jetzt bitte endlich deinen Code so posten wie
es sich gehört, nämlich in den eckigen C-Klammern wie es
bei jedem "Antwort schreiben" Dialog angezeigt und
gefordert wird?

Jetzt sag nicht du hast das noch nicht gesehen .....

Kannst du das jetzt bittääääähhhhhh machen?

von Gcc (Gast)


Lesenswert?

Denk mal hier drüber nach:
1
ADMUX |=  //REFS1 REFS0 Voltage Reference Selection

von Huber M. (michael_h784)


Lesenswert?

1
Analog_Dgital_Umsetzer für Attiny24A.c
2
 * im Freerunningmode mit interner Referenzspannung
3
 * 
4
 *  Created: 09.09.2016 18:10:19
5
 *  Author: HUBER
6
 * 
7
 *Verkabelung.:
8
 *
9
 * Poti VCC/GND Schleifer auf PC0 (ADC0)
10
 * 
11
 */
12
13
14
15
#include <avr/io.h>
16
#include <avr/interrupt.h>
17
#define F_CPU 1000000UL
18
#include <util/delay.h>
19
20
ISR(ADC_vect)
21
{
22
  uint16_t  val16;
23
24
  val16 = ADC;
25
  if  (val16 >=500) 
26
  {
27
    PORTB |=  (1<<PB0);
28
  }
29
  else
30
  {
31
    PORTB &= ~(1<<PB0);
32
  }
33
}
34
int main(void)
35
{
36
  
37
  DDRB = (1<<PB0) ;  //Ausgang PB0 LED
38
39
  // blink
40
  PORTB |=  0x01;
41
  _delay_ms(250);
42
  PORTB &= ~0x01;
43
  _delay_ms(250);
44
  
45
  
46
  
47
48
49
  //ADC konfiguration
50
51
  ADMUX |=  //REFS1 REFS0 Voltage Reference Selection
52
            //0 0 VCC used as analog reference, disconnected from PA0 (AREF)
53
  ADCSRA |= (1<<ADEN) | (1<<ADSC) |  (1<<ADIE) | (1<<ADPS2)|(1<<ADPS1);
54
  ADCSRB |= //kein bit Freerunningmode
55
  sei();
56
57
58
  while(1)
59
  {
60
61
  }
62
63
}

ich hoffe es hat funktioniert

von Huber M. (michael_h784)


Lesenswert?

Gcc schrieb:
> Denk mal hier drüber nach:ADMUX |=  //REFS1 REFS0 Voltage Reference
> Selection

Hier kann ich wählen ob ich eine externe oder eine interne 
Referenzspannung benützen will.

wenn ich kein bit setze, wird VCC als analoge Referenzspannung genützt, 
PA0 und AREF wird abgeschaltet ?

wenn ich REFS0 setze, wird externe Refrenz genützt und interne wird 
abgeschaltet?

von spess53 (Gast)


Lesenswert?

Hi

>Hier kann ich wählen ob ich eine externe oder eine interne
>Referenzspannung benützen will.

Und was wählst du mit diesem Befehl?

Das gleiche mit

>  ADCSRB |= //kein bit Freerunningmode

MfG Spess

von Rainer B. (katastrophenheinz)


Lesenswert?

Ich empfehle dir, C strukturiert zu erlernen - Buch zb. So wird das nix.

Eine Wertzuweisung braucht einen linken und eine rechten Operanden.
- Wo ist der rechte Operand hinter |=
- Wo ist das ; am Ende der Anweisung

Wenn du am Initialwert von ADMUX nichts ändern willst, dann fass dort 
auch nicht an. Wenn du was ändern willst, dann musst du auch sagen, was 
geändert ( oder in deinem Codeschnipsel: verodert ) werden soll.

Gleiches bei ADCRSB.

( Wahrscheinlich meckert der Compiler nicht mal bei der ADMUX-Zuweisung, 
weil durch die folgenden Kommentare die ADCSRA-Zuweisung als rhs der 
ADMUX-Zuweisung genommen wird )

von Huber M. (michael_h784)


Lesenswert?

>
>>Hier kann ich wählen ob ich eine externe oder eine interne
>>Referenzspannung benützen will.
>
> Und was wählst du mit diesem Befehl?

wenn ich REFSO setze interne referenz, also muss ich REFSO stzen?

>
> Das gleiche mit
>
>>  ADCSRB |= //kein bit Freerunningmode
>

hier habe ich ja kein bit gesetzt, da dies den Freerunning mode 
aktiviert oder ?

von spess53 (Gast)


Lesenswert?

Hi

>wenn ich REFSO setze interne referenz, also muss ich REFSO stzen?

Das steht im Datenblatt aber anders.

>>  ADCSRB |= //kein bit Freerunningmode

>hier habe ich ja kein bit gesetzt, da dies den Freerunning mode
>aktiviert oder ?

Du hast garnichts gesetzt. ADCSRB |=  erwartet einen Wert und keinen 
Kommentar.

Und wenn du nichts reinschreiben must, dann lass die komplette Zeile 
weg. Das Register wird bei RESET mit Null initialisiert.

MfG Spess

von Huber M. (michael_h784)


Lesenswert?

Rainer B. schrieb:
> Eine Wertzuweisung braucht einen linken und eine rechten Operanden.
> - Wo ist der rechte Operand hinter |=
> - Wo ist das ; am Ende der Anweisung

Ja, das war totaler blödsinn was ich da gemacht habe.


-jetzt bleibt die Funktion trozdem aus. was habe ich beim konfiguriern 
vergessen ?


1
 /*
2
 * Analog_Dgital_Umsetzer für Attiny24A.c
3
 * im Freerunningmode mit interner Referenzspannung
4
 * 
5
 *  Created: 09.09.2016 18:10:19
6
 *  Author: HUBER
7
 * 
8
 *Verkabelung.:
9
 *
10
 * Poti VCC/GND Schleifer auf PC0 (ADC0)
11
 * 
12
 */
13
14
15
16
#include <avr/io.h>
17
#include <avr/interrupt.h>
18
#define F_CPU 1000000UL
19
#include <util/delay.h>
20
21
ISR(ADC_vect)
22
{
23
  uint16_t  val16;
24
25
  val16 = ADC;
26
  if  (val16 >=500) 
27
  {
28
    PORTB |=  (1<<PB0);
29
  }
30
  else
31
  {
32
    PORTB &= ~(1<<PB0);
33
  }
34
}
35
int main(void)
36
{
37
  
38
  DDRB = (1<<PB0) ;  //Ausgang PB0 LED
39
40
  // blink
41
  PORTB |=  0x01;
42
  _delay_ms(250);
43
  PORTB &= ~0x01;
44
  _delay_ms(250);
45
  
46
  
47
  
48
49
50
  //ADC konfiguration
51
52
ADMUX ; 
53
            
54
ADCSRA |= (1<<ADEN) | (1<<ADSC) |  (1<<ADIE) | (1<<ADPS2)|(1<<ADPS1);
55
ADCSRB; //kein bit Freerunningmode
56
sei();
57
58
59
  while(1)
60
  {
61
62
  }
63
64
}

von spess53 (Gast)


Lesenswert?

Hi

>-jetzt bleibt die Funktion trozdem aus. was habe ich beim konfiguriern
>vergessen ?

Dir fehlen grundlegende C Kentnisse. Es wird dringend Zeit für ein paar 
C-Bücher.

MfG Spess

von Huber M. (michael_h784)


Lesenswert?

spess53 schrieb:
> Hi
>
>>wenn ich REFSO setze interne referenz, also muss ich REFSO stzen?
>
> Das steht im Datenblatt aber anders.

REFSO1 steht internal 1,1v reference. Ich habe die drei Möglichkeiten 
schon probiert, aber das ändert nichts an der funktion

von Huber M. (michael_h784)


Lesenswert?

spess53 schrieb:
>>-jetzt bleibt die Funktion trozdem aus. was habe ich beim konfiguriern
>>vergessen ?
>
> Dir fehlen grundlegende C Kentnisse. Es wird dringend Zeit für ein paar
> C-Bücher.

-das trifft auch zu, empfiehl mir mal bitte eins.
- ich hab zwar zwei mit arduino, aber die helfen mir ja hier nicht 
wirklich weiter.

-ich würde es aber jetzt am attiny 24 noch gerne zu ende bringen. 
vielleicht helft ihr mir ja noch

von STK500-Besitzer (Gast)


Lesenswert?

spess53 schrieb:
> Dir fehlen grundlegende C Kentnisse. Es wird dringend Zeit für ein paar
> C-Bücher.

Da fehlt mMn grundlegenes Verständins.
Wenn man eine Zuweisung nicht von einem Funktionsaufruf unterscheiden 
kann, sollte man gaaanz von vorne anfangen.

"Die Programmiersprache C" von Kernighan und  Ritchie ab der 2. Auflage 
in Deutsch empfehle ich (vielleicht mal in der Bücherei ausleihen - zu 
meiner Zeit gab es davon sogar ein Exemplar in der Stadtbücherei)
Wenn das zu kompliziert geschrieben ist, solltest du die eine andere 
Beschäftigung suchen.

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe die drei Möglichkeiten
>schon probiert, aber das ändert nichts an der funktion

Was sagt dir das hier

REFS1 REFS0
  0     0     VCC used as analog reference, disconnected from PA0 (AREF) 
?



>-das trifft auch zu, empfiehl mir mal bitte eins.

Als notorischer Assemblerprogrammierer bin ich der falsche 
Ansprechpartner, aber das Standartdwerk

Kernighan/Ritchie   Programmieren in C

kann ich empfehlen.

MfG Spess

von Huber M. (michael_h784)


Lesenswert?

ich beschäftige mich natürlich mit einfacher Ein- und Ausgabe und 
Interrupt auslösen an into funktioniert auch schon ganz gut, ich dachte 
mir irgendwann muss ich mal mit dem ADC mal anfangen. der gehört ja auch 
noch zu den Grundlagen, oder ? und wenn das läuft kann ich das schon 
besser nachvollziehen, Darum hatte ich mir auch den Atmega8a gekauft, 
weil ich mMn nach hier am meisten nachlesen (und mit dem datenblatt 
besser klar komme) und nachfragen kann. Und ich würde es halt gerne auf 
dem attiny 24 a auch gerne probieren aber irgendwie verwirrt mich das 
lesen im datenblatt immer komplett.

von Huber M. (michael_h784)


Lesenswert?

spess53 schrieb:
> Was sagt dir das hier
>
> REFS1 REFS0
>   0     0     VCC used as analog reference, disconnected from PA0 (AREF)
> ?

VCC wird als analoge Referecespannung benützt und von PAO (AREF) 
getrennt.

so übersetze ich das für mich

von STK500-Besitzer (Gast)


Lesenswert?

Huber M. schrieb:
> ich beschäftige mich natürlich mit einfacher Ein- und Ausgabe und
> Interrupt auslösen an into funktioniert auch schon ganz gut, ich dachte
> mir irgendwann muss ich mal mit dem ADC mal anfangen. der gehört ja auch
> noch zu den Grundlagen, oder ?

Natürlich gehört der ADC zu den Grundlagen, so wie alle anderen 
Peripherie-Module des Controllers; die gibt es nämlich bei anderen 
Controllern genauso.

Huber M. schrieb:
> Darum hatte ich mir auch den Atmega8a gekauft,
> weil ich mMn nach hier am meisten nachlesen (und mit dem datenblatt
> besser klar komme) und nachfragen kann. Und ich würde es halt gerne auf
> dem attiny 24 a auch gerne probieren aber irgendwie verwirrt mich das
> lesen im datenblatt immer komplett.

Der einzige Unterschied neben der unterschiedlichen Peripherie sind 
vielleicht noch die Namen und Belegungen der Register.
Der ADC eines Mega8A ist genauso aufgebaut, wie der des Tiny24A - beides 
sukzessive-Approximations-Wandler.
Nur die Belegung der Register um die Dinger anzustellen, kann anders 
sein und heissen.

von STK500-Besitzer (Gast)


Lesenswert?

Huber M. schrieb:
> so übersetze ich das für mich

Und der Sinn dahinter? (Übersetzen kann Spess das mit Sicherheit 
selber).

von Huber M. (michael_h784)


Lesenswert?

genau, und darum dachte ich mir, wenn ich es am Atmega8 verstehe bzw. 
nachvollziehen kann. dann kann ich es auf dem Attiny24 auch, wenn ich 
die richtigen Registerbits setze.

denn ich glaubte es verstanden zu haben. Wie man ein Poti an den 
Atmega8a mit interner Referenzspannung und interrupt im Freeruningmode 
betreibt. Und es zum attiny nicht so viel unterschied ausmachen sollte, 
die bit zu setzen.

von Huber M. (michael_h784)


Lesenswert?

STK500-Besitzer schrieb:
> Und der Sinn dahinter? (Übersetzen kann Spess das mit Sicherheit
> selber)
das es für externe referenzspannung ist ? wenn ich kein bit setze.

von STK500-Besitzer (Gast)


Lesenswert?

Huber M. schrieb:
> das es für externe referenzspannung ist ? wenn ich kein bit setze.

und wo liegt die an, und wie groß ist die?

von Huber M. (michael_h784)


Lesenswert?

an VCC und 5V oder ?

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.