AnalogWrite legt Code lahm

Hi,
einmal kurz ne Beschreibung was der Code machen soll:
Ich empfange via 433MHZ ein Signal.
Dieses wird in seine Bestandteile zerlegt (r,g,b).
Danach konvertiere ich den String in Integer, da er mir sonst nen Fehler auswirft.
Und als letztes sollen dann die 3 PWM Ausgänge mit den Werten geschaltet werde.
Es funktioniert auch alles super, wenn ich die analogWrite befehle weg lasse.
Sobald diese aber auftauchen funktioniert nix mehr.
Hat vielleicht jemand ne idee woran es liegt.

#include <VirtualWire.h>
char received[100];
String receivedstring;
String r,b,g;
int g1,b1,r1;
void setup(){
  Serial.begin(9600);
  vw_set_rx_pin(14);
  vw_setup(4000);
  vw_rx_start();
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
}

void loop(){
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  
 if (vw_get_message(buf, &buflen)) // Non-blocking
	{
	    int i;
	    for (i = 0; i < buflen; i++)
	    {
		received[i]=buf[i];
	  }
            receivedstring=received;
            receivedstring=receivedstring.substring(0,2);
            Serial.println(receivedstring);
            if (receivedstring=="A1")
            {
              r=received;
              b=received;
              g=received;
              r=r.substring(3,6);
              b=b.substring(7,10);
              g=g.substring(11,14);
              r1=r.toInt();  
              b1=b.toInt();  
              g1=g.toInt();             
              Serial.println(r1);
              Serial.println(b1);
              Serial.println(g1);
              delay(100);
              analogWrite(12,r1);
              analogWrite(11,b1);
              analogWrite(10,g1);
            }
	}
}

Falls das ein Uno ist, ist Pin 12 kein PWM.

ich glaube allerdings nicht dass er sich deswegen aufhängt.

Nein es ist ein Mega

Welchen Wert hat VW_MAX_MESSAGE_LEN ???

mys3lf:
Nein es ist ein Mega

Die PWM-Pins 11 und 12 auf dem MEGA werden von Timer1 gesteuert.

Und dreimal darfst Du raten, von welchem Timer VirtualWire gesteuert wird.
(Tipp: Man kann es in der Dokumentation zu VirtualWire nachlesen)

30
Edit:
Ok
habe jetzt mal die Pins 10,9,8 verwendet.
Funktioniert leider trotzdem nicht.

Sobald ich das Signal "schreibe" funktioniert es nicht mehr.
Er reagiert dann nicht mal mehr auf weitere Funksignale.

mys3lf:
Funktioniert leider trotzdem nicht.

Welche Arduino-Version verwendest Du?

Hast Du mal probiert, nur eine der drei analogWrite-Zeilen im Code zu aktivieren und kannst es an einem bestimmten PWM-Pin festmachen, mit dem der Code nicht mehr funktioniert?

Warum überträgst Du per Funk mehr als die 5 Bytes ('A', '1' und die drei rgb-Bytes)?

Und warum verwendest Du überhaupt erst umständlich String-Objekte in Deinem Sketch, die sowohl zur AVR-Libc als auch zur VirtualWire-Library inkompatibel sind?

Ich verwende die Version 1.0.5

Habe es jetzt aber hinbekommen.
Es scheint wohl nicht zu reichen nur die Masse zu verbinden...

Wie würdest du es denn sonst übertragen wollen ?

Habe mich bisher noch nicht so viel mit dem Arduino beschäftigen können, daher bin ich froh wenn es überhaupt klappt.
Aber wie gesagt wenn du eine andere Idee hast, gerne her damit.

mys3lf:
Habe es jetzt aber hinbekommen.

Na bravo!

mys3lf:
Es scheint wohl nicht zu reichen nur die Masse zu verbinden...

Was auch immer das im Zusammenhang mit dem von Dir geschilderten Softwareproblem zu tun haben mag.

mys3lf:
Wie würdest du es denn sonst übertragen wollen ?

Erstmal würde ich ein Funkprotokoll kurz halten und keine Romane übertragen. Also wenn Du eine ASCII-Kennung aus zwei Bytes und drei 8-Bit RGB-Werte im Binärcode übertragen möchtest, wären das für mich fünf Bytes, die übertragen werden.

Du dagegen überträgst reinen ASCII-Code, quasi wie einen auf der Schreibmaschine getippten Text, was die Übertragung länger macht und es beim Empfänger unnötigt verkompliziert, aus dem "getippten Text" wieder Zahlenwerte zu machen.

mys3lf:
Habe mich bisher noch nicht so viel mit dem Arduino beschäftigen können, daher bin ich froh wenn es überhaupt klappt.
Aber wie gesagt wenn du eine andere Idee hast, gerne her damit.

Weiterhin würde ich auf die vier String-Objekte verzichten:

String receivedstring;
String r,b,g;

Diese vier Variablen brauchst Du nicht mal dann, wenn Du die Übertragung nicht auf die effektiv notwendigen Bytes verkürzt, sondern die RGB-Werte aus Deinem "getippten Text" wieder in Zahlen umwandeln möchtest. Standardfunktion zur Umwandlung von Text in Zahlen der AVR libc wäre 'atoi' (steht für "Array to Integer"):
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga3a1fe00c1327bbabc76688a7a1d73370