Hilfe, bekomme nicht das gewünschte Signal vom DAC

Hallo,
ich habe ein Problem: Mein Ziel ist es, digitale Signal vom Arduino in ein analoges Signal durch meinen DAC umzuwandeln. Jedoch erscheint bei mir am Ausgang nicht das gewünschte Signal. Wenn ich beispielsweise eine Sinussignal vom Funktionsgenerator einspeise, erscheint am Ausgang eine ''Treppenfunktion'. Beim Rechtecksignal hingegen, erscheint auch am Ausgang ein Rechtecksignal.

Ich benutze einen ArduinoMega2560. Als Eingang verwende ich den Pin A0.

Als DAC wird der AD557 verwendet. Dabei ist wichtig zu beachten, dass die Pins 1-8 vom DAC mit dem PortL(42-49) verbunden sind. Das CS hat den Pin 9 und das CE hat den Pin 10. CS ist mit dem Pin 40 des Arduino verbunden und CE mit den Pin 41.

Bitte um Hilfe, bin schon am verzweifeln!

Hier ist der Programmcode:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <LiquidCrystal.h>
#include <stdio.h>
#include "AODEF.h"


volatile static int i = 0;
volatile static uint8_t feld1[4999];

volatile static uint8_t j;
char x[100];
// LCD Setup:    rs  e  d4 d5 d6 d7 - Digital Pinnummern Arduino
// rw auf GND
LiquidCrystal lcd(12, 10, 5, 4, 3, 2);


void setup() 
{ 
   cli();
   Serial.begin(9600);
  lcd.begin(16, 2);  
  lcd.clear();
  lcd.setCursor(0,1);
//  
  /////////////////////////////DAC/////////////////////////////
  pinMode(40,OUTPUT);
  pinMode(41,OUTPUT);

  digitalWrite(40, LOW);
  digitalWrite(41, LOW);


  DDRL =0xFF;  //OUTPUT
  
  ///////////////////////ADC///////////////// //
  pinMode(A0,INPUT);
  
   ADCSRA=0;
   ADMUX=0;
   ADCSRB=0; // ADTS auf Null free running mit ADate

   ADMUX =  B01100000;
   ADCSRA = B11101110;
  
  sei();   // Enable Global Interrupts
  i=0;
}

ISR(ADC_vect)
{ 
  j=ADCH;
  feld1[i]=j;
  
  lcd.setCursor(0,1);
  
  utoa (j, x, 10);      //itoa (ADCH, x, 10);
  lcd.print(x);
  lcd.print("    ");
  
  digitalWrite(40, LOW);
  
  PORTL = j;  //Ausgabe Wert
  
  digitalWrite(40, HIGH);
 
  i++;
  if(i>4998)

  { 
    i=0;
  }
}

void loop() {
}

Hallo,

grauenvoll, wild kopierter Code von irgendwoher.
Mach mal Code Tags drum, kann sonst niemand lesen.

Der Code ist schrecklich

In einer ISR darfst du nicht Serial verwenden. Sondern nur ein Flag setzten und die Ausgabe in loop() machen. Dabei Variablen die innerhalb und außerhalb von ISRs verwenden werden volatile machen und den Zugriff atomar.

Außerdem solltest du die Baudrate auf Maximum setzen! Und nicht mit mickrigen 9600 Baud arbeiten wo ein Zeichen 1ms dauert

itoa() ist überflüssig. Das kann auch print() erledigen

Doc_Arduiono kannst du mit bitte erklären wie man Code Tags macht? bin noch ganz nue hier.

feld1=j;

Wenns kursiv wird, stand da vermutlich ein [``i``].

Code Tags verwenden, sonst lesen es viel weniger Leute.

Markiere den Text, dann klick hier oben links auf </>
Es wird ein AnfangsTag ( [code``] ) und das zugehörige EndeTag gesetzt.
Preview zum Anschauen vor dem Posten.

Mit More / Modify geht das für dich selbst und Moderatoren auch nachträglich.

@ Uwe, den Thread bitte löschen, wir machen im anderen weiter. Danke.
Bin mal so frei und frech das festzulegen, sonst gibts Kaos. :slight_smile:

Ja bitte löschen.