Nerf tuning projekt. analogWrite(3, 25) auf attiny85 funktioniert nicht

Hi, ich komme nicht weiter.

Ich möchte mit dem anliegenden Sketch die Leistung eines Laser drosseln und möchte mit meinen UNO einen attiny85 entsprechend programmieren. Ich habe dengleichen sketch mit analogWrite(0, 25) getestet (sketch nerfLaserPIN0) und er funktioniert einwandfrei. Aber mein attiny weigert sich den o.g. befehl auszuführen. lt. meinen Infos ist der PB3 (physich PIN2) des attiny auch ein PWM PIN. Im bootloader habe ich keinerlei Veränderungen vorgenommen. Der eine sketch funktioniert, der ander nicht (nerfLaserPIN3). da ich schon eine platine angefertigt habe, steht mir kleider pin0 nicht mehr zur Verfügung. Habt ihr ne Idee? VG

der folgende code funktioniert nicht:

bool dauer = false;   //betriebsmodus dauerhaft an
bool strobo = false;  //betriebsmodus stroboskop
bool taster = false;  //taster
bool tasteran = false; //taster nach timer

int freq1 = 40;  //intervall stroboskop lampe1

unsigned long timer1 = 0;  //timer für stroboskop
unsigned long timer2 = 0;  //timer zum entprellen taster loslassen
unsigned long timer3 = 0;  //timer zum entprellen taster fassen



void setup() {


  
  pinMode(3, OUTPUT);        //schaltung mosfet alpha
  pinMode(4, INPUT_PULLUP);  //schaltung stroboskop
  pinMode(2, INPUT_PULLUP);  //taster
  pinMode(1, OUTPUT);        //schaltung des mosfet beta
  pinMode(0, OUTPUT);        //schaltung mosfet laser
  analogWrite(3, 25);
  delay(500);
  digitalWrite(1, HIGH);
  digitalWrite(0, HIGH);
  delay(1000);
}

void loop() {


  strobo = digitalRead(4);  //schaltung stroboskop
  taster = digitalRead(2);  //taster

  if (taster == true) {
    timer3 = millis();
  }

if (taster == false && millis() - timer3 > 15) {
  tasteran = true;
} 

if (taster == false) {
  timer2 = millis();
}

if (taster == true && millis() - timer2 > 25) {
  tasteran = false;
}

  if (strobo == false) {
    dauer = true;
  } else {
    dauer = false;
  }

  if (tasteran == true && dauer == false) {
    digitalWrite(1, HIGH);
    analogWrite(3, 25);
    digitalWrite(0, HIGH);
  }

  if (tasteran == false) {
    digitalWrite(1, LOW);
    analogWrite(3, 0);
    digitalWrite(0, LOW);
  }

  if (tasteran == true && strobo == false) {
    analogWrite(3, 25);
  }


  if (strobo == false && tasteran == false) {
    timer1 = millis();
  }
  if (strobo == false && tasteran == true && millis() - timer1 < freq1) {
    digitalWrite(1, HIGH); //Lampe1
    digitalWrite(0, LOW);  //sound
  }

  if (strobo == false && tasteran == true && millis() - timer1 > freq1) {
    digitalWrite(1, LOW);
    digitalWrite(0, HIGH);
  }

  if (strobo == false && tasteran == true && millis() - timer1 > 2 * freq1) {
    timer1 = millis();
  }
  
}


der folgende code funktioniert:

bool dauer = false;   //betriebsmodus dauerhaft an
bool strobo = false;  //betriebsmodus stroboskop
bool taster = false;  //taster
bool tasteran = false; //taster nach timer

int freq1 = 40;  //intervall stroboskop lampe1

unsigned long timer1 = 0;  //timer für stroboskop
unsigned long timer2 = 0;  //timer zum entprellen taster loslassen
unsigned long timer3 = 0;  //timer zum entprellen taster fassen



void setup() {


  pinMode(3, OUTPUT);        //schaltung mosfet alpha
  pinMode(4, INPUT_PULLUP);  //schaltung stroboskop
  pinMode(2, INPUT_PULLUP);  //taster
  pinMode(1, OUTPUT);        //schaltung des mosfet beta
  pinMode(0, OUTPUT);        //schaltung mosfet laser
  analogWrite(0, 25);
  delay(500);
  digitalWrite(1, HIGH);
  digitalWrite(3, HIGH);
  delay(1000);
}

void loop() {


  strobo = digitalRead(4);  //schaltung stroboskop
  taster = digitalRead(2);  //taster

  if (taster == true) {
    timer3 = millis();
  }

if (taster == false && millis() - timer3 > 15) {
  tasteran = true;
} 

if (taster == false) {
  timer2 = millis();
}

if (taster == true && millis() - timer2 > 25) {
  tasteran = false;
}

  if (strobo == false) {
    dauer = true;
  } else {
    dauer = false;
  }

  if (tasteran == true && dauer == false) {
    digitalWrite(1, HIGH);
    analogWrite(0, 25);
    digitalWrite(3, HIGH);
  }

  if (tasteran == false) {
    digitalWrite(1, LOW);
    analogWrite(0, 0);
    digitalWrite(3, LOW);
  }

  if (tasteran == true && strobo == false) {
    analogWrite(0, 25);
  }


  if (strobo == false && tasteran == false) {
    timer1 = millis();
  }
  if (strobo == false && tasteran == true && millis() - timer1 < freq1) {
    digitalWrite(1, HIGH); //Lampe1
    digitalWrite(3, LOW);  //sound
  }

  if (strobo == false && tasteran == true && millis() - timer1 > freq1) {
    digitalWrite(1, LOW);
    digitalWrite(3, HIGH);
  }

  if (strobo == false && tasteran == true && millis() - timer1 > 2 * freq1) {
    timer1 = millis();
  }
  
}

Was genau heißt das ?
Meinst du den Bootloader des ATtiny85 ?
Dir ist hoffentlich bekannt, dass du dem ATtiny auch mitteilen musst, mit welcher Taktfrequenz dieser arbeiten soll und das machst du mittels Bootloader.
Was die PWM Pins des ATtiny85 betrifft, gibt es da sehr widersprüchliche Angaben. Ich nutze z.B. den PB4, und der PB0 und PB1 soll da auch funktionieren.
Über mehr habe ich noch keine Angaben gefunden.

Ich habe den Code nicht verstanden.
Vor allem, weil da soviele Bedingen doppelt sind, dass Du spätestens nach der 3ten Bedingung aufgibst und nicht mehr weisst, was da vorher tatsächlich drin stand.
Sowas hier....

Wenn Du den Teil dazwischen raus nimmst, kommt dabei raus:

 if (tasteran == true)
 {
  if (dauer == false) 
  {
    digitalWrite(1, HIGH);
    analogWrite(0, 25);
    digitalWrite(3, HIGH);
  }
  if (strobo == false) 
  {
    analogWrite(0, 25);
  }
}

Und nun kommt der Teil, der dazwischen war dahin wo er hin gehört:

if (tasteran == true)
{
 if (dauer == false) 
 {
   digitalWrite(1, HIGH);
   analogWrite(0, 25);
   digitalWrite(3, HIGH);
 }
 if (strobo == false) 
 {
   analogWrite(0, 25);
 }
}
else
{
   digitalWrite(1, LOW);
   analogWrite(0, 0);
   digitalWrite(3, LOW);
}

Schön wäre es, wenn Du auf magicNumbers verzichtet hättest.
Dann hätte man eine Chance da irgendwas nachzuvollziehen.
Wenn ich noch Zeit hab, schau ich mal, ob ich den funktionierenden umschreibe... Aber verlaß Dich nicht drauf

PWM an PB3 ist auf dem ATTiny nicht so einfach.
Gibt da einige Threads die das behandeln. Mit einem einfachen analogWrite der Arduino IDE geht es nicht.

damit war nur gmeient, dass ich die beiden sketches mit denselben bootloader einstellungen geladen habe. Ich takte den attiny85 mit 1MHZ

Danke, aber nicht notwendig, ich löte dann auf der Platine um und nutze den PB0

Natürlich kann man PB3 als PWM nutzen.

Einschränkungen:

  1. Gleiche Pulsweite wie PB4, nur invertiert,
  2. Nicht mit analogWrite()

Also timer 1 verwenden….