Serial.print Frage eines Beginners

Hallo Leute,

Ich bin gerade am Programmieren. Ich versuche hier Serial.println zu benutzen zur Fehlersuche. Jedoch wenn ich printe gibt mir das Programm im Serial Monitor die Ausgabe zweimal. Einmal so halb und dann ganz. (Wenn ich 9600Baud verwende)
Verwende ich 19200 Baud dann printed er mir zu Anfangs Fragezeichen.
Woran könnte das liegen?
Danke


```cpp
#include <TimerOne.h>
#include <math.h>


#define frequenz 0.1
//Spule 1
const int Pin_Spule1_Enable     = 3;
const int Pin_Spule1_Rechtslauf = A5;
const int Pin_Spule1_Linkslauf  = A4;

//Spule2
const int Pin_Spule2_Enable     = 5;
const int Pin_Spule2_Rechtslauf = A3;
const int Pin_Spule2_Linkslauf  = A2;

const int Anzahl_Stutzstellen_volle_Periode = 18;
int Tabelle_Sinuswerte_L1[Anzahl_Stutzstellen_volle_Periode] = {};
int Tabelle_Sinuswerte_L2[Anzahl_Stutzstellen_volle_Periode] = {};


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

  pinMode(Pin_Spule1_Enable , OUTPUT);
    pinMode(Pin_Spule1_Rechtslauf,OUTPUT);
      pinMode(Pin_Spule1_Linkslauf,OUTPUT);

  pinMode(Pin_Spule2_Enable , OUTPUT);
    pinMode(Pin_Spule2_Rechtslauf,OUTPUT);
      pinMode(Pin_Spule2_Linkslauf,OUTPUT);    

  float Periodendauer_T_sek = 1.0 / frequenz;
  float Winkelgeschwindigkeit_in_rad_pro_sek = 2 * M_PI * frequenz;
  float Interruptauslosezeit_in_ms = (Periodendauer_T_sek / Anzahl_Stutzstellen_volle_Periode) * 1000.0;

  Serial.println("TEST");
  //Serial.println(Periodendauer_T_sek);
  //Serial.println(Winkelgeschwindigkeit_in_rad_pro_sek);  
  //Serial.println(Interruptauslosezeit_in_ms);

for( int Aktuelle_TabellenPosition = 0 ; Aktuelle_TabellenPosition < Anzahl_Stutzstellen_volle_Periode; Aktuelle_TabellenPosition ++ )
    {
      float OmegaZeit_in_s = (Winkelgeschwindigkeit_in_rad_pro_sek * Interruptauslosezeit_in_ms * Aktuelle_TabellenPosition ) / 1000.0;
      Tabelle_Sinuswerte_L1[Aktuelle_TabellenPosition] = (int)(255 * (sin( OmegaZeit_in_s + 120 * 0)));
      Tabelle_Sinuswerte_L2[Aktuelle_TabellenPosition] = (int)(255 * (sin( OmegaZeit_in_s + 120 * 1)));
   }
// Timer Interrupt Initialisieren 
      Timer1.initialize ((Interruptauslosezeit_in_ms * 1000));     // Zeit in mykro sekunden
      Timer1.attachInterrupt (ISR_ZeitInterrupt);


}



volatile int akt_PWM_Tastgrad_L1 = 0;
volatile int akt_PWM_Tastgrad_L2 = 0;

volatile int ListenPositionsCounter = 0;  
void ISR_ZeitInterrupt () 
{




akt_PWM_Tastgrad_L1 = Tabelle_Sinuswerte_L1[ListenPositionsCounter];
akt_PWM_Tastgrad_L2 = Tabelle_Sinuswerte_L2[ListenPositionsCounter];

// Spule 1
if(akt_PWM_Tastgrad_L1 > 0)   // Rechtslauf Spule 1
  {
    digitalWrite(Pin_Spule1_Linkslauf,   LOW);
    digitalWrite(Pin_Spule1_Rechtslauf, HIGH);
                                                     
  }


if(akt_PWM_Tastgrad_L1 == 0)
  {
     digitalWrite(Pin_Spule1_Linkslauf,   LOW);
     digitalWrite(Pin_Spule1_Rechtslauf, LOW);
                                                     
  }

if(akt_PWM_Tastgrad_L1 < 0)   // Rechtslauf Spule 1
  {
    digitalWrite(Pin_Spule1_Linkslauf,   HIGH);
    digitalWrite(Pin_Spule1_Rechtslauf, LOW);
                                                     
  }

  //Spule 2
  if(akt_PWM_Tastgrad_L2 > 0)   // Rechtslauf Spule 1
  {
    digitalWrite(Pin_Spule2_Linkslauf,   LOW);
    digitalWrite(Pin_Spule2_Rechtslauf, HIGH);
  }


if(akt_PWM_Tastgrad_L2 == 0){
     digitalWrite(Pin_Spule2_Linkslauf,   LOW);
     digitalWrite(Pin_Spule2_Rechtslauf, LOW);
}

if(akt_PWM_Tastgrad_L2 < 0)   // Rechtslauf Spule 1
  {
    digitalWrite(Pin_Spule2_Linkslauf,   HIGH);
    digitalWrite(Pin_Spule2_Rechtslauf, LOW);
  }


analogWrite(Pin_Spule1_Enable, abs(akt_PWM_Tastgrad_L1));
analogWrite(Pin_Spule2_Enable, abs(akt_PWM_Tastgrad_L2));

ListenPositionsCounter ++;

if(ListenPositionsCounter == Anzahl_Stutzstellen_volle_Periode){
  ListenPositionsCounter = 0;
}

//Serial.println(ListenPositionsCounter);
//Serial.println(akt_PWM_Tastgrad_L1);
//Serial.println(akt_PWM_Tastgrad_L2);

}
void loop() {
  // put your main code here, to run repeatedly:

}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Es hängt wahrscheinlich mit dem Neustart Ihres Arduino nach dem Hochladen des Codes zusammen. Wenn Sie delay(2000); vor Serial.begin() hinzufügen, verhält sich das Programm dann gleich?

1 Like

Welchen Arduino verwendest Du?

Ich vermute, es ist kein Arduino sondern ein ESP32 oder sowas, die verhalten sich so. Lösung siehe Beitrag #3, wobei delay(500); bei mir ausreicht. 19200 Baud ist die Lieblingsgeschwindigkeit des ESPs.

@elektronik_beginner
In einer ISR haben Print Ausgaben nichts verloren!

Danke hat geklappt

Danke Arduino uno R3 von elegoo

Ja danke hatte die genutzt um am Osziloskop mein Bild mit den Werten vergleichen zu können werden aber wieder rausgeholt

Dann kannst Du bitte #3 als Lösung markieren :slightly_smiling_face:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.