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