PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC16F887 - I2C - LCD Version gestorben neue per LEDs



zerb
15.07.2010, 17:43
Hallo liebe Forumgemeinde ich habe folgendes Problem.

Ich möchte mein LCD anhand einer einfachen LCD Initialisierung testen,
nur leider reagiert dieses nicht und da für mich der Bereich LCD Neuland
ist wäre ich für etwas Hilfe sehr dankbar!


Zur Hardware:
Es handelt sich um ein Großdisplay von Toshiba mit dem KS0066U
Controller und wird mit negativer Kontrastspannung über eine
Ladungspumpe gespeist. Somit wird mir die 1. und 3. Zeile mit Kästchen
angezeigt und die Kontrasteinstellung funktioniert.

Die Datenpins sind an PORTB des PICs angeschlossen, PORTE dient als
Anschluss für E, R/W und RS.
Als Taktquelle verwende ich einen externen 16MHz Quarz.

Programmiert wird dies alles über die ICSP Schnittstelle, MPLAB und dem
PICKit 2.


Zur Software:
Ich selbst sehe leider keinen Fehler oder wo sich der PIC verrennen
könnte. Evtl. seht ihr ja mehr da ich solangsam nichtmehr weiter weiß.

Im Anhang ist mein Code als .asm Datei.

Schonmal vielen Dank an euch!

Gruss Pascal

PICture
15.07.2010, 18:09
Hallo!

Um dein Display zu prüfen, würde ich das Testprogramm von Wiki auf dein PIC umschreiben und für 4 Zeilen erweitern. Das alles ist in https://www.roboternetz.de/wissen/index.php/PIC_Assembler erklärt.

Solltest du konkrete Probleme haben, beantworte ich sehr gerne deine gezielte Fragen, habe aber leider keine Zeit (sprich: Lust) jedes Zeichen deines Programms zu prüfen.

MfG

zerb
15.07.2010, 18:15
Hi PICture,

schonmal vielen lieben Dank für den Tipp! Nachdem ich Google schon seit einigen Tagen quälen, habe ich diese Instruktion anscheinen übersehen!

Werde dies später nach dem Training ausprobieren und dann testen!

Gruss!

PICture
15.07.2010, 20:12
Das gefällt mir sehr. Ich bin der Meinung, dass wenn jemand in eigenem Programm keine Fehler finden kann, ist das nicht seiner ... :)

Mein Ehrfahrungstipp: Jedes sogar kompliziertesten Programm in möglichst kleinen Schritten aus ausprobierten Fragmenten zusammensetzen...

In deinem Fall würde ich z.B. mit Initialisierengs des Displays anfangen und erst wenn alle 4 Zeilen gleich werden, versuche ich ein Zeichen schicken und prüfen ob er dort ist wo ich will, usw.... :)

Übrigens, ich habe bisher nichts auf einmal geschafft und mit allem auch mal angefangen.

Viel Spass und Erfolg!

MfG

zerb
16.07.2010, 09:33
Hallo,

habe jetzt mal drastisch den Code verkürzt und Fehler in der Portinit rausgekillt.

Im Anhang der neue Code

Gruss Pascal

PICture
16.07.2010, 14:54
Hallo!

Das ist für mich viel durchsichtlicher und wenn es angeblich funktioniert, weil du über keine Probleme mehr schreibst, dann freue ich mich, so wie du ... :)

Weiter so, dann bist du immer Erfolgreich, mann muss an sich glauben, dann geht alles ... :)

MfG

zerb
16.07.2010, 15:54
Hi,

ups dann habe ich anscheined die "Problematik" vergessen :].

Jetzt müsste ich ja praktisch Daten an das Display senden ? Das es mir wenigstens irgendetwas mal anzeigt ? Wie muss ich da nun weiter vorgehen.

Denn so wie der Code in der test3.asm beschrieben geht es leider nocht nicht.

Ich bin schon so verzweifelt das ich am überlegen bin mir einfach eine Zusatzplatine mit 8 LEDs zu basteln und den späteren Sensorabstand dann hier einfach anzeige. Hätte nicht gedacht dass das LC-Display so kompliziert ist :/

Gruss

PICture
16.07.2010, 16:28
Es gibt ein Unterschied, ob man das Display mit allen zur Verfugung stehenden Optionen, oder so wie ich bisher einfach, nur Zeichen an bestimmte Stelle schreiben möchte.

Ich habe bisher immer die einfachste für mich Version gewählt und kein "Disolay löschen", "Cursor home", usw. benutzt, weil es für mich nur Code- und Zeitfressende und unnötige "Spielerei" ist.

Um ein Zeichen an Bestimmte Adresse zu schicken, muss sie durch bestimmten Befehl aus dem Befehlsatz des Displaycontrollers zuerst geschickt werden und nachfolgend das gewünschtes Zeichen. Die Adresse bei mehreren Zeichen wird automatisch hochgezählt, wenn das Display so initialisiert ist. Deswegen braucht man nur die Anfangsadresse der gewünschter Zeile senden und weiter gewünschte Anzahl für diese Zeile vorgesehenen Zeichen.

Nicht verzweifeln, sondern mit Spass damit spielen, ist am effizientesten beim Lernen ... ! :)

Viel Spass dabei !

MfG

zerb
16.07.2010, 18:15
Danke schonmal PICture,

achso, wusste nich das diese "Spielerei" auch eine ist, dachte dies müsste man machen. Puh ich glaube da muss ich mich dann mal intensiv in die LCD Welt einarbeiten :)

Aber nun das kleine Update:

Habe mir nun auf die schnelle eine LED Platine gebastelt. Also 8 LEDs belegen nun den PORTD, mit einer einfachen Ausgabe konnte ich diese auch ansprechen und diese leuchten auch ;).

Nun möchte ich eben diese Anzeige dafür nutzen das mir der Schaltabstand eines analogen Sensors der über einen MAX11600 an der I2C Schnittstelle hängt angezeigt wird.
LED1=1cm
LED2=2cm usw.

Habe die Kennlinie vom Sensor aufgenommen um somit die Ausgangsspannung für die verschiedenen Schaltabstände zu erreichen.

Nun aber meine Frage:
Ich habe ja eine Speicherzelle als RDATA festgelegt, wie kann ich nun diesen digitalen Wert, den ich ja nicht kenne anhand meiner Spannungen (Sensor) abfragen lassen ? Ich hatte da mal etwas wegen einem DDW (Digitals Daten Wort) gehört ?

Der Code steht soweit bis eben auf diese Abfrageschleife. Wäre für Hilfe wie immer dankbar :)

Gruss Pascal

zerb
16.07.2010, 20:35
Habe nun folgendes zwecks Spannung in DDW (8bit):

8-Bit Wandlung = 256
U Fullscale = 100 % Messspannung = 8cm = 4,5/5V
U Ausgangsspannung = Ausgangsspannung Sensor = 1-8cm = 0-5V

dann könnte ich doch dies so berechnen:

1).
U LSB = U Fullscale / 256 = 19,53 mV

2). Bsp. für 1cm = 455 mV
DDW = U Ausgangsspannung / U LSB = 23,29 => 23 => 17hex

Jetzt berechne ich eben all diese 8 Werte und füge die in eine
Abfrageschleife ein ?

Danke Gruß Pascal

zerb
16.07.2010, 23:12
So habe jetzt mal etwas herumgebastelt und möchte wissen ob die Abfrageschleife so funktioniert wie ich es mir vorgestellt habe und ob die Kommunikation zwischen I2C -> MAX -> PIC -> LEDs so geht ?

Zu der Abfrage
Also je höher die Spannung=Abstand desto mehr (+1 weitere LED) leuchtet dazu auf.

Im Anhang der Code, für jeden Tipp & Hilfe bin ich sehr dankbar!

zerb
18.07.2010, 11:40
Verzweiflung pur!

Keine Ahnung was ich falsch mache, aber jetzt wird mir selbst "Init" als "illegal" deklariert -.-*.
Wäre echt super wenn sich jemand bissle Zeit nehmen könnte und mir helfen!

Gruss Pascal

PICture
18.07.2010, 13:07
Hallo!

Als Voraussetzung für Erstellung ASM Programmen ist fast perfektes Kennen non MPASM, sonst verliert man nur Zeit für unnötige Suche von Fehler die vermieden werden könnten.

Jeder Quellcode wegen Assemblerprogram z.B. MPASM muss sich nach sehr strengen Regeln halten und kann nicht beliebig strukturiert werden.

Im Wiki befindet sich ein Muster der angehalten werden muss, weil andere Struktur vom MPASM nicht akzeptiert wird. Bei jedem Quelcode ist jedes Zeichen und seine Positin wichtig. Z.b. in der Zeile:

#include <p16f887.inc> ; .inc Datei des PIC16F887

ist das Zeichen "#" nicht zulässig, weil sie nur fur "#define" Anweisungen reserviert ist.

Als nächster Fehler in deinem Quelcode finde ich im Unterprogram "Init" diese Zeile,

RDATA EQU H'20' ; Speicherzelle für I2C Daten

die als Definition vom Register an Anfang der Listing gehört. Weiter habe ich nicht gesucht. Wer Programme schreiben möchte muss sich leider an alle Regel des MPASM halten, damit sein Programm vom MPASM überhaupt in ".hex" Datei übersetzt werden könnte.

MfG

zerb
18.07.2010, 13:25
Hallo,

also das dies nicht geht wundert mich nun sehr:
#include <p16f887.inc> ; .inc Datei des PIC16F887

Habe meine bisherigen Programme immer auf diese Weise geschreiben und er hatte deshalbt nie herumgemeckert oder die .inc Datei nicht erkannt.


Und das mit RDATA habe ich mal in die Init reingestellt, da ich schonmal probleme mit solchen Anweisungen hatte wenn ich diese direkt im Listing erwähne. Es war dann so.

Im Listing: nicht erkannt
In der Init: erkannt

Ist jedenfalls grad alles sehr seltsam. Dennoch schonmal Danke!
Gruss

PICture
18.07.2010, 13:39
Ich habe noch nie Probleme mit Assemblerprogrammen, obwohl ich schon früher verschiedene Prozessoren und µC's programmiert habe. Jedes Assemblerprogram ist eben wie ein Befehlsatz für die CPU.

Was für dich sehr seltsam ist, ist für mich einfach normal ... :)

MfG

RoboHolIC
10.10.2011, 22:41
Hallo zerb.

Leider sitze ich grad am "falschen" PC, auf dem kein MPLAB installiert ist. Darum kann ich nur ein paar intuitive Dinge von mir geben.
1) Wenn's Probleme mit der Syntax gibt, lohnt sich bestimmt der Griff zur Hilfefunktion: Suche nach den Begriffen 'init' und 'rdata'; vielleicht sind das reservierte Wörter des Assemblers oder des Präprozessors für die Objektcodeerzeugung. Ich selber arbeite bis dato auch nur auf der einfachsten Ebene (genau wie du: keine Code/Daten/sonstige Segmente, nur eine .ASM-Datei), aber "RDATA" riecht nach Speicherreservierung, Datensegment oder sowas.
2) Ich bin beim Wechsel von Win2k nach Linux etwas auf die Nase gefallen, weil die in der zweiten Nachkommastelle erhöhte Präprozessorversion einige Unsauberkeiten meiner "freien Syntaxauslegung" nicht mehr schlucken wollte: das waren Berechnungen mit Adresslabels, die Klammern bei den Includedateien und vielleicht auch noch irgendwas mit dem Hash #. Sieh also bei den fraglichen Stellen nochmal genau in der Dokumentation nach, falls du einen Releasewechsel, z.B. durch Neuinstallation von MPLAB, mitgemacht haben könntest.

Dann sind mir noch ein paar potentielle Fehlerquellen aufgefallen:
- gemischte Verwendung von BANKSEL und expliziter STATUS-Bit RP0-Manipulation
- Default-Destination z.B. bei xorwf
- der größer/kleiner-Vergleich in der Kaskade sollte m.E. mit Subtraktion und dem Carry-Bit gemacht werden statt mit Zero. Vll. hab ich deinen Sourcecode aber noch nicht richtig verstanden.

Gruß
Christian.