Forum: Mikrocontroller und Digitale Elektronik SoftwareSerial auf Attiny45


von Chrisl (Gast)


Lesenswert?

Hi,
ich arbeite gerade mit einem Attiny45 (8MHz intern) und möchte zum 
Debuggen (konkret auslesen von der Pulslängen von einem IR-Receiver) 
gerne über einen Arduino Nano eine serielle Kommunikation (UART) mit 
meinem PC herstellen. Dazu verwende ich die SoftwareSerial library der 
Arduino Umgebung. Ich war mir nicht sicher, ob und wie ich die 
UART-Schnittstelle des Arduinos direkt an den Tiny anschließen kann. 
Deshalb habe ich auf dem Nano das SoftwareSerial Beispiel aufgespielt 
und nur die Baudraten auf einheitlich 9600 angepasst. Somit leitet der 
Arduino alle auf der SoftwareSerial empfangenen Zeichen einfach an die 
Hardware Serial weiter. Das funktioniert auch (mit anderem Nano mit 
selbem Sketch ausprobiert). Bei der Verbindung mit dem ATTiny empfange 
ich aber nur ungültige Zeichen. Auch bei kleineren Baudraten klappt es 
nicht.

Da der Code ja sehr kurz und einfach ist, stellen sich folgende Fragen:
Gibt es spezielle Fallstricke bei dem ATTiny45 in Sachen SoftwareSerial?
Oder ist die interne 8MHz Clock nicht genau genug dafür?

Danke schonmal für die Hilfe!

Hier noch mein Code:

Attiny Code:
1
#include <SoftwareSerial.h>
2
3
SoftwareSerial mySerial(1, 3); // RX, TX
4
5
void setup() {
6
  mySerial.begin(9600);
7
  mySerial.println("Hallo");
8
}
9
10
void loop() {
11
12
}

Arduino Nano Code:
1
#include <SoftwareSerial.h>
2
3
SoftwareSerial mySerial(10, 11); // RX, TX
4
5
void setup() {
6
  // Open serial communications and wait for port to open:
7
  Serial.begin(9600);
8
  while (!Serial) {
9
    ; // wait for serial port to connect. Needed for native USB port only
10
  }
11
12
13
  Serial.println("Goodnight moon!");
14
15
  // set the data rate for the SoftwareSerial port
16
  mySerial.begin(9600);
17
  
18
  //mySerial.println("Hello, world?");
19
}
20
21
void loop() { // run over and over
22
  if (mySerial.available()) {
23
    Serial.write(mySerial.read());
24
  }
25
  if (Serial.available()) {
26
    mySerial.write(Serial.read());
27
  }
28
}

von Sven K. (svenk)


Lesenswert?

Hallo Chrisl,

Ist CKDIV8 (Fuse Einstellung) noch aktiv? Dann läuft der Tiny mit 1Mhz.

Lg Sven

: Bearbeitet durch User
von Chrisl (Gast)


Lesenswert?

Da ich die Arduino Entwicklungsumgebung nutze, kann ich da nicht direkt 
nachprüfen. Da muss ich erstmal googlen, wie ich das genau mache (setze 
mich gleich mal dran).
Ich habe (schon vor über einem halbem Jahr) einen ArduinoISP Sketch im 
Internet gefunden, der Fuses schreiben kann und den Tiny mit einem 
eigenen Takt ansteuert (mein ATTiny war bei der Lieferung für einen 
externen Oszillator gefused) (das mit der Taktausgabe macht der 
Standardsketch wohl nicht). Dann gebe ich in der Entwicklungsumgebung 
die 8MHz (internal) an und schreibe das Ganze auf den Tiny. Leider kann 
ich mich nicht mehr, woher ich diesen Sketch habe. In der Datei liegt 
ein Link, der leider tot ist.

von Chrisl (Gast)


Lesenswert?

So, habe jetzt nachgeguckt:
mit dem Befehl

avrdude -P /dev/ttyUSB0 -b 19200 -c avrisp -p ATtiny45 -v

habe ich für das Fuse Low Byte den Wert 0x62 = 0b01100010
das höchstwertige (also ganz linke) Bit ist CKDIV8 und ist nicht 
aktiviert

Die Clock Source ist übrigens auch richtig gesetzt (auf den kalibrierten 
internen 8MHz RC Oszillator).

von Sven K. (svenk)


Lesenswert?

Nein, wenn das Bit 0 ist ist die Teilung aktiv. Du musst das 8 Bit auf 1 
setzen.

also 0b1xxxxxxx

Lg Sven

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Man muss die Fuse nicht ändern.
Den Vorteiler kann man auch im Programm einstellen.

von Chrisl (Gast)


Lesenswert?

Ok, dass eine Fuse aktiv ist, wenn 0 drin steht, wusste ich entweder 
nicht oder habe es total vergessen.

Das war tatsächlich die Lösung! ATTiny mit Arduino IDE halt nicht ganz 
so plug&play :D

Ich habe die Fuse jetzt mit avrdude auf 1 gesetzt.

Wie kann ich den Vorteiler denn im Programmcode setzen? (aus Interesse, 
falls sowas nochmal auftaucht)

von Einer K. (Gast)


Lesenswert?

Chrisl schrieb:
> Das war tatsächlich die Lösung! ATTiny mit Arduino IDE halt nicht ganz
> so plug&play :D
1. ISP Adapter zwischen Tiny und PC
2. In der Arduino IDE die Taktfrequenz einstellen (im Board Menü).
3. "Bootloader brennen" drücken, dann schreibt die IDE die Fuses.

Das sollte so gelingen, wenn der Ersteller der Boarddefinition keinen 
Mist gebaut hat.

--------------------

6.5.2 CLKPR – Clock Prescale Register
http://www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.