Wie wird der Clock generiert? Selten liegen die internen soweit daneben das eine Korrektur mit oscal nötig wird. Sende mal mehrere "UUUUU" mit 2 Stopbits was empfängs Du dann? Der Anschluß ist korrect? Versteht der Avr den PC? Was hört er aus den Us?
SSD1306 OLED Display
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
-
-
17b schrieb:
Die Baudrate hab ich überall auf gleichen Wert geändert und 1000x überprüft.
Ist die nicht unabhängig vom Takt? Hab ich da was falsch verstanden?
Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen. -
Hab ich gemacht.
Bei 9600 Baud habe ich mit einem crystal Wert von 1843200 eine Fehlerrate lt. Tool von 0%. Chip ist ein 168, benutzte Pins für RX und TX sind PD0 und PD1.
Im Terminal Emulator sind 9600N81 eingestellt, dennoch kommt Müll raus.
Mein Testcode:
-
Du sollst natürlich für $crystal nicht irgendeinen Wert einstellen sondern den mit dem Dein Controller läuft, also entweder die Frequenz des angeschlossenen Quarzes oder dem Takt des intern aktivierten Oszillators einschl. seines Vorteilers.
Vielleicht solltes Du dich erstmal mit den Grundlagen von Mikrocontrollern (AVR) und der Programmiersprache BASCOM vertraut machen. Ich denke da herrscht bei Dir noch überhaupt keine Klarheit. In deinen posts lese ich immer "... habe ich kopiert...", aber kopieren kann meinen z.Bsp. einen Speiseplan aber Programme sollte man schon verstehen wollen.Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen. -
-
hasta schrieb:
Programme sollte man schon verstehen
-
-
Cool.
Wie hast Du es initialisiert? Meins scheint nur 32 Zeilen zu haben -
Ich würde lügen wenn ich sagen würde, das ich das selbst hinbekommen hab. Alles nur zusammenkopiert...
Hier ist mein Programm soweit wie ich jetzt bin:
An 3 18B20 Sensoren wird die Temperatur abgefragt und angezeigt. Zusätzlich wird eine Spannung abgefragt und passend dazu eine 2812 in verschiedenen Farben und Blinkmustern angesteuert. Der Auswerteteil ist noch nicht fertig.
Das Ganze wird in eins meiner Modell U-Boote eingebaut um Spannungen und Temperaturen zu überwachen. Was noch fehlt wäre eine Funkübertragung, aber da muss ich noch Code zum abkupfern finden, haha.
Hast du ein anderes Display zum Vergleich? Hab Freitag eins mit 1.30" bekommen, das scheint kaputt zu sein und geht wieder zurück. Vielleicht hat deins ja auch ne Macke wenn nur jede zweite Zeile funktioniert
Quellcode
- $Regfile = "m168def.dat"
- $Crystal = 8000000
- $hwstack = 40
- $swstack = 16
- $framesize = 32
- '******************* rainbow lib einstellungen ************************
- $Lib "Rainbow.lib"
- $external WS2812b
- Declare Sub Select_Rainbow(byval Channel As Byte)
- Declare Sub SetColor(byval LedNr As Word , Color() as Byte)
- Declare Sub Send()
- const Rainbow0_Len = 1'just 1 Led
- Const Rainbow0_Port = PORTb
- Const Rainbow0_Pin = PB0
- '******************* ad wandler ************************
- Config Adc = Single , Prescaler = Auto , Reference = Avcc
- Start Adc
- declare sub spannung_lesen
- '******************* i2c bus ************************
- Config Scl = Portc.5 'Konfigurieren von I2C
- Config Sda = Portc.4
- Config Twi = 400000 ' i2c speed
- '******************* oled ************************
- Declare Sub Oled_init
- I2cinit
- $lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
- $lib "glcdSSD1306-I2C.lib" ' override the default lib with this special one
- #if _build < 20784
- Dim ___lcdrow As Byte , ___lcdcol As Byte ' dim these for older compiler versions
- #endif
- Config Graphlcd = Custom , Cols = 128 , Rows = 32 , Lcdname = "SH1106"
- 'Config Graphlcd = Custom , Cols = 128 , Rows = 32 , Lcdname = "SSD1306"
- Cls
- Setfont font8x8TT
- call oled_init
- '******************* 1wire ************************
- Declare Sub Temp_messen_start
- Declare Sub Temp_lesen_start
- Config Single = Scientific , Digits = 1
- Dim Sc(9) As Byte
- Dim Temperatur(3) As Single
- '******************* lipoblitzer variablen ************************
- Dim Channel As Byte
- Dim Voltage As word
- Dim I As Byte
- Dim Color(3) as Byte
- Dim warten as word
- Dim blitz as word
- Dim ta as integer
- Dim hu as integer
- Dim ze as integer
- Dim ei as integer
- R alias Color(_base) : G alias Color(_base+1) : B alias Color(_base+2)
- warten = 100
- blitz = 30
- Call Select_Rainbow(0)'select Rainbow
- '******************* main ************************
- 'Showpic 0 , 0 , wallp
- 'wait 5
- 'cls
- Lcdat 1 , 1 , "- 22er Sensoren -"
- Do
- Call Temp_messen_start
- Call Temp_lesen_start
- call spannung_lesen
- Lcdat 2 , 1 , "Temp. Motor= ";Temperatur(1);"'C"
- Lcdat 3 , 1 , "Temp. Regler= ";Temperatur(2);"'C"
- Lcdat 4 , 1 , "Temp. frei= ";Temperatur(3);"'C"
- print Temperatur(1);Temperatur(2);Temperatur(3)
- Loop
- End
- '******************* spannung lesen ************************
- sub spannung_lesen
- Channel = 3 'read potentiometer
- voltage = Getadc(channel) '10 bit
- 'ausgabe ws2812
- select case voltage
- case 800 to 1024: gosub eins
- case 600 to 799: gosub zwei
- case 400 to 599: gosub drei
- case 200 to 399: gosub vier
- case 0 to 199: gosub fuenf
- end select
- 'konvertierung in einzelwerte
- ei = voltage mod 10
- voltage = voltage /10
- ze = voltage mod 10
- voltage = voltage /10
- hu = voltage mod 10
- voltage = voltage /10
- ta = voltage mod 10
- Lcdat 6 , 1 , "Akku=";ta;hu;ze;ei;"V"
- end sub
- '******************* temperatur messen und lesen ************************
- Sub Temp_messen_start
- Config 1wire = PortD.2
- 1wreset
- 1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen
- 1wwrite &H44 ' Messen
- Config 1wire = PortD.3
- 1wreset
- 1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen
- 1wwrite &H44 ' Messen
- Config 1wire = PortD.4
- 1wreset
- 1wwrite &HCC ' Überspringe Rombefehl Seriennummer weglassen
- 1wwrite &H44 ' Messen
- End Sub
- Sub Temp_lesen_start
- Waitms 800
- Local Dummy As Integer
- Config 1wire = PortD.2
- 1wreset
- 1wwrite &HCC
- 1wwrite &HBE ' Start Daten lesen
- Sc(1) = 1wread(9) ' Gelesene Daten ins Array
- Dummy = Makeint(sc(1) , Sc(2))
- Temperatur(1) = Dummy * 0.0625
- Config 1wire = PortD.3
- 1wreset
- 1wwrite &HCC
- 1wwrite &HBE ' Start Daten lesen
- Sc(1) = 1wread(9) ' Gelesene Daten ins Array
- Dummy = Makeint(sc(1) , Sc(2))
- Temperatur(2) = Dummy * 0.0625
- Config 1wire = PortD.4
- 1wreset
- 1wwrite &HCC
- 1wwrite &HBE ' Start Daten lesen
- Sc(1) = 1wread(9) ' Gelesene Daten ins Array
- Dummy = Makeint(sc(1) , Sc(2))
- Temperatur(3) = Dummy * 0.0625
- End Sub
- '******************* Unterprogramme lipoblitz ************************
- eins:
- R = 255 :g= 255: b=255 'weiss
- Call SetColor(0 , color())
- Call Send()
- waitms blitz
- R = 0 :g= 0: b=0
- Call SetColor(0 , color())
- Call Send()
- return
- zwei:
- For I = 1 To 2
- g = 255 'gruen
- Call SetColor(0 , color())
- Call Send()
- waitms blitz
- g = 0
- Call SetColor(0 , color())
- Call Send()
- Waitms warten
- Next I
- return
- drei:
- For I = 1 To 3
- R = 255 :g=255 'gelb
- Call SetColor(0 , color())
- Call Send()
- waitms blitz
- R = 0 :g=0
- Call SetColor(0 , color())
- Call Send()
- Waitms warten
- Next I
- return
- vier:
- For I = 1 To 4
- R = 255 :g=110 'orange
- Call SetColor(0 , color())
- Call Send()
- waitms blitz
- R = 0 :g=0
- Call SetColor(0 , color())
- Call Send()
- Waitms warten
- Next I
- return
- fuenf:
- For I = 1 To 5
- R = 255
- Call SetColor(0 , color())
- Call Send()
- waitms blitz
- R = 0
- Call SetColor(0 , color())
- Call Send()
- Waitms warten
- Next I
- return
- 'OLED initialisation ***********************************************************
- Sub Oled_init
- I2cstart
- I2cwbyte &H78
- I2cwbyte &HAE 'DISPLAYOFF
- I2cwbyte &HD5 'SETDISPLAYCLOCKDIV
- I2cwbyte &H80 'ratio 0x80
- I2cwbyte &H00 'SETMULTIPLEX
- I2cwbyte &H3F ' 1f 128x32
- I2cwbyte &HD3 'SETDISPLAYOFFSET
- I2cwbyte &H00
- I2cwbyte &H40 'SETSTARTLINE
- I2cwbyte &H8D 'CHARGEPUMP
- I2cwbyte &H14 'vccstate 14
- I2cwbyte &H20 'MEMORYMODE
- I2cwbyte &H00 '
- I2cwbyte &HA1 'A0 upside down SEGREMAP
- I2cwbyte &HC8 'COMSCANDEC
- I2cwbyte &HDA 'SETCOMPINS
- I2cwbyte &H12 ' 02 128x32 12
- I2cwbyte &H81 'SETCONTRAST
- I2cwbyte &HD9 'SETPRECHARGE
- I2cwbyte &HF1 'vccstate f1
- I2cwbyte &HDB 'SETVCOMDETECT
- I2cwbyte &H40
- I2cwbyte &HA4 'DISPLAYALLON_RESUME
- I2cwbyte &HA6 'NORMALDISPLAY
- I2cwbyte &HAF
- I2cstop
- End Sub
- $include "font8x8TT.font"
- 'wallp:
- ' $bgf "22er.bgf" ' include the picture data
-
17b schrieb:
Vielleicht hat deins ja auch ne Macke wenn nur jede zweite Zeile funktioniert
Diese Routine hatte ich auch versucht. Es reagiert richtig auf alle Befehle vermutlich haben die tatsächlich ein 32x128 Display angebaut. Die neuen sind bestellt. Das vorhandene wird nun im Zoom Mode betrieben (heller bzw weniger Strom) Bei ihm reicht das einschalten alleine nach dem Reset:
Quellcode
PS Durch die fehlenden I2cwbyte $80 werden bei Deiner Routine nicht alle Befehle ausgeführt. Aber das im Normalfall nicht auf. Erst wenn einige Parameter geändert werden sollen. Aber die lassen sich alle auch alleine Ändern ohne das gesamte Init.
PPS In den Code ist das Init unnötig da die lib schon eins integriert. Es schaltet jedoch den Kontrast auf vollgas (FF) - Bei Deinem fehlt der Wert so das evt D9 gesetzt wird. Und sie hat vermutlich einen Tippfehler:
D8 ist kein bekannter Befehl (DB ist SETVCOMDETECT lt Datenblatt)Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()
-
-
Ja das bezog sich auf die init der lib . DB - 40 ist auch vollgas und außerhalb der Datenblatt werte , 20 wäre normal.30 Maximal .Es ändert minimal die Helligkeit
-
Die neuen sind angekommen und haben die volle Auflösung
IMG_20200602_184909.gif
Vcc und Gnd andersrum als bei dem Alten
Und unterschiedliche Default Werte. Das 1.3" steht "auf dem Kopf" und CLS löscht nur eine Zeile. Es benötigt ein anderes INIT aber immerhin hat es auch die volle Zeilenanzahl -
17b schrieb:
Gibt es Befehle um Zeichen zu invertieren oder Zeilen zu scrollen.
Die Pages sind 8 Zeilen große Bereiche beginnend Oben. Somit kann auch nur ein Teil des Displays gescrollt werden.
Eingeleitet wird das Scrollen dann mit $2F und abgeschaltet mit $2E(i2cwrite Adresse,$80,$2E/F)
Während des Scrollens können die Parameter geändert werden, er übernimmt es sofort.
Beim 1106 funktioniert das diagonal Scroll (noch?) nicht. Das gesamte Display kann jedoch vertikal "zu Fuß" gescrollt werden. Der Befehl $D3 gefolgt von Offset/Startzeile (0-63) bestimmt welcher Adressbereich oben beginnt.
Würde nun (gleichmäßig) D3,0..D3,1.....D3,63..D3,0 zu Display gesendet scrollt es nach unten. Das gleiche(?) wird erreicht indem direkt die Startzeile geändert wird mit $40,41,42,...$7f,$40
PS Der 1306 "humpelte" auch beim Scrollen vielleicht funktionierts bei ihm auch so. -
-
-
17b schrieb:
Absolut keine Reaktion
17b schrieb:
nur noch jede zweite Zeile
-
-
Heute ist Nachschub gekommen. Funktionierte mit meinem Programm aus Beitrag 89 aber auch nicht. Auch die beiden I2C Adressen aus meinem Link aus Beitrag 98 brachten nix. Da ich mit dem Terminal auf Kriegsfuss stehe und nie sinnvolle Ausgaben bekomme, konnte ich die I2C Adressen mit dem I2C Suchprogramm nicht testen und für einen Aufbau mit nem LCD Display war ich zu faul.
Was aber sofort funktionierte ist das Demoprogramm aus Beitrag 5 von RoBue.
Das Ganze funktioniert mit diesen Displays. Für den Fall, dass der Link irgendwann nicht mehr geht, es sind die 4poligen 1.3" Displays mit der Bezeichnung "1,3 Zoll Arduino OLED 128x64 Display SH1106 I2C IIC TWI weiß Raspberry Pi". -
17b schrieb:
und für einen Aufbau mit nem LCD Display war ich zu faul.
Lcds benötigen viel Zeit und sind daher oft nicht günstig um Zeitkritische Dinge zu verfolgen. Dann kann man ihnen auch nichts mitteilen. Durch die Modifikationen an dem Init hatte ich das Glück das meine neuen mit der 1306 Lib sofort was zeigten. Auch scheint es so zu sein das sie ohne Init nur mit dem Befehl "Einschalten" loslegen.
Sollten wir das Terminal zum laufen bringen? Welcher Clock hat der Chip und weiche Baudrate ist gewünscht?