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.
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
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!
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
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!
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.
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
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!
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
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
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.