Sketch läuft nach wechsel von Mega auf Tiny nicht mehr

Guten Abend Forum,

dies ist mein erster Beitrag und ich hoffe einfach mal, dass er richtig platziert war und alle nötigen Informationen enthält.

Zur groben Beschreibung der Situation. Ein Arbeitskollege von mir brauch für den Vergleich der Fördermenge von Einspritzdüsen einen Rechteckgenerator mit verstellbarer Einschaltzeit. Das Einstellen der Periodendauer wird über einen Drehschalter mit 12 Positionen realisiert, welcher wiefolgt schaltet. Pin 1 -> Pin 2 -> Pin 3 -> Pin 4 -> Pin 1 -> Pin 2 ->...

Die Schaltung sowie der folgende Sketch haben auf einem Board mit Megachip (https://www.amazon.de/gp/product/B01MA5BLQI/ref=ppx_yo_dt_b_search_asin_image?ie=UTF8&psc=1) problemlos funktioniert und es waren auch, für den Zweck, ausreichend genau Frequenzen mit dem Oszilloskop messbar.

Aufgrund der geringen Anzahl an benötigten Pins und um für minimale Materialkosten und Platzverbrauch zu sorgen, habe ich mich auf der Suche nach einem passendem Board für dieses, mit einem Attiny85, entschieden. (https://www.amazon.de/gp/product/B076KVKHH1/ref=ppx_yo_dt_b_search_asin_image?ie=UTF8&psc=1)

Nun habe ich das Sketch auf den Attiny85 kompiliert, wobei kein Fehler angezeigt wurde. Auch das Aufspielen ging ohne Probleme.
Nur das Programm möchte nicht so richtig laufen. Beim Drehen des Schalters scheint der Tiny nicht richtig mit zu zählen und der Ausgang schaltet nicht korrekt.

Könnte dies einfach an der unterschiedlichen Rechenleistung der Chips liegen und sollte ich daher eventuell auf einen Nano oder Uno umsteigen? Oder kann dies andere Ursachen haben?

Ich bedanke mich schonmal für die Hilfe.
Mit freundlichen Grüßen
Benny :slight_smile:

  int S1;
  int S1pos;
  int S2;
  int S2pos;
  int S3;
  int S3pos;
  int S4;
  int S4pos;
  int Hzh;
  int Hzr;
  int Ansteuerung;
  int Pause;

void setup() {
  pinMode (0, INPUT);
  pinMode (1, OUTPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  Ansteuerung = 0;
  Hzh = 0;
  Hzr = 0;
  S1pos = 0;
  S2pos = 0;
  S3pos = 0;
  S4pos = 0;
  Pause = 5;
}

void loop() {

  if (Hzh == 1)                         // Ansteuerung erhöhen
  {
    Ansteuerung = Ansteuerung + 1;
    Hzh = 0;
  }

  if (Hzr == 1)                         // Ansteuerung verringern
  {
    Ansteuerung = Ansteuerung - 1;
    Hzr = 0;
  }



  if (digitalRead(0) == 1)            //Status S1 abfragen
  {
    if (S1 == 0)                        //positive Flanke S1
    {
      S1pos = 1;                      //Flanke S1 speichern
    }
    if (S1 == 1)                       //keine positive Flanke
    {
      S1pos = 0;              
    }
    S1 = 1;                           //Status S1 speichern
  }

  if (digitalRead(2) == 1)            //Status S2 abfragen
  {
    if (S2 == 0)                      //positive Flanke S2
    {
      S2pos = 1;                      //Flanke S2 speichern
    }
    if (S2 == 1)                      //keine positive Flanke
    {
      S2pos = 0;                      
    }
    S2 = 1;                           //Status S2 speichern
  }

  if (digitalRead(3) == 1)            //Status S3 abfragen
  {
    if (S3 == 0)                      //positive Flanke S3
    {
      S3pos = 1;                      //Flanke S3 speichern
    }
    if (S3 == 1)                      //keine positive Flanke
    {
      S3pos = 0;
    }
    S3 = 1;                           //Status S3 speichern
  }

  if (digitalRead(4) == 1)            //Status S4 abfragen
  {
    if (S4 == 0)                      //positive Flanke S4
    {
      S4pos = 1;                      //Flanke S4 speichern
    }
    if (S4 == 1)                      //keine positive Flanke
    {
      S4pos = 0;
    }
    S4 = 1;                           //Status S4 speichern
  } 
   
  if ((S1 == 1) && (S2pos == 1))      //hochzählen wenn S1 auf S2
  {
    Hzh = 1;
    S1 = 0;
  }

  if ((S2 == 1) && (S3pos == 1))      //hochzählen wenn S2 auf S3
  {
    Hzh = 1;
    S2 = 0;
  }

  if ((S3 == 1) && (S4pos == 1))      //hochzählen wenn S3 auf S4
  {
    Hzh = 1;
    S3 = 0;
  }

  if ((S4 == 1) && (S1pos == 1))      //hochzählen wenn S4 auf S1
  {
    Hzh = 1;
    S4 = 0;
  }



  if ((S4 == 1) && (S3pos == 1))      //runterzählen wenn S4 zu S3
  {
    Hzr = 1;
    S4 = 0;
  }

  if ((S3 == 1) && (S2pos == 1))      //runterzählen wenn S3 zu S2
  {
    Hzr = 1;
    S3 = 0;
  }

  if ((S2 == 1) && (S1pos == 1))      //runterzählen wenn S2 zu S1
  {
    Hzr = 1;
    S2 = 0;
  }

  if ((S1 == 1) && (S4pos == 1))      //runterzählen wenn S1 zu S4
  {
    Hzr = 1;
    S1 = 0;
  }

  if (Ansteuerung >= 1)               //Ausgang ansteuern
  {
   digitalWrite(1, HIGH);
   delay (Ansteuerung);
   digitalWrite(1, LOW);
   delay (Pause);
  }

}

Wäre
S1pos = !S1;
nicht einfacher?

Grüße Uwe

Hast du an den Eingangspins auch Pullup oder Pulldown Widerstände montiert.
Du kannst auch die internen Pullup Widerstände verwenden.
PinMode(x, INPUT_PULLUP);

Und alternativ kannst du einen Arduino Pro mini verwenden.

Link zum Drehschalter?
Schaltplan?

Wenn du vorher mit 16MHz getestet hast, dann solltest du auch den Tiny mit 16MHz intern laufen lassen.

Ansonsten:
Wie immer: Der Fehler ist dort, wo du meinst, dass alles ok ist.
Genau das, was du vor dir und vor uns geheim hältst.

Steht "!" in dem Fall dann als Befehl für eine Negation?

Den Schaltplan musste ich noch zeichnen, war mir dann gestern doch etwas zu spät.

und hier der Link zum Schalter

Wenn ich das die Funktion richtig verstanden habe sollten das, so wie ich die angeschlossen habe, Pulldown Widerstände sein.

Danke für den Tipp mit dem Pro Mini, den werde ich mir mal vormerken :slight_smile:

Was ist das für ein merkwürdiger ATTINY85, der mit 12 Volt arbeitet ?

Also, wie mein Ausbilder immer gesagt hat. "Fehlercode 40. Der Fehler sitzt 40cm vor dem Monitor."
Ich hoffe mal der Schaltplan zeigt vllt was, was ich übersehe :confused:

Ja, lt. deiner Schaltung sind es Pulldown-Widerstände.

Auf dem Attinyboard ist ein Festspannungsregler verbaut, dadurch ist die Versorgungsspannung auf max 16V gesetzt

Dann solltest du das nicht verschweigen.
Siehe:

Ein ATtiny85 alleine verträgt die 12Volt nicht.

Deswegen hatte ich den Link zum Board am Anfang mit reingeschickt, aber fürs nächste Mal merke ich es mir. Hier zwei Ausschitte aus dem Datenblatt, ich kann die pdf leider nicht hochladen, da ich neu im Forum bin.

Sorry, das habe ich übersehen.
Diese Info gehört aber def. mit ins Schaltbild, da richtet man sich meist nach.

Meine Vermutung dazu, die flashst den mit einer falschen Taktfrequenz.
Da ich diese Teil nicht nutze, kann ich da auch leider nicht weiter helfen.

1 Like

Ist vermerkt :+1:

Okay, ich schaut später mal ob ich in die Richtung was ändern kann.
Danke trotzdem für die schnellen Antworten und deine Hilfe. :slight_smile:

Wenn S1 ein bool wäre und kein int ist, schon.
Sieht so aus als ob das auch so gedacht ist.
(Merke: Datentyp int ist in der Regel nur Schlamperei)

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