- LiFePO4 Speicher Test         
Ergebnis 1 bis 6 von 6

Thema: Anfängerproblem: LCD Ansteuerung, einzelnen Pin vertauschen

  1. #1

    Anfängerproblem: LCD Ansteuerung, einzelnen Pin vertauschen

    Anzeige

    E-Bike
    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.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    10.03.2005
    Ort
    Mannheim
    Alter
    40
    Beiträge
    32
    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

  3. #3
    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).

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    10.03.2005
    Ort
    Mannheim
    Alter
    40
    Beiträge
    32
    Theoretisch musst du nur an die richtigen stellen dies einfügen:
    Code:
    bcf   PORTB,1
    btfsc PORTB,7
    bsf   PORTB,1
    aber wie gesagt theoretisch....

    Beispiel:
    Code:
    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

  5. #5

    Danke!

    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.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    10.03.2005
    Ort
    Mannheim
    Alter
    40
    Beiträge
    32
    ....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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen