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:
}
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?
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.
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.
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 ?