Servit Posted June 24, 2005 Report Share Posted June 24, 2005 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.htmVielleicht 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 Quote Link to comment Share on other sites More sharing options...
TK. Posted June 25, 2005 Report Share Posted June 25, 2005 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 MESSAGESdeaktiviert (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 beendenGruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
Servit Posted June 27, 2005 Author Report Share Posted June 27, 2005 Danke Thorsten, ich denke mit deinen Quellen kann ich einiges lernen.Mit einer Endlosschleife habe ich schonmal den Stack Overflow beheben können!GrußAndreas Quote Link to comment Share on other sites More sharing options...
acidcode Posted July 12, 2005 Report Share Posted July 12, 2005 Hey Servit,keine Ahnung ob das noch aktuell ist, aber ein gutes deutschsprachiges Forum zur Programmierung von µC ist www.mikrocontroller.netVielleicht kanntest Du das ja noch nicht und hilft evtl. weiter.GrüßeMatze Quote Link to comment Share on other sites More sharing options...
Servit Posted July 12, 2005 Author Report Share Posted July 12, 2005 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.