Hilfe ADC ATMEGA8

OP #4713594
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)
    {

    }

}
OP #4713653
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)
    {

    }

}
OP #4713747
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)
    {

    }

}
Gast #4713749
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
Gast #4713784
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
OP #4713989
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)
    {

    }

}
OP #4714332
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.
Gast #4714345
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
  }
OP #4714369
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)
    {

    }

}
OP #4714435
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)
    {

    }

}
Angehängte Dateien:
Gast #4714440
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
(Firma: matzetronics) #4714451
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.
OP #4714493
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)
    {

    }

}
Angehängte Dateien:
OP #4714508
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)
    {

    }

}
Angehängte Dateien:
OP #4714554
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)
    {

    }

}
Gast #4714555
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
}
Gast #4714567
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
Gast #4714585
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
OP #4714588
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
Angehängte Dateien:
OP #4715079
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)
  {

  }

}
Angehängte Dateien:
Gast #4715089
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.
OP #4715110
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.
Gast #4715131
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
OP #4715215
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)
  {

  }

}
Gast #4715224
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?
OP #4715231
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
OP #4715236
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?
Gast #4715254
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
#4715261
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 )
OP #4715264
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 ?
Gast #4715282
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
OP #4715284
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
}
OP #4715302
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
Gast #4715309
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.
Gast #4715321
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
OP #4715326
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.
Gast #4715334
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.
OP #4715342
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren