PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerproblem: LCD Ansteuerung, einzelnen Pin vertauschen



Oliver71
28.06.2006, 18:28
Hallo erstmal.

Ich habe mir vor kurzem den Sprut-Brenner5 gebaut und 2 Pic16f84 besorgt um als eingefleischter Analog-Elektroniker doch endlich mal in die Welt der uC's reinzuschnuppern.
Ein erstes LC-Meter dass ich nur nachgebaut hatte hat auf Anhieb funktioniert.

Jetzt wollte ich mich doch genauer mit der Assemblerprogrammierung auseinandersetzen, und hab mir bei einem Testaufbau mit LCD-Anzeige ( http://www.sprut.de/electronic/pic/programm/lcd.htm ) durch eine übersehene Zinnbrücke auf der Streifenrasterplatine (VDD nach RB7) den RB7-Ausgang gleich an zwei Pic's abgeschossen.
Die Schaltung verwendet RB4-RB7 zur Ansteuerung der LCD-Datenleitungen D4-D7.

Meine Frage: ist es möglich, nur D7 der LCD über RB1 statt RB7 anzusteuern, vor allem, wie sage ich dem Assembler, dass er RB1 und RB7 bei PORTB Abfragen und Ausgaben vertauschen soll?

also in etwa so:
RB4>LCD D4
RB5>LCD D5
RB6>LCD D6
RB1>LCD D7

irgendwie versteh ich zwar bei dem asm File, wie E, RS und RW über PortA angesprochen werden (direkt über die Bits bzw. den in den Constants deklarierten), steige aber nicht durch wo der Code ist dass der Pic die LCD-Datenleitungen ausgerechnet über RB4-RB7 analog D4-D7 anspricht...oder fehlt der einfach weil die Zahlen ja identisch sind?

Hab versucht in allen Befehlen die PortB ansprechen oder auslesen einfach Bit 1 mit Bit 7 zu tauschen, und RB1 ebenfalls als Ausgang gesetzt, aber hat nicht funktioniert, aber das wär wohl auch zu einfach gewesen^^

Die zwei Pics sind definitiv defekt (eben RB7 Ausgang, Eingang ist nicht betroffen, der Rest okay), es läuft trotzdem jedes Programm darauf dass nicht RB 7 als Ausgang braucht, ich seh's deshalb ein bischen als Assembler-Einstieg und Herausforderung an, die defekten Pics doch noch zu nutzen, wenn die Schaltung nicht alle 8 PortB-outputs braucht und ich den RB7 durch einen anderen unbenutzten ersetzen könnte.

Sorry falls die Frage für Profis vielleicht blöd klingt, aber ASSEMBLER ist für mich wirklich Neuland, und wohl gerade weil ich Delphi oder Basic kenne, sehr abstrakt am Anfang...oder ich steh aufm Schlauch.^^

Gruß, Oliver.

EinsamerUser
29.06.2006, 10:01
meines wissens gibst du den Datenport (in deinem Fall PORTB) an und nicht die einzelnen Pins! Wenn du das ändern wolltest müsstest du ein bissle mehr im code ändern.

Hast du eigentlich schonmal probiert einen 10K widerstand gegen Masse zu hängen? Wenn du Glück hast ist dir nur ein Transistor an diesem PIN abgeraucht Das müsste dann der sein, der gegen Masse schaltet.
Der Ausgang müsste dann jetzt wie eine Art "Open-kollektor-Ausgang" funktionieren.
d.h. er kann deinen PIN nicht mehr gegen Masse ziehen!? Dauer 5V?

Probiers aus....wenns geht brauchst keine Änderungen an der software vornehmen, wenns nicht funzt, dann wird man dir hier mit der Software weiterhelfen.

Viel Spaß beim Probieren.

Gruß
Stefan

Oliver71
29.06.2006, 11:51
Danke erstmal, aber scheint doch schlimmer zu sein :-(
ich kann RB7 zwar mit dem Pulldownwiderstand noch auf 0V bekommen, aber er lässt sich nichtmal dann mehr ansteuern, wenn ich ihn per Software direkt anspreche (PORTB,7).

EinsamerUser
29.06.2006, 16:16
Theoretisch musst du nur an die richtigen stellen dies einfügen:


bcf PORTB,1
btfsc PORTB,7
bsf PORTB,1


aber wie gesagt theoretisch....

Beispiel:


InitLCD
movlw D'255' ; 250 ms Pause nach dem Einschalten
movwf loops
call WAIT

movlw B'00110000' ; 1
movwf PORTB

bcf PORTB,1
btfsc PORTB,7
bsf PORTB,1

bsf PORTB, LcdE
nop
bcf PORTB, LcdE

movlw D'50' ; 50 ms Pause
movwf loops
call WAIT
....


Im Prinzip musst du das überall einsetzen, wo du auf den Datenport zugreifen tust. Achtung bei der Busy-Abfrage musst du's genau umgekehrt machen.

Geh den Code durch, analysiere den ein bissle, dann lernst ASM und den PIC kennen und dann kannst den auch umschreiben.
Ich hatte da damals auch zu kämpfen gehabt, zwar nicht mit einem defekten PIN, aber mit den Datenleitungen an PORTA.....das ist aber eine andere Geschichte.

Probiers mal aus.....

Gruß
Stefan

Oliver71
30.06.2006, 21:26
Danke,

dass war zumindest genau die Befehlsfolge, wegen der ich mir lange den Kopf zerbrochen hab- auf die Idee, dass man den als Ausgang initalisierten Port trotzdem wie einen Eingang abfragen kann, um die Bits zu vertauschen, bin ich nicht gekommen :)

Ob es wirklich funktioniert, kann ich erst nächste Woche sagen, aber sieht soweit ich dass verstehe vielversprechend aus, wenn ich es hinkriege dass Port B geänderdert wird bevor er zur LCD-Anzeige übertragen wird...manche Routinen sind für mich noch etwas kryptisch^^

Gruß, Oliver.

EinsamerUser
30.06.2006, 21:41
....als Ausgang initalisierten Port trotzdem ....


Ich glaub in den Datenblättern von den PICs sieht man sehr schön, wie der Port vom Prinzip her physikalisch aufgebaut ist.
Im Prinzip liegt vor dem Ausgangstreiber noch ein Register (stellenweise auch LATB genannt) welches den Status speichert, welcher ausgegeben werden soll.

Aber denk dran, dass meine Befehlsfolge nur ein Anhaltspunkt ist. Du musst natürlich vorher den PIN richtig initialisieren usw.

Ich wünsch dir auf jedenfall viel Spaß beim "rumspielen" :-)

Gruß
Stefan