Hallo,
da gibt es keinen Unterschied zwischen PORTB und LATB. Es funktioniert immer noch nicht. Es muss ein semantischer Fehler vorliegen.
Mit freundlichen Grüßen,
Sebastian
Hallo,
da gibt es keinen Unterschied zwischen PORTB und LATB. Es funktioniert immer noch nicht. Es muss ein semantischer Fehler vorliegen.
Mit freundlichen Grüßen,
Sebastian
Hallo
dann könnte sein, was ic oben schon gechrieben habe, dass du vor den TRIS-Befehlen die Speicher-Bank wechseln musst. Hats du denn schon mal mit dem Debugger festzustellen, ob deine Ports A und B tatsächlich Daten ausgeben ?
Du könntest dein Programm mal abändern - für tstzwecke und schreiben:
TRISB = 0 ; also alle Ausgang
PORTB = 0x55;
und jetzt mit MPLAB Sim überprüfen, ob da auch 55 auf dem PortB steht, und dann das gleiche mit PORTA.
TRISA = 0;
PORTA = 0x55;
gerhard
Hallo,
das habe ich alles schon mit dem Debugger überprüft. Muss man denn bei MPLAB-C18 die Registerbank wie bei Assembler umschalten?
Ich vermute mal das dort ein semantischer Fehler vorliegt oder das das was auf sprut.de steht nicht ganz korrekt ist: Das heruntergeladene Hex-file läuft einwandfrei. Wenn ich allerdings den Assemblercode assembliere und auf den PIC ziehe - funktioniert es nicht. Seltsam wahrscheinlich falscher Assemblercode zum Hex-file???
Gruß,
Sebastian
Hallo Sebastian
jetzt hab ich glaub ich ein bisschen den Überblick verloren. Anfangs war vom Pic16F84 die Rede, danach kam den C18-Compiler ins Spiel, aber sicher nicht für den PIC16F84. Mit welchem PIC arbeitest du denn jetzt gerade ?
Gerhard
Hallo,
ich progge immer noch für den 16F84 - hab mir aber jetzt einen 18F13?? besorgt - mal sehen. Es klappt jetzt jedenfalls.
Mein Code:
Gruß,Code:#define ENABLE PORTB.F0 #define RS PORTB.F2 #define RW PORTB.F3 #define D4 PORTB.F4 #define D5 PORTB.F5 #define D6 PORTB.F6 #define D7 PORTB.F7 #define T4 TRISB.F4 #define T5 TRISB.F5 #define T6 TRISB.F6 #define T7 TRISB.F7 void inittheLCD (); void schreiben(char byte); void controlachtbit(char byte); void inittheLCD(); void OutLcdControl(char byte); void display_loeschen_cursor(); void display_on(); void display_off(); void cursor_anfang(); void entry_mode(); void zwei_zeilig(); void ausfuehren(); void busy(); void schreiben(char byte); void main() { TRISB = 0; PORTB = 0; TRISA = 0; PORTA = 0; PORTA.F0 = 1; inittheLCD(); PORTA.F0 = 0; schreiben('H'); schreiben('a'); schreiben('l'); schreiben('l'); schreiben('o'); schreiben(' '); schreiben('1'); schreiben('1'); schreiben('e'); schreiben('r'); Delay_ms(10); while(1); } void inittheLCD() { /*Initialisierung des LCD-Displays*/ Delay_ms(250); //LCD auf 8bit initialisieren (3mal) controlachtbit(0b00110000); Delay_ms(250); controlachtbit(0b00110000); Delay_ms(250); controlachtbit(0b00110000); Delay_ms(250); controlachtbit(0b00110000); Delay_ms(250); //LCD auf 4bit initialisieren controlachtbit(0b00100000); Delay_ms(50); //Display loeschen - curser home display_loeschen_cursor(); Delay_ms(1050); //2zeilig zwei_zeilig(); Delay_ms(1050); //Display: aus display_off(); Delay_ms(1050); //Eingabemodus entry_mode(); Delay_ms(1050); //Curser Anfang: cursor_anfang(); Delay_ms(1050); //Display: an display_on(); Delay_ms(1050); } void controlachtbit(char byte) { /*Ein Steuerbyte 8bittig uebertragen*/ PORTB = 0; D4 = byte.F4; D5 = byte.F5; D6 = byte.F6; D7 = byte.F7; ausfuehren(); //Test: PORTA.F3 = D7; return; } void OutLcdControl(char byte){ /*Ein Steuerbyte 4-bittig uebertragen*/ Delay_ms(40);//busy(); PORTB = 0; D4 = byte.F4; D5 = byte.F5; D6 = byte.F6; D7 = byte.F7; ausfuehren(); Delay_ms(40);//busy(); PORTB = 0; D4 = byte.F0; D5 = byte.F1; D6 = byte.F2; D7 = byte.F3; ausfuehren(); Delay_ms(40);//busy(); //Test: PORTA.F2 = 1; return; } void display_loeschen_cursor(){ //Display wird geloescht und Cursor an den Anfang gesetzt OutLcdControl(1); } void display_on(){ //Display wird eingeschaltet OutLcdControl(0b00001111); } void display_off(){ //Display wird ausgeschaltet OutLcdControl(0b00001000); } void cursor_anfang(){ //Curser wird an den Anfang gesetzt OutLcdControl(3); } void entry_mode(){ //LCD wird auf eingabemodus geschaltet OutLcdControl(0b00000110); } void zwei_zeilig(){ //LCD wird auf 2 zeilig eingestellt OutLcdControl(0b00101000); } void ausfuehren(){ //ein Befehl wird ausgefuehrt (LCD-ENABLE an und aus) ENABLE = 1; Delay_ms(15); ENABLE = 0; Delay_ms(15); } void busy(){ /*Diese Fkt. laueft solange bis das Busyflag 0 ist*/ PORTB = 0; //Datenbus auf Eingabe schalten T4 = 1; T5 = 1; T6 = 1; T7 = 1; RW = 1; while(1){ ENABLE = 1; Delay_ms(10); if(D7 == 0)//Wenn das Busy-Flag 0 ist - dann wird diese Schleife abgebrochen break; ENABLE = 0; Delay_ms(20); ENABLE = 1; Delay_ms(20); ENABLE = 0; Delay_ms(20); } ENABLE = 0; Delay_ms(20); ENABLE = 1; Delay_ms(20); ENABLE = 0; //Datenbus auf Ausgabe schalten T4 = 0; T5 = 0; T6 = 0; T7 = 0; PORTB = 0; } void schreiben(char byte){ Delay_ms(40);//busy(); PORTB = 0; D4 = byte.F4; D5 = byte.F5; D6 = byte.F6; D7 = byte.F7; RS = 1; ausfuehren(); Delay_ms(40);//busy(); PORTB = 0; D4 = byte.F0; D5 = byte.F1; D6 = byte.F2; D7 = byte.F3; RS = 1; ausfuehren(); Delay_ms(40);//busy(); }
Sebastian
Hallo,
noch mal eine Frage. Die erste Zeile kann ich ohne Probleme ansteuern. Die zweite Zeile funktioniert allerdings nicht. Wenn ich den Kontrast hochdrehe und mehr als 16 Buchstaben eingebe, sieht man in der zweiten Zeile nichts.
-Seltsamerweise habe ich aber mit 00101000 das Display auf zwei-zeilig gestellt.
-Dann habe ich versucht mit folgender Funktion, den Cursor zu positionieren - das funktionierte leider auch mit den Werten 2,2 nicht:
-Über die Speicheradresse 42 auf die zweite Zeile zuzugreifen geht leider auch nicht mit folgender Fkt.:Code:void positionieren(char zeichen, char spalte){ char uebergabe = 0; uebergabe.F0 = spalte.F0; uebergabe.F1 = spalte.F1; uebergabe.F2 = spalte.F2; uebergabe.F3 = zeichen.F0; uebergabe.F4 = zeichen.F1; uebergabe.F5 = zeichen.F2; uebergabe.F6 = 1; OutLcdControl(uebergabe); //Datenueber uebertragen }
Hat jemand eine Idee, was ich falsch mache?Code:void ruecke_zur_speicherstelle(char adresse){ char uebergabe = adresse; uebergabe.F7 = 1; OutLcdControl(uebergabe); }
Gruß,
Sebastian
Lesezeichen