Jump to content

LCD Ansteuerung mit PIC16F84A: Problem


Servit

Recommended Posts

Hallo,

ich versuche anhand eines 16F84A die PIX-Programmierung zu erlernen. Anfänglich habe ich LED's mit Erfolg zum Blinken gebracht. Jetzt wollte ich mich mit der Ansteuerung eines LCD Displays (16x2)  beschäftigen. Zuerst nur eine Initialisierungsroutine mit Festlegung der Diplayeigenschaften, Bildschirm löschen usw. Beim Compilen mit MPLAB (IDE 7.11) werden keine Fehler gemeldet. Das brennen mit Progpic2 verläft auch ohne Fehler. Wenn ich aber den PIC in der LCD-Schaltung platziere und "den Schalter umlege", erscheinen nur schwarze Balken in der oberen Zeile., kein flackern, blinken, löschen.

Die Verkabelung des Displays habe ich von einer Schaltung aus dem Netz: http://www.piclist.com/techref/piclist/weedfreq/circuit.htm

Vielleicht kann mir von euch jemand weiterhelfen. Hier der Code (Formatierung ist etwas verrutscht, darum habe ich die Datei auch noch mal hier http://service.gmx.net/mc/Ifv3EXtLXZ5NXrvmq0cpHrOp1Nx6MB)

;******************************************************************************
;                           LCD Disply Testprogramm
;								für LCD 16x2
;							Initialisierungsroutine
;							geschrieben von Andreas Schulz
;  
;******************************************************************************
;
	list	P=16F84A
;******************************************************************************
; Konfiguration
;******************************************************************************
_CP_ON                       EQU     H'000F'
_CP_OFF                      EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_PWRTE_OFF                   EQU     H'3FFF'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_LP_OSC                      EQU     H'3FFC'
_XT_OSC                      EQU     H'3FFD'
_HS_OSC                      EQU     H'3FFE'
_RC_OSC                      EQU     H'3FFF'

	__CONFIG        _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

;******************************************************************************
; Variablendefinitionen
;******************************************************************************
STATUS		equ	03h
PORTA		equ	05h
PORTB		equ	06h
OPTION_REG	equ	81h
TRISA		equ	85h
TRISB		equ	86h
RP0			equ	05h
RP1			equ	06h
RS			equ	02h
RW			equ	01h
EN			equ	00h
TIMER1		equ	0Ch
TIMER2		equ	0Dh

;******************************************************************************
; Programmstart
;******************************************************************************
	ORG	0x00
	GOTO	Start



;Verzögerung um 1ms
Pause1	MOVLW	D'6'		; Zähle 6 x von 150 bis 0
		MOVWF	TIMER1
Delay1	MOVLW	D'150'
		MOVWF	TIMER2
		DECFSZ  TIMER2,1
	 		GOTO    $-1
   		DECFSZ	TIMER1,1
			GOTO	Delay1
		RETLW   0	

;Verzögerung um 5ms
Pause2	MOVLW	D'35'		; Zähle ,35 x von 150 bis 0
		MOVWF	TIMER1
Delay2	MOVLW	D'150'
		MOVWF	TIMER2
		DECFSZ  TIMER2,1
	 		GOTO    $-1
   		DECFSZ	TIMER1,1
			GOTO	Delay2
		RETLW   0	

;Verzögerung um 15ms
Pause3	MOVLW	D'100'		; Zähle 100 x von 150 bis 0
		MOVWF	TIMER1
Delay3	MOVLW	D'150'
		MOVWF	TIMER2
		DECFSZ  TIMER2,1
	 		GOTO    $-1
   		DECFSZ	TIMER1,1
			GOTO	Delay3
		RETLW   0x00	


DSP_Zeigen	BSF		STATUS,RP0		;Bank 1
		MOVLW	B'11111000'		;Ra0 -> Ra2 sind Outputs
		MOVWF	TRISA			;Setze Konfiguration für PORTA
		MOVLW	B'00000000'		;Ra0 -> Ra7 sind Outputs
		MOVWF	TRISB			;Setze Konfiguration für PORTB
		BCF		STATUS,RP0		;Bank 0
		CLRF	PORTA			;Lösche PORTA
		CLRF	PORTB			;Lösche PORTB
		BCF		PORTA,EN		;Enable=0
		BSF		PORTA,RS		;RS=1 übertragene Daten als Zeichen
		BCF		PORTA,RW		;RW=0 Daten zum Display schreiben
		MOVLW	B'01000001'		;schreibe A
		MOVWF	PORTB
		BSF		PORTA,EN		;Enable=1
		CALL	Pause3
		NOP
		BCF		PORTA,EN		;Enable=0
		RETLW	0x00



DSP_Init	Call	Pause3
		BCF		STATUS,RP0		;Bank 0		
		BCF		PORTA,EN		;Enable=0
		BCF		PORTA,RS		;RS=0
		BCF		PORTA,RW		;RW=0
		NOP
		BSF		STATUS,RP0		;Bank 1
		MOVLW	B'00110000'		;Interface auf 8Bit
		MOVWF	PORTB
		BSF		PORTA,EN		;Enable=1				
		CALL	Pause2
		BCF		PORTA,EN		;Enable=0
		MOVLW	B'00110000'		;Interface auf 8Bit
		MOVWF	PORTB
		CALL	Pause1
		BCF		PORTA,EN		;Enable=0
		MOVLW	B'00110000'		;Interface auf 8Bit
		MOVWF	PORTB
		BSF		PORTA,EN		;Enable=1				
		MOVLW	B'00110000'		;Interface 2-zeilig, 8Bit, 5x7
		MOVWF	PORTB
		CALL	Pause2
		MOVLW	B'00001000'		;Display AUS
		MOVWF	PORTB
		CALL	Pause2
		MOVLW	B'00000001'		;Clear Display
		MOVWF	PORTB
		CALL	Pause2
		MOVLW	B'00000110'		;Cursor rechts, kein Shift
		MOVWF	PORTB
		CALL	Pause2
		MOVLW	B'00001100'		;Display EIN
		MOVWF	PORTB
		CALL	Pause2
		BCF		STATUS,RP0		;Bank 0
		BCF		PORTA,EN		;Enable=0
		RETLW	0x00




Start	BSF		STATUS,RP0		;Bank 1
		MOVLW	B'11111000'		;Ra0 -> Ra2 sind Outputs
		MOVWF	TRISA			;Setze Konfiguration für PORTA
		MOVLW	B'00000000'		;Ra0 -> Ra7 sind Outputs
		MOVWF	TRISB			;Setze Konfiguration für PORTB
		BCF		STATUS,RP0		;Bank 0
		CLRF	PORTA			;Lösche PORTA
		CLRF	PORTB			;Lösche PORTB
		CALL	DSP_Init
		CALL	DSP_Zeigen

			END

Ich wäre auch dankbar für sonstige Tips zur Code-Optimierung bzw. Verbesserung meiner Schreibweise.

Weiterhin habe ich noch folgende Fragen:

Beim Compilieren erscheinen Warnungen: Register in operand not in bank 0.  Ensure that bank bits are correct., obwohl ich immer zur entsprechenden Bank springe.

Beim Simulieren mit MPLAB SIM meines Programmes erscheint im Output-Dialog :CORE-E0002: Stack under flow error occurred from instruction at 0x000404. Leider sind die Fehler in der Hilfe nicht erläutert. Was bedeutet dieser Fehler???

Dank!

Gruß

Andreas

Link to comment
Share on other sites

Hallo Andreas,

dies ist eigentlich kein generelles PIC Programmierer-Forum, hier geht es hauptsaechlich um MIOS Projekte.

Aber ich kann Dir zumindest den Hinweis geben, dass an einigen Stellen das Bus-Protokoll nicht eingehalten wird.

So z.B in folgenden Zeilen:


    MOVLW B'00001000'  ;Display AUS
  MOVWF PORTB
  CALL Pause2
  MOVLW B'00000001' ;Clear Display
  MOVWF PORTB
  CALL Pause2
[/code]

ich vermisse den Strobe (E=0 -> E=1 -> 2 NOPs -> E=0).

Unter http://www.ucapps.de/mbhp/prg/lcd_v1.zip findest Du einen Beispielcode fuer meine alten PIC16F basierenden Projekte, vielleicht hilft es weiter.

Die Bank-Warnungen habe ich mit:

        ERRORLEVEL      -302    ; SUPPRESS BANK SELECTION MESSAGES

deaktiviert (man muss beim PIC16F hoellisch auf die Bank Selection bits achten...)

Warum ein Stack Underflow auftritt, kann ich auf anhieb nicht sagen. Evtl. liegt es daran, dass die Start Routine nicht sauber abgeschlossen ist. Nach dem letzten CALL befindet sich nichts mehr - der PIC wird hier beliebigen Code ausfuehren. Es waere besser, das Programm mit einer Endlos-Schleife zu beenden

Gruss,

        Thorsten.

Link to comment
Share on other sites

  • 2 weeks later...

Hallo Matze,

ja, das Problem ist noch aktuell. Ich habe leider noch keine Lösung gefunden, wahrscheinlich doch ein Schaltungsfehler. Ich habe verschiedene Quellcodes durchgeackert um daraus kleine Testprogramme zu erstellen, aber ohne jegliche Zuckungen des Displays :-).  Ich werde wohl die Schaltung nochmal neu erstellen.

Beim mikrocontroller.net Forum habe ich auch schon mein Glück versucht, aber trotzdem Danke.

Irgendwie habe ich in den ganzen Beispielen im Netz noch keine Einheitlichkeit für die Displayansteuerung erkannt, jeder macht das irgendwie anders... Das Datenblatt gibt auch nicht viel her.

Gruß

Andreas

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...