ADC Wandlung mit Interrupt funktioniert nicht

Hallo!

Ich probier gerade die ADC Wandlung mit Interrupt, aber es funktioniert leider nicht.
Es gibt mir im Monitor die ganze Zeit 3330 aus.
Ich bin noch sehr neu in dem Gebiert und kenne mich daher auch nicht so gut aus.

Kann mir bitte wer helfen?

Danke!

Hier ist der code:

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

#include "AODEF.h"

int i = 0;
char feld1[1024];
unsigned int x;
uint8_t wert;

void setup()
{
Serial.begin(9600);

/////////////////////////////DAC/////////////////////////////
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
ADCSRA=0;
ADMUX=0;
ADCSRB=0;

ADMUX = (1 << REFS0) | (ADLAR << 1) | (MUX0 << 1); // Set ADC reference to AVCC, left adjust, Kanal
// No MUX values needed to be changed to use ADC0
ADCSRA = (1 << ADPS2) | (1 << ADPS0); // • 400000*13 = 520000
// • 16000000/520000 = 30,789 ~ 32 als Vorteiler(101)
// • 16000000/32 = 500000
// • 500000/13 = 38461 samples/s

// Set ADC prescaler to 32 - 500kHz @ 16MHz- sample rate 38461samples/s

ADCSRA |= (1 << ADIE); // Enable ADC Interrupt
ADCSRA |= (1 << ADEN); // Enable ADC
ADCSRA |= (1 << ADSC); // Start A2D Conversion
ADCSRA |= (1 << ADATE); //free running mode
// DIDR0=1;
sei(); // Enable Global Interrupts
i=0;
}

ISR(ADC_vect)
{

Serial.print(ADCH, DEC);
feld1 = ADCH;

  • i++;*
  • if(i>1024)*
  • {*
  • i=0;*
  • }*
  • DAC();*
    }
    void DAC()
    {
  • digitalWrite(9, HIGH);*
  • digitalWrite(10, HIGH);*

_ PORTL = feld1*; //Ausgabe Wert*_
* digitalWrite(9, LOW);*
* digitalWrite(10, LOW);*
}
void loop() {
}

Nutze bitte die Codeauszeichnungsmöglichkeiten des Forums.

Der linke obere Knopf des Eingabe Editors.
Mit </> beschriftet.

Was ist "AODEF.h"?
Wird das hier gebraucht?

#include <avr/io.h>

#include <avr/interrupt.h>

Wird das hier gebraucht?

 sei();   // Enable Global Interrupts

Wofür wird das hier gebraucht?

PORTL = feld1;  //Ausgabe Wert

Wo kommt PORTL her?
Warum schreibst du die Adresse des Feldes auf den Port?
Woher weiß der Port, daß er ein AusgabePort ist?
Mein UNO hat kein PORTL
Der Kompiler wirft einen fatal Error

char feld1[1024];

Warum char, wenn doch da Bytes, 8 Bit unsigned int gespeichert werden sollen?
Auch sollte es volatile sein...

 feld1 = ADCH;

Schon klar, dass du so kein Feld mit 1024 Speicherplätzen beschreiben kannst?!?!?
Der Kompiler wirft einen fatal Error

Serial.print in ISR sind verboten.
Denn sie können einen Deadlock verursachen.


Es gibt mir im Monitor die ganze Zeit 3330 aus.

Nein, der Code kompiliert gar nicht.
Der Kompiler wirft Meldungen.

Wahrscheinlich wird der Code verständlicher, wenn er in Code Tags eingeschlossen wird. Sonst können Indices etc. unterschlagen werden, bzw. als Umschaltung auf kursiv interpretiert werden, und so die unsinnige Verwendung von feld1 rauskommen.

Also den Code nochmal richtig posten.

ISR(ADC_vect)
{
 
  Serial.print(ADCH, DEC);
  feld1 = ADCH;
  i++;

  if(i>1024)
  {
    i=0;
  }
  DAC();

}

Das ist eine Interrupt Service Routine. In dieser sind Interrupts deaktiviert. Du schreibst aber auf die serielle Schnittstelle, welche wiederum von Interrupts abhängig ist für deren Funktion. Somit läufst Du hier Gefahr, einen sog. Dead-Lock, also ein Einfrieren des Arduinos zu riskieren.

PORTL = feld1;  //Ausgabe Wert

PORTL? Welchen Type Arduino setzt Du ein? Mega2560? Wieso weist Du einem Byte-Register ein Array zu? Das wird sicher nicht die gewünschte Ausgabe liefern.

Was hängt am Arduino?