Forum: Mikrocontroller und Digitale Elektronik Atmega 8L ADC Programm


von mc (Gast)


Lesenswert?

Hallo Leute!

Könnte wohl einer mal über das Programm schauen und mir vielleicht sagen 
warum es nicht will.


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






int main (void)
{
unsigned int val;
DDRC=0b1111111;
PORTC=0b1111111;


ADMUX=0b0101;

ADCSRA=0x80;             //ADC freischalten

ADCSRA|=(1<<ADSC);       //ADC Wandlung starten
                         //Divisionsfaktor Clock ist 2 bei 1MHz-->500kHz

while(ADCSRA&(1<<ADSC)); //solange bis Wandlung nicht abgeschlossen ist

val=ADCL;                //Einspeichern der Werte
val=(ADCH<<8)|val;

if(val<6)
{
PORTC=0;
}


 return 1;
}

von Michael Wilhelm (Gast)


Lesenswert?

Wo ist die Endlosschleife?

MW

von Patrick (Gast)


Lesenswert?

Dein Programm läuft genau einmal. Wo ist Deine Endlosschleife? So sollte 
es gehen:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
6
7
8
9
int main (void)
10
{
11
unsigned int val;
12
DDRC=0b1111111;
13
PORTC=0b1111111;
14
15
16
ADMUX=0b0101;
17
18
ADCSRA=0x80;             //ADC freischalten
19
20
ADCSRA|=(1<<ADSC);       //ADC Wandlung starten
21
                         //Divisionsfaktor Clock ist 2 bei 1MHz-->500kHz
22
while(1)
23
{
24
while(ADCSRA&(1<<ADSC)); //solange bis Wandlung nicht abgeschlossen ist
25
26
val=ADCL;                //Einspeichern der Werte
27
val=(ADCH<<8)|val;
28
29
if(val<6)
30
{
31
PORTC=0;
32
}
33
}
34
35
 return 0;
36
}

von Johannes M. (johnny-m)


Lesenswert?

Wenn Du sagst, was es denn wollen soll , dann kann Dir vielleicht auch 
jemand sagen, warum es das nicht tut.

> val=ADCL;                //Einspeichern der Werte
> val=(ADCH<<8)|val;
Nicht machen. Es gibt in C extra einen 16-Bit-Zugriff. "val = ADCW;" tut 
es auch und ist idiotensicher. Aber das da:
> DDRC=0b1111111;
ist tödlich! Warum schaltest Du die Analog-Eingänge als Ausgang und 
dann auch noch mit
> PORTC=0b1111111;
alle auf High?

von mc (Gast)


Lesenswert?

ich wollte einfach mal den ADC probieren. ja ich weiss ist mir auch grad 
aufgefallen dass ich die ADCs auf high geschaltet habe. ich will einfach 
ne Spannung von 2,5V am ADC messen mit Referenzspannung 5V.

Er soll ja auch nur einmal durchlaufen, um dann die Led am Port 
einschalten bei der if Anweisung

von mc (Gast)


Lesenswert?

hier die neue Version



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






int main (void)
{
unsigned int val;
DDRD=0b00000001;
PORTD=0b00000001;


ADMUX=0b0101;

ADCSRA=0x80;

ADCSRA|=(1<<ADSC);

while(ADCSRA&(1<<ADSC));

val=ADCL;
val=(ADCH<<8)|val;

if(val<6)
{
PORTD=0;
}


 return 1;
}

von mc (Gast)


Lesenswert?

aber er tut es immer noch nicht

von Michael Wilhelm (Gast)


Lesenswert?


von mc (Gast)


Lesenswert?

funktionniert nicht

von mc (Gast)


Lesenswert?

jetzt hab ichs endlich. ich dösel. kommt davon wenn man so lange 
arbeitet. ich hab ja 10bit und das heißt 1024 Schritte habe ich und 2,5V 
liegen dann genau in der Mitte und meine if Anweisung ist auch 
Schwachsinnig. ich habs jetzt mit 500 Versucht und jetzt gehts auch. 
Hier zur Vollständigkeit das Programm:



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






int main (void)
{

unsigned int val;
DDRD=0b00000001;
PORTD=0b00000000;


ADMUX=0b0101;

ADCSRA=0x80;

ADCSRA|=(1<<ADSC);


while(ADCSRA&(1<<ADSC));


val=ADCL;
val=(ADCH<<8)|val;


if(val<360)
{
PORTD=0b00000001;
}


 return 1;
}

von Tschusi (Gast)


Lesenswert?

Habe auch ein Problem mit dem ADC.

Folgende Fehlermeldungen werden ausgegeben:

../ATMEGA8.c:244: error: 'ADCSRA' undeclared (first use in this 
function)
../ATMEGA8.c:244: error: 'ADEN' undeclared (first use in this function)
../ATMEGA8.c:244: error: 'ADPS1' undeclared (first use in this function)
../ATMEGA8.c:244: error: 'ADPS0' undeclared (first use in this function)
../ATMEGA8.c:246: error: 'ADSC' undeclared (first use in this function)
../ATMEGA8.c:246: error: expected declaration or statement at end of 
input

Kann mir jemand bitte helfen?

von Falk B. (falk)


Lesenswert?

Da fehlt ein

1
#include <avr/io.h>

von Tschusi (Gast)


Lesenswert?

#include <avr/io.h> ist schon enthalten. Was könnte es dann sein?

von Falk B. (falk)


Lesenswert?


von Tschusi (Gast)


Lesenswert?

Folgendes Unterprogramm bereitet mir Probleme:
Fehlermeldungen werden wie schon genannt ausgegeben.

#include <avr/io.h>
#include <lcd-routines.h>
#include <lcd-routines.c>
#include <inttypes.h>
#include <portpins.h>

#ifndef F_CPU
#define F_CPU 12000000000
#endif
#include <util/delay.h>
#include <avr/interrupt.h>



uint16_t Lese_Kanal(uint8_t mux)
{
  uint8_t i;
  uint16_t ergebnis;

  ADMUX = mux;                          // Kanal waehlen


  ADCSRA = (1<<ADEN) | (1<<ADPS1);       // Frequenzvorteiler 
12MHz/64=187500Hz

  ADCSRA |= (1<<ADSC);                  //  Dummy-read-out

  while ( ADCSRA & (1<<ADSC) )
  {
     ;                         // auf Abschluss der Konvertierung warten
  }
  ergebnis = ADCW;             // ADCW muss einmal gelesen werden,


  // Eigentliche Messung  //

  ergebnis = 0;
  for( i=0; i<4; i++ )
  {
    ADCSRA |= (1<<ADSC);           // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) )
  {
      ;                           // auf Abschluss der Konvertierung 
warten
    }
    ergebnis += ADCW;                  // Wandlungsergebnisse 
aufaddieren
  }
  ADCSRA &= ~(1<<ADEN);                          // ADC deaktivieren

  ergebnis /= 4;            // Summe durch vier teilen = arithm. 
Mittelwert

  return ergebnis;
}

von Stefan B. (stefan) Benutzerseite


Lesenswert?

@ Tschusi

Nicht dass es wichtig wäre, aber:

> #define F_CPU 12000000000
Wo gibt's denn die Quarze dafür ;-)

Ich bekomme mit deinem Codefetzen ganz andere Fehlermeldungen:

../tschusi_adc.c:2:26: error: lcd-routines.h: No such file or directory
../tschusi_adc.c:3:26: error: lcd-routines.c: No such file or directory
../tschusi_adc.c:5:22: error: portpins.h: No such file or directory

Wenn ich die auslösenden #include auskommentiere, bleibt eine 
Fehlermeldung übrig:

../../../../crt1/gcrt1.S:52: undefined reference to `main'

Das ist aber logisch, denn in deinem Codefetzen ist ja kein main() 
enthalten. Der Rest übersetzt bei mir wie gesagt ohne Probleme. Getestet 
habe ich mit AVR Studio 4.12 SP2 und WinAVR 20071222. Als Device habe 
ich Atmega8 und 12000000 Hz eingestellt. Sonst wurde nichts geändert. In 
Echt wäre noch Optimierung wegen delay.h nötig.

von Tschusi (Gast)


Lesenswert?

Danke für die Antworten nun wirds schon klappen.
Noch schöne Festtage und einen guten Rutsch wünsche ich

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.