Arduino defekt oder falsch gesetztes Register?

Hallo Gemeinde,

kann es sein, dass ich mein Board getötet habe?

Wen ich OCR2B auf z.B. 20 setze und OCR2B zur Kontrolle
im Loop auslese, wird mir 200 statt 20 angezeigt.

Bis heute Nachmittag hat alles funktioniert.
Gibt es eine Möglichkeit die Register bzw. den Arduino Mega
in den Auslieferungszustand zurück zu setzen?

Viele Grüße
Ronny

ArduinoFreund:
Hallo Gemeinde,

kann es sein, dass ich mein Board getötet habe?

Möglich. Glaube ich aber nicht.

ArduinoFreund:
Wen ich OCR2B auf z.B. 20 setze und OCR2B zur Kontrolle
im Loop auslese, wird mir 200 statt 20 angezeigt.

Bis heute Nachmittag hat alles funktioniert.
Gibt es eine Möglichkeit die Register bzw. den Arduino Mega
in den Auslieferungszustand zurück zu setzen?

Viele Grüße
Ronny

Die Register werden bei jedem Reset (auch bein Einschalten) initialisiert.

Schick uns bitte den gesamten Code.
Grüße Uwe

Hallo Uwe,

anbei der Code. Ist noch nicht aufgeräumt und die
Kommentare habe ich noch nicht aktualisiert.

Ich währe Froh, wenn Du etwas findest.

Momentan ist der Stand so, das OCR mir den Wert immer
um den Faktor 10 zu Hoch ausgibt.

#include <math.h>

int PIN_temp = 2; // Pin an den Messdaten gelesen werden
int PIN_SD = 3; // Pin digitaler Stromschalter
int R_F1 = 10000; // Widerstand des festen Widerstandes am Spannungsteiler
int R_NTC = 10000; // Widerstand des Thermistor bei 25° C -> siehe Datenblatt Thermistor
int i_v = 0; //Zähler für Vergleichsoperation
int S_t = 0; //Schalter Lüfterregler

float temp_u ; // Umgebunstemperatur
float V_a = 4.63; //Anliegende Spannung -> Voltmeter gemessen
float B_Temp = 25; // Basistemperatur
float B_25 = 3977; //Basiswert bei 25°C 10KOhm +-5% -> siehe Datenblatt Thermistor
float Tn = 298.15; // 25°C in Kelvin (0°C = 273,15K)
float Kelvin = 273.15; // Konstante Umrechung Kelvin in Celsius
float temp_v2; //Temporäre Variable um Temperaturveränderungen zu ermitteln
float temp_s= 22.00; //Temperaturschwellwert ab dem die Lüftung gestartet wird
float temp_va = 0.5; //Temperaturveränderung

unsigned long millis_akt = 0; // Millisekunden

void setup() {
  Serial.begin(9600); // Kommunikation starten
  pinMode(PIN_SD, OUTPUT); // Pin als Output deklarieren
  
  /* Erstmalige Temperaturbestimmung um in temp_v2 aktuelle Raumtemperatur zu schreiben,
  ohne diese Messung würde Zähler gleich auf 1 Springen, da temp_v2 noch auf 0 steht*/
  temp_u = temperatur(analogRead(PIN_temp)); //Pinwert lesen umrechnen & in Variable schreiben
  temp_u = celsius(temp_u); // Ermittelter Wert in Celcius umrechnen
  temp_v2 = temp_u;
  
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
    
  TCCR2A = _BV(COM2A0) | _BV(COM2B1) | /*_BV(WGM21)*/ | _BV(WGM20);
  TCCR2B = _BV(WGM22) | _BV(CS22);
  
  OCR2A = 180; // VGL
  OCR2B = 0; 

}

void loop() {
   // Temperaturmessung
   millis_akt = millis();
   temp_u = temperatur(analogRead(PIN_temp)); //Pinwert lesen umrechnen & in Variable schreiben
   temp_u = celsius(temp_u); // Ermittelter Wert in Celcius umrechnen
   S_t = 0;
   S_t = vergleich(temp_u);
   
   //Datenrückgabe
   
   // Serial.print(temp_u); // Wert im Serial Monitor ausgeben
   // Serial.println(" C"); // Einheit dazu schreiben
   Serial.print(";  OCR2B = "); // PWM ausgeben
   Serial.print(OCR2B); // Einheit dazu schreiben
   Serial.print(S_t);
   Serial.println(" Schaltwert");
   Serial.print("Millisekunden: ");
   Serial.println(millis_akt);
   delay(1000); // 500ms warten
  
   if (temp_u >= temp_s) {
     digitalWrite(PIN_SD, HIGH);
 } else {
     digitalWrite(PIN_SD, LOW);
     OCR2B = 20;
 }
   if (S_t > 0) {
     OCR2B = OCR2B + 40;
     
     if (OCR2B > 180) {
       OCR2B = 180;
     }
   }
   if (S_t < 0) {
     OCR2B = OCR2B - 40;
     
     if (OCR2B < 20) {
       OCR2B = 20;
     }
   }
}

// Brechnung der Temperatur
float temperatur(int V_raw) {
  
  // U = R * I -> R = U/I
  float U_term; //Aktuelle Spannung Thermristor
  float U_F1; //Spannung Vorwiderstand
  float I; //Strom in Ampere
  float R_akt; //Aktueller Widerstand
  float temp_k; //Temperatur in Kelvin

  //Vorberechnungen
  U_term = V_a / 1023 * V_raw; //gemessene Spannung am Termistor
  U_F1 = V_a - U_term; //errechnete Spannung am Vorwiderstand
  I = U_F1 / R_F1; //errechneter Strom am Thermistor
  R_akt = U_term / I; //errechneter Widerstand am Thermistor
  
  // Temperaturberechung mit Steinhart-Hart-Gleichung
  temp_k = (B_25*Tn) / (B_25+(log(R_akt/R_NTC)*Tn)); //errechnete Temperatur in Kelvin
  //temp_u = temp_k - Kelvin;
  
  return temp_k; // Temperatur in Kelvin zurückgeben
}

// Umrechnen der Temperatur in Cesius
float celsius(float temp_kon) {
 temp_kon = temp_kon - Kelvin;
 
 return temp_kon; // Temperatur in Celsius zurückgeben
}

float vergleich(float temp_v1) {
  Serial.print("temp_v2 = ");
  Serial.print(temp_v2); // Einheit dazu schreiben
 
  if (temp_v1 > temp_v2) {
    i_v = i_v + 1;
  } else if (temp_v1 < temp_v2){
    i_v = i_v - 1;
  }
  
  temp_v2 = temp_v1;
  
  Serial.print(";  temp_v1 = ");
  Serial.print(temp_v1); // Einheit dazu schreiben
  Serial.print(";  Zähler = ");
  Serial.print(i_v); // Einheit dazu schreiben
  
  if (i_v < -4) {
    i_v = 0;
    return -1;
  }
  
  if (i_v > 4) {
    i_v = 0;
    return 1;}
  
  else {
  return 0;
  }
  


  
}

Vielleicht helfen noch diese Info.

Ich habe ein anderes Programm getestet, bei dem 4 Taster
ausgelesen werden. Der Taster an Pin 5 (PWM Pin - Arduino MEGA 1280)
reagiert nicht.

Das Auslesen an Pin 7, mit der selben Schaltung, jedoch funktioniert.

Nun dachte ich Pin 5 ist defekt.

-> also ein weiterer Test:

Ein weiteres Programm von mir nutzt Pin 5 als OUTPUT um einen Mosfet zu
schalten und dort funktioniert er wieder.

Wahrscheinlich ist es heute schon zu spät.

Bis dahin.
Ronny

S_t = 0;
   S_t = vergleich(temp_u);
   ...
   Serial.print(";  OCR2B = "); // PWM ausgeben
   Serial.print(OCR2B); // Einheit dazu schreiben
   Serial.print(S_t);

S_T wird nach OCR2B geschrieben. Wenn S_t den Wert 0 hat, dann hast Du OCR2B mit "10 multipliziert".

Wenn Du den Kode in

Serial.print(OCR2B); // Einheit dazu schreiben
Serial.print(" "); Serial.print(S_t);

änderst, was bekommst Du dann ausgedruckt?

Grüße Uwe

Hallo Uwe,

was soll ich sagen....

.. es war doch schon zu spät. Vielen Dank für den Hinweis.
Jetzt funktioniert alles wieder so wie vorher.

Viele GRüße
Ronny