PB5

Hallo zusammen,

ich habe im Netz einen Sketch gefunden der für ein "belebtes Haus" für die Modellbahn geschrieben wurde.
Dieser Sketch wurde mit Tatkräftiger Unterstützung dieses Forums gebaut und darum wende ich mich auch an euch mit meinem Problem.
Ich habe den Sketch mit einem Arduino Uno auf den Attiny hochgeladen und er funktioniert auch soweit, aber der Ausgang PB5 leuchtet immer ganz leicht und macht nicht was er soll.
Kann mir jemand sagen woran das liegen könnte ?

Hier nochmal der Sketch :

/*  Simulation "belebtes Haus für die Modellbahn" */
/*  Version "Flimmern nur wenn die Pin-2 LED an ist */
byte pwmFlimmerPin=1; // PWM Pin für das "analoge" Flimmern
long flimmerStart,flimmerEnd; // Anfangs- und Endzeiten für das Flimmern
// LED Pins für das normale Blinken deklarieren
byte leds[]   ={   5,    4,   3,   2,   0};
// LED Blinktakt in Millisekunden für diese Pins
long ledtakt[]={6000, 8800, 13000, 20000, 20400};
// Variablen zum Merken von millis()-Zeiten beim Schalten/Blinken
long ledtime[sizeof(leds)];

void setup() {
//  Serial.begin(9600);
  // Alle verwendeten Pins auf OUTPUT setzen
  pinMode(pwmFlimmerPin, OUTPUT);  
  for (int i=0;i<sizeof(leds);i++)
    pinMode(leds[i], OUTPUT);
}

boolean milliSekundenTakt(int dauer, long &alterWert) {
// Parameter "dauer": Dauer einer Blinkphase (an bzw. aus)
// Parameter "alterWert": Variable zum Speichern des millis() Timers
// Rückgabewert: true wenn die Zeit bis zum nächsten Umschalten abgelaufen ist, sonst false
  if (millis() - alterWert < dauer) return false;
  while (millis() - alterWert >= dauer) alterWert+=dauer;
  return true;  
}

void blinkenImTakt() {
  
// Alle gleichmäßig blinkenden LEDs in ihrem eigenen Takt blinken lassen  
  for (int i=0;i<sizeof(leds);i++) // alle LEDs in einer Schleife durchgehen
  {
    if (milliSekundenTakt(ledtakt[i],ledtime[i])) // Takt für diese LED abgelaufen?
    {
      digitalWrite(leds[i],!digitalRead(leds[i]));  // wenn ja ==> Umschalten
      if (leds[i]==0 && digitalRead(leds[i])) // Pin-13 LED wurde gerade eingeschaltet
      {
       flimmerStart=millis()+2000; // Anfangszeit für das Flimmern setzen
       flimmerEnd =millis()+15000;  // Endzeit für das Flimmern setzen
      }  
//      Serial.print("Pin ");Serial.print(leds[i]);Serial.print(" = ");Serial.println(digitalRead(leds[i]));
    }
  }
}

void flimmernPwmPin() {
// Die flimmernde LED im Zufallsmodus flimmern lassen
  static long alterWert;
  static int flimmerDauer=200;
  static byte flimmerHelligkeit;
  if (milliSekundenTakt(flimmerDauer,alterWert)) // Takt abgelaufen?
  {
    flimmerDauer=1+random(200); // neue Flimmerdauer als Zufallswert
    if (millis()>flimmerStart && millis()<flimmerEnd)
      flimmerHelligkeit=random(256); // neue Flimmerhelligkeit als Zufallswert
    else  
      flimmerHelligkeit=0; // Flimmern aus wenn falsche Zeit zum Flimmern
    analogWrite(pwmFlimmerPin, flimmerHelligkeit); 
  }  
}

void loop() {
  blinkenImTakt();
  flimmernPwmPin();
}

Vielen Dank schonmal für die Hilfe.

Gruß
Patrick

PatrickD78:
ich habe im Netz einen Sketch gefunden der für ein "belebtes Haus" für die Modellbahn geschrieben wurde.
Dieser Sketch wurde mit Tatkräftiger Unterstützung dieses Forums gebaut und darum wende ich mich auch an euch mit meinem Problem.
Ich habe den Sketch mit einem Arduino Uno auf den Attiny hochgeladen und er funktioniert auch soweit, aber der Ausgang PB5 leuchtet immer ganz leicht und macht nicht was er soll.
Kann mir jemand sagen woran das liegen könnte ?

Wäre schön, wenn du uns mitteilst, welchen ATtiny du verwendet hast.

Ist es der ATtiny85 o.ä. dann ist an PB5 normal der Reset dran und kann nicht als digitaler Pin verwendet werden.

Hi Sorry das hab ich ganz vergessen, es handelt sich um einen Attiny45.

HotSystems:
Ist es der ATtiny85 o.ä. dann ist an PB5 normal der Reset dran und kann nicht als digitaler Pin verwendet werden.

Ist es ein nackter ATtiny45 oder einer mit Bootloader? Wie bringst Du ein Programm auf den ATtiny45?

Wenn Du den ATtiny mit einem UNO o. Ä. als Programmer beschreibst, brauchst den den PB5 als Reset.

Wenn Du einen Bootloader drauf hast, kannst Du ein Programm auch per Bootloader übertragen. Dann könntest Du über die Fuses PB5 als normalen IO definieren. Allerdings nimmst Du Dir damit die Möglichkeit, den Bootloader zu ändern oder per ISP Programme zu übertragen. Dann benötigst Du einen speziellen Programmer mit einer höheren Programmierspannung, um die Fuses zu ändern. (Diesen Absatz habe ich praktisch noch nicht erprobt.)

Wenn Dir Ports fehlen, kannst Du Portexpander nutzen oder auf ATtiny4313 oder vergleichbare umsteigen.

Agmue hat es schon geschrieben, auch der nackte ATtiny45 braucht den Pin PB5 als Reset.
Damit kannst du ihn nicht direkt als digitalen Pin nutzen.

Als Alternative kannst du den ATtiny44 nehmen.

Ich denke mal das es ein nackter Attiny45 ist :o

Ich dachte ich habe irgendwas falsch gemacht, da im Sketch der Ausgang 5 steht, und der aber nicht funktionert hat.
Bei der nächsten Bestellung die ich mache werde ich mal einen Attiny44 mitbestellen und mit dem noch etwas experimentieren.
Danke erstmal für die Infos

PatrickD78:
Ich denke mal das es ein nackter Attiny45 ist :o

Ich dachte ich habe irgendwas falsch gemacht, da im Sketch der Ausgang 5 steht, und der aber nicht funktionert hat.
Bei der nächsten Bestellung die ich mache werde ich mal einen Attiny44 mitbestellen und mit dem noch etwas experimentieren.
Danke erstmal für die Infos

Wenn du ihn einzeln beim Händler (ohne Platine) bezogen hast, hat dieser keinen Bootloader und da ist dann Pin PB5 der Reset.
Der ATtiny44 wird es sicher machen.