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
Druckbare Version
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