Forum: Mikrocontroller und Digitale Elektronik SoftwareSerial auf Attiny45


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Chrisl (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Chrisl,

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

Lg Sven

: Bearbeitet durch User
von Chrisl (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


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

von Chrisl (Gast)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.