SoftwareSerial mit attiny85

Hallo zusammen,

für ein Projekt möchte ich ein CMOS/UART Display 16x2 Zeichen verwenden, welches über SoftwareSerial angesprochen werden soll.
Da ich das noch nie in der Hand hatte, habe ich erstmal mit dem Arduino UNO und HW-Serial angefangen. Dieses minimale Testprogramm funktioiniert. Soweit so gut.

Das gleiche Testprogramm auf SoftwareSerial angepasst, txPIN 3 definiert und erneut getestet.
Funktioniert ebenfalls. Super! Wie gesagt alles mit dem Arduino UNO.

Bei dem eigentlichen Projekt kommt aber ein attiny85 zum Einsatz. Also das Testprogramm auf den attiny85 geschrieben, nix...

Es ist mir ehrlich gesagt ein Rätzel warum das auf dem MC nicht funktioniert.
RX ist über einen 220 Ohm Widerstand am TX (PB0) vom MC angeschlossen.
Hat jemand von euch noch eine Idee, was das Problem sein könnte? Habe ich in den definitionen etwas vergessen? Bin jetzt mehr als einen Tag am suchen. Langsam kommt Verzweiflung auf.

#include <SoftwareSerial.h>

#define txPin 1
SoftwareSerial LCD = SoftwareSerial(0, txPin); 

const int LCDdelay=1000;  // delay time für LCD output 


void setup()
{
  
 pinMode (txPin, OUTPUT);
  
 LCD.begin(9600);
 delay(LCDdelay);
 clearLCD(); 
 setBacklight(100);

 clearLCD();
 print_string(0,0,"16*2 lcd");
 print_string(1,0,"Hello World");
 delay(LCDdelay);
 
}
                                            
void Reset()
{
 LCD.write(0xAA);        //command flag
 LCD.write(0x01);        //reset command.
}

void clearLCD()
{
 LCD.write(0xAA);        //command flag
 LCD.write(0x10);        //clear command.
} 

void print_string(unsigned char r,unsigned c,char *ptr)
{
     LCD.write(0XAA);
     LCD.write(0X20);
     LCD.write(r);
     LCD.write(c);
     LCD.write(0XAA);
     LCD.write(0X25);
     while(*ptr!=0)
     {
         LCD.write(*ptr++);
     }
     LCD.write(0X0d);
}

void setBacklight(int i) 
{ 
 LCD.write(0xAA);        //command flag for backlight stuff
 LCD.write(0x13);        // Set Brightness 
 LCD.write(i);           //light level.
} 

void displayOn()
{
 LCD.write(0xAA);       //command flag
 LCD.write(0x11);       //display on
} 

void displayOff()
{
 LCD.write(0xAA);       //command flag
 LCD.write(0x12);       //display off
} 

void loop() {
  // put your main code here, to run repeatedly:
 
 
 
}

VG
Matze

Mit welcher Taktfrequenz hast du den ATtiny85 geflasht ?
SoftwareSerial läuft nicht mit 1MHz Takt.

8 MHz intern

ich würde da mal einen USB-TTL Wander anschließen und am PC anschauen, was da wirklich bei 9600 Baud rauskommt...
Aber schon mit einem vernünftigen Serial Program, z.B. Coolterm oder ähnlichem damit man das auch in HEX sieht.

und könntest das in der nächsten Version besser machen?

#define txPin 1
SoftwareSerial LCD = SoftwareSerial(0, txPin); 

warum 0 hardcoded???

Hast Du Dir das mal in einem Oszilloskop oder Logic Analyzer angeschaut? Generell gilt, dass SoftwareSerial nur mit relativ tolerantem (was das Timing angeht) Gegenüber funktioniert, da die genaue Baudrate bei weitem nicht eingehalten werden kann (ist auch beim HardwareSerial nicht immer genau, aber bei weitem genauer und dort findet eben ein adaptive Angleichung statt). Je kleiner die Taktfrequenz der MCU, desto grösser der Fehler. Bei interner Taktung kommt dann noch die Ungenauigkeit des Oszillators dazu.

      warum 0 hardcoded???

Nur ein kleiner Schönheitsfehler. Zum ansteuern des Displays brauchte ich den rxPin ja nicht.
Wird aber nachgebessert :grin:

      Hast Du Dir das mal in einem Oszilloskop oder Logic Analyzer angeschaut?

bisher nur mit einem kleinen TTL tester...
Was mich wundert, das es ja mit dem UNO und SoftwareSerial einwandfrei funktioniert hat.

Mit dem kleinen Tester habe ich jedenfalls nicht feststellen können, dass was am PIN ausgegeben wird.

Und du hast auch zuvor den "Bootloader" bzw. die fuses mit 8 Mhz geflasht ?

#define txPin 0
SoftwareSerial LCD(99, txPin);

An einem anderen Pin als 1 wird bei mir was ausgegeben.

Ich verwende keinen Bootloader. Brauche mir also um die Fuses keine Gedanken machen.

Ich habe jetzt mehrere verschiedene Pins ausprobiert. Nix...

Unfassbar

Der Weg in die Hölle ist mit falschen Annahmen gepflastert.

Du sagst es!

Mir ist gerade mein Gedankenfehler aufgefallen. Nun habe ich 16 MHz intern und den Bootloader gebrannt. :laughing:

ach ja....nur zur Erinnerung: der Bootloader ist beim ATtiny nur die fuses, kein tatsächlicher Bootloader. Heißt in der IDE der Einfachheit so.

Ja, schande über mein Haupt...

Und kaum macht man was richtig, geht's auch einen Schritt weiter
Ich bekomme jetzt eine Ausgabe auf's Display. Leider verstümmelt. Ist wohl alles um 5 Zeichen nach rechts verschoben.

Hierzu auch noch eine Idee?

Dazu müsstest du mal einen Link zum Display posten.

Ich hab hier auf die schnelle das PDF zum Display.

http://surenoo.tech/download/01_SLC/SLC1602F.pdf

Allerdings hat er das auf dem UNO auch nicht gemacht...

Man kann da schon ein Bootloader drauf laden über die IDE. Dann werden Bootloader geschrieben und Fuses gesetzt.

Wenn man kein Bootloader wählt, dann werden halt nur die Fuses gesetzt.

1 Like

hast du nun mal deine Ausgabe mit einem Terminalprogramm überprüft ob das rauskommt was du programmiert hast???

Ok, habe schon länger keinen ATtiny85 geflasht.
Ich kannte es nur so in der IDE: Bootloader = Fuses.
Danke für die Richtigstellung.
Welche core-Version ist das ?

Ich habe 1.5.2

sieht dann so aus:

Es gibt Optiboot und einen leeren Bootloader, der leere hat aber auch ein paar Byte Inhalt:

grafik

Der Menüpunkt "Werkzeuge/Bootloader brennen" könnte auch "Fuses setzen und ggf. Bootloader brennen" benannt sein.

Diese Variante gibt es bei mir nicht zur Auswahl und ist meines Wissens auch nicht im Datenblatt erwähnt. "16 MHz PLL" gibt es.

Danke @agmue,
die habe ich auch, allerdings auf einer älteren IDE-Version. Muss ich mal in die neue übertragen.
Und da ist 16 MHz (PLL) oder (extern).