Forum: Mikrocontroller und Digitale Elektronik PIC16F676 LCD_Init


von Johann R. (iwan)


Angehängte Dateien:

Lesenswert?

Hallo lieber Forum!
Ich bin ratlös und will nach einem Rat fragen.

Ich will einen LCD (2x16) initialisieren und benutzen, dafür habe ich 
Funktionen für PIC16F676 (CC5X-Compiler) erstellt. Diese Funktionen 
laufen auf PIC16F628 bei analoger Beschaltung perfekt (Unterschied: 
statt PORTC wird PORTB benutzt, sonst nichts anderes). PIC16F676 -> tut 
nichts, angefangen mit der Initialisierung von LCD. (LCD bleibt 
einzeilig, schmeißt irgendwann doch irgendwelche nicht definierte 
Zeichen raus...)

Habe schon für ..F676  zum testen Blinklichte programmiert um 
festzustellen ob Zeiten und Anschlussbelegung so stimmen, tun sie. 
µC-Einstellungen? Ausgänge stimmen aber, weil sie in der Lage sind LED's 
zum Leuchten zu bringen und auf 0V gehen sie auch.

Ich wüste nicht was ich übersehen habe.

könntet Ihr mir Bitte helfen? 3 meine kleine .c & .h Dateien hänge ich 
an.

von Jochen-paul S. (picfan)


Lesenswert?

Hallo,
mit dem cc5x-Compiler bin ich gar nicht vertraut, deshalb, ohne lange 
den Code  zu studieren schlage ich vor,
1.)Gut zu überprüfen, ob der Oszillator den genau gleichen Wert hat wie 
der Pic16f628.
Beim LCD müssen besonders beim Initialisieren die Zeiten ganz genau 
eingehalten werden....
2.)Falls das Busy-Flag abgefragt wird: Ich habe nirgends gesehen, dass 
das ANSEL-Register im Code erwähnt ist...
Gruss Picfan

von Johann R. (iwan)


Lesenswert?

Genau! ANSEL-Register.
Ich müsste in "HP_Test.c" in meiner Anwendung ANSEL = 0b.0000.0011 
setzen, damit RA2 digitale Funktion hat. Darauf wird nämlich Enable von 
LCD angeschlossen. Es hat aber nichts mit Busy-Flag zu tun. Busy ist bei 
mir D7 (PORTC.3, der von Natur digital ist)

Trotzdem danke für den Hinweis! Habe 9-10 Tage dran gesessen!

von Jochen-paul S. (picfan)


Lesenswert?

Johann R. schrieb:
> Busy ist bei mir D7 (PORTC.3, der von Natur digital ist)

Und ob RC3 analog ist!(RC3/ANA7) Im Datenblatt steht's schwarz auf 
weiss!
Gruss Picfan

von Johann R. (iwan)


Lesenswert?

Jochen-paul S. schrieb:
> Und ob RC3 analog ist!(RC3/ANA7) Im Datenblatt steht's schwarz auf
> weiss!

Ups! Sorry, stimmt!
Jedenfalls scheint es so zu sein, dass die Outputs, die von AN-Inputs 
nicht extra abgetrennt wurden, eine Kapazität mit reinbringen. Tiefpass! 
Diese verlangsamt die digitale Outputs, b.z.w. lassen bei kurzen 
Impulsen von LO auf HI die Spannung gar nicht auf HI-Pegel steigen. Das 
war das Problem bei mir. Getestet habe ich ja die Outputs ja bei sehr 
langen Impulsen - sichtbar lange LED-Impulse. -kein Oszilloskop benutzt!

Aber danke für den Hinweis nochmal!

von Thomas E. (picalic)


Lesenswert?

Johann R. schrieb:
> Diese verlangsamt die digitale Outputs, b.z.w. lassen bei kurzen
> Impulsen von LO auf HI die Spannung gar nicht auf HI-Pegel steigen.

Das glaube ich kaum! Ein anderer Effekt mit auf "analog" eingestellte 
Ausgänge dürfte wohl eher Probleme machen: die digital eingelesenen 
Daten von diesen Pins sind immer 0. Wenn nun ein anderer Ausgangs-Pin am 
gleichen Port verändert werden soll, führt der Controller intern eine 
Read-Modify-Write Operation auf den gasamten Port aus (selbst beim 
ASM-Befehl "BSF PORTx,y" wird technisch ein Read-Modify-Write auf alle 8 
Bits ausgeführt!), liest beim "Read" am analogen Pin den Null-Pegel ein 
und schreibt beim "Write" die 0 ins PORTx-Datenregister.
Wenn z.B. PORTA.0 auf Ausgang = High gesetzt wurde (TRISA.0=0, 
PORTA.0=1, aber ANSELA.0=1 -> Eingangstreiber=analog) und dann über 
PORTA.7=1 eigentlich nur PORTA.7 auf High gesetzt werden sollte, wird 
dadurch plötzlich unbeabsichtigt PORTA.0 auf Low gesetzt! Deshalb sollte 
man auch, wenn der Controller ein "LATx"-Register für den Port hat, 
immer LATx für die Ausgabe verwenden, statt PORTx.

von Picfan (Gast)


Lesenswert?

Hallo,
ein kleiner Tipp: Wenn die entsprechenden Ports auf Ausgang (TRIS=0) 
geschaltet sind, hat das ANSEL-Reg keinen Einfluss.
Falls du den ADC nicht benötigst, probier doch mal: ANSEL = 0.
So sollte sich der 676 eigentlich gleich verhalten wie der 628...
Gruss Picfan

von Johann R. (iwan)


Lesenswert?

Picfan schrieb:
> Falls du den ADC nicht benötigst, probier doch mal: ANSEL = 0.
> So sollte sich der 676 eigentlich gleich verhalten wie der 628...
> Gruss Picfan

Ne, ich brauche ADC noch. Es soll ein etwas angepasster Voltmeter am 
Ende raus kommen, der die Spannung von AD8307 misst.

Übrigens ich hatte unrecht, wie es mir oft geschieht: Der Ausgang mit 
eingeschalteten analogem Eingang (PORTA.2) scheint durch die Kapazität 
nicht gestört zu sein. Habe heute Gelegenheit gehabt Oszi zu benutzen - 
mit Ausgängen stimmt alles, Inputs waren das Problem. Also hat Thomas 
Elger (picalic) recht. Man spürt erfahrene Menschen. Sie haben 
mindestens kaum Zeit für die Scherze, sind immer sachlich. Deswegen 
tiefen Respekt vor Den!

von Thomas E. (picalic)


Angehängte Dateien:

Lesenswert?

Picfan schrieb:
> ein kleiner Tipp: Wenn die entsprechenden Ports auf Ausgang (TRIS=0)
> geschaltet sind, hat das ANSEL-Reg keinen Einfluss.

Wirklich nicht? Ohne Einfluss von ANSEL sollte ja folgendes Progrämmchen 
auch tatsächlich nur konstante 1-Pegel an RC0 und RC1 ausgeben - ich 
wage das aber zu bezweifeln:
1
#include <xc.h>
2
3
void main(void) {
4
  ANSEL = 0xFF;  
5
  TRISC = 0;
6
  while(1)
7
  {
8
    PORTCbits.RC0 = 1;
9
    PORTCbits.RC1 = 1;
10
  }
11
}

Edit: So, Q.E.D. sagt der Lateiner ;)
Musste es doch tatsächlich ausprobieren - wollte hier ja auch keinen 
Stuss erzählen! Hatte aber nur einen PIC16F688 da, aber das wird beim 
'676 nicht anders sein! Siehe Bild, Ch1: RC0, Ch2: RC1, mit exakt dem 
hier angegebenen Programm.

: Bearbeitet durch User
von Jochen-paul S. (picfan)


Lesenswert?

Thomas E. schrieb:
> Wirklich nicht? Ohne Einfluss von ANSEL sollte ja folgendes Progrämmchen
> auch tatsächlich nur konstante 1-Pegel an RC0 und RC1 ausgeben - ich
> wage das aber zu bezweifeln:

Ich weiss, bei einer Bitmanipulation des Ports wird leider der ganze 
Port ausgelesen und dann zurückgeschrieben, bei analog wird 0 
eingelesen.....
Nur besteht dieses Problem ja nicht nur bei analog ja oder nein.
Es genügt, eine Led an einem digital geschalteten Port zu haben, diese 
"zieht" diesen Port genauso hoch oder runter...

Gruss Picfan

von Jochen-paul S. (picfan)


Lesenswert?

Johann R. schrieb:
> Übrigens ich hatte unrecht, wie es mir oft geschieht: Der Ausgang mit
> eingeschalteten analogem Eingang (PORTA.2) scheint durch die Kapazität
> nicht gestört zu sein. Habe heute Gelegenheit gehabt Oszi zu benutzen -
> mit Ausgängen stimmt alles, Inputs waren das Problem.

Übrigens, funzt deine Schaltung jetzt?
Gruss Picfan

von Thomas E. (picalic)


Lesenswert?

Jochen-paul S. schrieb:
> Es genügt, eine Led an einem digital geschalteten Port zu haben, diese
> "zieht" diesen Port genauso hoch oder runter...

Eine ordentlich (d.h. mit geeignetem Vorwiderstand) angeschlossene LED 
macht da überhaupt kein Problem. Wenn der Port auf Ausgang und 
ANSEL-Bit=0 konfiguriert ist, liegt am Ausgang immer der richtige Pegel 
an. Nur, wenn man eine LED ohne Vorwiderstand zwischen VDD und den Pin 
legen würde, wäre das ein Problem. Das wäre aber schon vom 
Schaltungsdesign her Schrott.

Aufpassen muss man jedoch, wenn man Pins zwischendurch auf Eingang 
konfiguriert und dann andere Pins umschaltet - dann hat man u.U. 
plötzlich einen anderen Level am Pin, wenn man ihn wieder auf Ausgang 
stellt.

von Jochen-paul S. (picfan)


Lesenswert?

Thomas E. schrieb:

> Wirklich nicht? Ohne Einfluss von ANSEL sollte ja folgendes Progrämmchen
> auch tatsächlich nur konstante 1-Pegel an RC0 und RC1 ausgeben - ich
> wage das aber zu bezweifeln:

Nachtrag:

Ich habe etwas falsch geschrieben: Das ANSEL-Reg hat so gesehen 
tatsächlich
einen frappanten Einfluss, auch auf die auf Ausgang geschalteten Ports, 
leider ist es mit den alten Pic16 so. Sorry`!
Gruss Picfan

von Jochen-paul S. (picfan)


Lesenswert?

Thomas E. schrieb:
>
> Aufpassen muss man jedoch, wenn man Pins zwischendurch auf Eingang
> konfiguriert und dann andere Pins umschaltet - dann hat man u.U.
> plötzlich einen anderen Level am Pin, wenn man ihn wieder auf Ausgang
> stellt.

genau das meine ich auch!

Gruss Picfan

von Johann R. (iwan)


Lesenswert?

Jochen-paul S. schrieb:
> Übrigens, funzt deine Schaltung jetzt?
> Gruss Picfan

Zurzeit ja - LCD-Funktionen laufen. Später kommt mehr an Software dazu 
wegen ADC-behandlung. Ich werde also noch Fehler machen und diese 
korrigieren müssen. Wenn ich Fragen habe, frage ich Forum nochmal, aber 
nicht mehr in diesem Beitrag. Hier ist ja fertig.
Mit herzlichen Dank an alle!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.