-
Hallo
vielen Dank das du das durchgeguckt hast. Da muss ich mich wohl ein bisschen geirrt haben :wink: . Das Servo funktioniert jetzt einwandfrei.
Jetzt bleibt nur noch die Frage mit dem Display, warum das nichts macht. Liegt das vielleicht auch an den Ausgängen an PortA, brauchen die auch einen Widerstand? Schließlich sind das ja fast so aufgebaut wie PWM-Signale.
Gruß,
Johann
-
Hallo,
die restlichen Pins sind ganz "normal". Vielleicht schaue ich mir das morgen mal an.
Gruß,
Michael
-
Es funktioniert endlich mit deinem Code. Der Fehler lag überhaupt nicht in der Schaltung sondern in der Initialisierung des Microkontrollers. Der interne 4Mhz-Takt klappt bei mir nämlich nicht. Das war ja eingestellt, ich habs umgestellt auf 3f21 und jetzt klappt es wunderbar. Vielen Dank für deine Hilfe.
Gruß,
Johann
-
Hallo,
meinen Glückwunsch!
Ich wollte mir soeben das Programm für das Display ansehen, hat sich ja dann erledigt.
Weiterhin viel Spaß.
Gruß,
Michel
-
Hallo Jojo12,
ich habe das gleiche Problem mit einem Displaytech 161A.
Bei der initialisierung schaltet es in den 2-Zeilenmodus, danach passiert nichts mehr...
Beschäftige mich zum ersten Mal mit Displays.
Wo kann man den Takt 3F21 einstellen ? Was muss ich im Source ändern ?
Gruß,
Heiko
-
Hallo,
3F21 ist der Wert für das Konfigurationswort, damit legt man z. B. fest welchen Oszillator (RC, XT, HS, LP usw.) man verwenden möchte. Entweder stellt man das im Brennprogramm ein oder man gibt es am Anfang im Quelltext mit dem Befehl
__config 3f21h
an. Dabei auf die 2 (!) Unterstriche achten. In MPLAB kann man sich den Wert über Configure > Configuration Bits ansehen.
Gruß,
Michael
-
Hallo Michael,
danke ! Ich habs ans laufen bekommen.
Hatte auch noch ein paar andere Fehler im Programm.
Jetzt funktionierts aber :-)
Gruß
Heiko
-
LCD - spinnt?
Hallo,
es liegt bei mir ein ähnliches Problem vor. Ich verwende allerdings einen PIC16F84A und 162C-LCD-Anzeige.
Mein Skript:
Code:
list p=16f84
;**************************************************************
;* Pinbelegung
;* ----------------------------------
;* PORTA: 0 -
;* 1 -
;* 2 -
;* 3 -
;* 4 -
;* PORTB: 0 LCD Display E
;* 1
;* 2 LCD Display RS
;* 3 LCD Display R/W
;* 4-7 LCD Display D4 .. D7
;*
;**************************************************************
;
;
; LCD-Display
;
; Taktquelle: 4 MHz
;
;**************************************************************
; Includedatei für den 16F84 einbinden
#include <P16F84A.INC>
; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;**************************************************************
; Variablennamen vergeben
loops Equ 0x22 ; Zähler für Warteschleife
loops2 Equ 0x23 ; Zähler für Warteschleife
Daten Equ 0x24
;**************************************************************
;Ersetzungen:
LcdE equ 0 ; enable Lcd
LcdRw equ 3 ; read Lcd
LcdRs equ 2 ; Daten Lcd (nicht control)
Init:
bsf STATUS,RP0; ->Bank 1
movlw B'00000000'
movwf TRISB;->PortB: alle outputs
bcf STATUS,RP0; ->Bank 0
movwf PORTB;-> alles auf null setzen
call InitLcd;-> initialisieren
;Buchstabe einfuegen
movlw 'H'
bsf PORTB, LcdRs ; auf den Textpuffer schreiben
call Datenreinkopieren; Die Daten werden herein kopiert
bcf PORTB, LcdRs
Main ;Endlosschleife
goto Main
InitLcd
;auf das Ende des internen Resets warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
call Warten
;Interface auf 8 bit Eingang setzen
call Achtbitsetzen
call Achtbitsetzen
call Achtbitsetzen
;Interface auf 4-bit Eingang setzen
call Vierbitsetzen
;Interface als zwei zeilig einstellen
call zweizeilig
call Display_aus
call Displayloeschen
call kurser_rechts_shift
call Display_ein
return
Achtbitsetzen; Achtbit-Datenbus einstellen
call Aufnullsetzten; alle Ausgaenge von PortB werden auf low setztrn
bsf PORTB,5
bsf PORTB,4
call Absenden
return
Vierbitsetzen; Vierbit-Datenbus einstellen
call Aufnullsetzten; alle Ausgaenge von PortB werden auf low setzen
bsf PORTB,5
call Absenden
return
Absenden
bsf PORTB,LcdE
call Warten
call Warten
call Warten
bcf PORTB,LcdE
call Warten
return
Aufnullsetzten
movlw B'00000000'
movwf PORTB
return
Datenreinkopieren
call Aufnullsetzten; alle Ausgaenge von PortB werden auf low setzen
;Erster Teil einfuegen (ersten vier Bit)
btfsc Daten, 7
bsf PORTB,7
btfsc Daten, 6
bsf PORTB,6
btfsc Daten, 5
bsf PORTB,5
btfsc Daten, 4
bsf PORTB,4
call Absenden
call Aufnullsetzten; alle Ausgaenge von PortB werden auf low setzen
;Zweiter Teil einfuegen
btfsc Daten, 3
bsf PORTB,7
btfsc Daten, 2
bsf PORTB,6
btfsc Daten, 1
bsf PORTB,5
btfsc Daten, 0
bsf PORTB,4
call Absenden
return
Displayloeschen
movlw B'00000001'
movwf Daten
call Datenreinkopieren
return
Display_aus
movlw B'00001000'
movwf Daten
call Datenreinkopieren
return
Display_ein
movlw B'00001100'
movwf Daten
call Datenreinkopieren
return
zweizeilig
movlw B'00100000'
movwf Daten
call Datenreinkopieren
return
kurser_rechts_shift
movlw B'00000010'
movwf Daten
call Datenreinkopieren
movlw B'00001111'
movwf Daten
call Datenreinkopieren
return
Warten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
call MSWarten
return
MSWarten
movlw .110 ; Zeitkonstante für 1ms
movwf loops2
Wai2 nop
nop
nop
nop
nop
nop
decfsz loops2, F ; 1 ms vorbei?
goto Wai2 ; nein, noch nicht
return;
end
Es passiert nichts. Wenn man den Kontrast hochregelt, stellt man fest das nur in der unteren Zeile graue Kästchen erscheinen.
Mit einem Logikprüfer habe ich schon meinen PIC überprüft, es scheint als ob der PIC funktionieren würde. Müssen noch irgendwelche Widerstände zwischen PIC und LCD eingebaut werden? / Oder woran kann so ein Verhalten liegen?
mfg
Sebastian
-
Hallo,
auf den ersten Blick sehe ich keinen Fehler. Am besten schreibst du mal eine Warteschleife nachdem dein PIC initialisiert ist und greifst dann erst auf Display zu. Außerdem mal die Verdrahtung prüfen. Wenn du nciht sicher bist ob der PIC arbeitet kannst du PORTA als Ausgänge setzen, ein paar LEDs anschließen und an bestimmten Programmstellen einschalten. Außer dem Trimmpoti für den Kontrast braucht man am Display nichts weiter, ein 100nF kondensator schadet aber wie immer nicht. Das Config habe ich nicht überprüft (ich schreibe das was ich will immer als Hex-Wert), vielleicht macht der Watchdogtimer Probleme? Ich weis jetzt nicht auswendig ob der aktiviert ist oder nicht.
Gruß,
Michael
-
Hallo,
danke für die schnelle Antwort. Die Drahtverbindungen sind alle ok. Ich hab vor 2 Minuten das Problem doch gelöst und zwar war der Controller noch "busy" während ich schreibe... mmh naja .. ich hatte mich erst nach den Zeiten im Datenblatt gehalten... entweder waren meine Warteschleifen zu kurz oder der LCD zu langsam. :-k
mfg
Sebastian