Probleme mit Attiny85 und SoftwareSerial

Hallo zusammen,

ich habe mit folgendem Code folgendes Problem:

Ich gebe am Attiny85 eine Integerzahl an einem Port aus. Diese Zahl möchte ich dann mit dem Arduino wieder einlesen und über den Serial-Monitor ausgeben. Leider bekomme ich nicht die Zahl wieder, die ich gesendet habe.

Dieser Code läuft auf einem Attiny85:

#include <SoftwareSerial.h>

SoftwareSerial sendTest(1,4);
int data = 123;


void setup()
{
  sendTest.begin(38400); 
}


void loop()
{
  sendTest.write(data);  
}

Dieser Code läuft auf dem Arduino Uno:

#include <SoftwareSerial.h>

SoftwareSerial test(2,3);
int data = 0;


void setup() 
{
  Serial.begin(115200); 
  test.begin(38400);  
}


void loop() 
{
  
  if (test.available())
  {
   data = test.read();
  }
  Serial.println(data);
}

Ausgabe über Serial-Monitor:

0
128
128
192
0
0
128
128
192
0
128
128
192
0

An was kann das liegen / was mache ich falsch?

Dany262:
An was kann das liegen / was mache ich falsch?

Ich finde, Du bist ganz schön optimistisch wegen der erzielbaren Baudrate mit SoftwareSerial!

Ist der Systemtakt an beiden Mikrocontrollern mit einem Schwingquarz derselben Frequenz stabilisiert? Oder schwingt einer (oder gar beide) Mikrocontroller womöglich nur mit “Resonatoren” zur Takterzeugung (z.B. alle Arduino-Boards im “R3” Design)? Ich würde zum Testen mal mit einer niedrigeren SoftwareSerial-Baudrate testen.

Außerdem würde ich mal das HighByte und das LowByte getrennt versenden und mit einer Pause zwischen zwei Aussendungen, also eher mal senden mit:

#include <SoftwareSerial.h>

SoftwareSerial sendTest(1,4);
int data = 123;


void setup()
{
  sendTest.begin(9600); 
}


void loop()
{
//  sendTest.write(data);  
  sendTest.write(highByte(data));
  sendTest.write(lowByte(data));
  delay(1000);
}

Und beim Empfangen dann die Baudrate auch entsprechend niedriger.

Danke für deine Hilfe. Hat aber leider nichts gebracht.

Das komische ist, dass mein Code auf dem Arduino perfekt funktioniert (mit SoftwareSerial mit 38400baud). Doch wenn ich den Code auf nen Attiny85 lade, gehts nicht mehr. Also nur das SoftwareSerial Zeug. Der Rest geht.
Oder soll ich vielleicht mal NewSoftSerial probieren?

Dany262:
Danke für deine Hilfe. Hat aber leider nichts gebracht.

Wie “nichts gebracht”?

Die Codeänderung war ja nicht nur dazu da, die Baudrate herunterzusetzen, sondern auch, um eine Pause von exakt einer Sekunde zwischen zwei Aussendungen einzufügen.

An der Einhaltung dieses Sekundenabstands kannst Du z.B. erkennen, ob das Timing beim Sender überhaupt richtig läuft. Also ob z.B. der Attiny mit der beabsichtigten Taktfrequenz läuft oder nicht.

Was empfängst Du denn jetzt? Es sollten immer im Wechsel kommen

  • zwei Bytes
  • eine Sekunde Sendepause

Wenn nicht mal das stimmt, dann ist da irgendwas an Deinem Serial.Sender total verwarzt!

Du hast hoffentlich auch GND vom Sender (Attiny) mit GND vom Empfänger (Arduino) verbunden und nicht nur die Datenleitungen untereinander, falls die beiden Boards von unterschiedlichen Quellen mit Strom versorgt werden?

Hallo,

mit welcher Frequenz arbeite der Tiny? Hast du die Fuses auch entsprechend gesetzt?

Bernd

Oh nein. Hab ich nicht. kannst du mir erklären wie das geht bzw. für was das gut ist? kenne mich da nicht soo gut aus!

Dany262:
Oh nein. Hab ich nicht. kannst du mir erklären wie das geht

Du verkabelst Deine beiden Microcontroller mit einer dreipoligen seriellen Leitung:

GND am Attiny ==> GND am Arduino
TX am Attiny ==> RX am Arduino
RX am Attiny ==> TX am Arduino

Dany262:
für was das gut ist? kenne mich da nicht soo gut aus!

Die Verbindung von GND zu GND sorgt dafür, dass die Übertragungen auf den RX/TX Leitungen bei beiden Mikrocontrollern dasselbe Bezugspotential haben.