mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega 8L ADC Programm


Autor: mc (Gast)
Datum:

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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist die Endlosschleife?

MW

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Programm läuft genau einmal. Wo ist Deine Endlosschleife? So sollte 
es gehen:
#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(1)
{
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 0;
}

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: mc (Gast)
Datum:

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

Autor: mc (Gast)
Datum:

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

Autor: mc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber er tut es immer noch nicht

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: mc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
funktionniert nicht

Autor: mc (Gast)
Datum:

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

Autor: Tschusi (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fehlt ein

#include <avr/io.h>

Autor: Tschusi (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Tschusi (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Tschusi (Gast)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.