Hallo miteinander, ich bin Student und habe mich in letzter Zeit im Rahmen unseres Baugruppen-Praktikums genauer mit dem Thema Mini-Modul MM-537 und dessen Programmierung beschäftigt. Während meiner Arbeit bin ich dann auf dieses Forum gestoßen und hoffe, dass Ihr mir bei meinen kleinen Problemchen, die ich noch habe, helfen könnt. Meine Praktikums-Aufgabe besteht darin, während unseres Baugruppen-Praktikums ein Programm zu entwickeln, das die Registerbänke wahlweise binär oder hexadezimal auf dem Monitor (über den Hyper-Terminal) des Host-PC anzeigt. Übergabeparameter sollen einmal die Registerbank-Nr. und zum anderen die Darstellungsart (B oder H) sein. Im Anhang findet Ihr das von mir geschriebene Programm (Regbank.c), welches die Aufgabe erfüllen soll. Leider funktioniert das Programm noch nicht. Höchstwahrscheinlich liegt es an folgenden Punkten. Könnt Ihr mir dazu ein paar Tipps geben? - Kann man die Tastatureingabe der Tasten 0,1,2,3,B und H in dieser Form übergeben? Oder muss man über Bitadressen gehen? - Wenn man den Inhalt des Registers im binären Format ausgeben möchte, welchen Buchstaben schreibe ich dann in die Anweisung? Für hexadezimal: %16x (Variable umfasst 16Stellen und ist vom Typ Hexadezimal) Ist dies auch für das binäre Format möglich? Für binär: %64b ???? - Die vier Registerbänke bestehen aus jeweils 8 Teilregistern R0 .. R7, die jeweils 8bit groß sind. Wie spreche ich denn die gesamte Registerbank, die insgesamt 64bit (8x8bit=8byte) groß ist, an? Das heißt, welche Adressen besitzen die vier Registerbänke? Kann man denn einfach (siehe Programmsyntax) den Inhalt der jeweiligen Registerbank, insofern man jetzt mal annimmt, dass z.B. die Adresse der Registerbank 0 RB0 ist, mit inhalt&=RB0; auslesen? - Der Zugriff auf die vier Registerbänke erfolgt ja über das PSW. Das heißt durch Ändern von zwei Bitstellen im PSW kann man den Zugriff auf die Registerbänke umstellen. Die Bitstellen heißen, wie bekannt, RS1 und RS0. Mit welchem Befehl, insofern meine Herangehensweise für das Auslesen des Registerbank-Inhaltes (siehe Programm) falsch ist, kann ich diese beiden Bits setzen, um zwischen den vier Registerbänken hin- und herzuschalten? Und wie greife ich dann auf die vier Registerbänke zu? Ich hoffe, dass Ihr mir weiterhelfen könnt und bedanke mich schon mal im Voraus für Eure Hilfe. Mit freundlichen Grüßen Mike Werner
Hallo Mike das ist schon ein paar Jahre her, daß ich mit Keil gearbeitet habe, aber wenn ich mich richtig erinnere fehlt da die Initilaisierung der seriellen Schnittstelle in derinem Code !? Gerhard
Du liest einen INT ein mit scanf("%d",&x); dann solltest due auch einen INT prüfen (also 0x00 anstatt '0') Ausserdem wäre es sinnvoll nicht in eine Endlosschleife zu gehen wenn du etwas falsch machst bei einer Eingabe (besser wiederholen lassen) nächste Problem (x < '0' && x > '3') wie kann eine Zahl sowohl < '0' ALS AUCH größer '3' sein ? y sollte vom Typ (unsigned) char sein in deinen Switch/cases fehlen die Breaks inhalt ist vom Typ int => "%16x" kann nicht sein!!
inhalt&=RB0; // Auslesen der Registerbank 0, Schreiben des Inhaltes in die Variable Inhalt Das ist eine gültige Anweisung, wenn irgendwo RB0 definiert ist. Sie macht bloß etwas völlig anderes, als im Kommentar steht. Auf Register läßt sich nicht direkt zugreifen, Du mußt es über ihre Adresse tun (0..7, 8..F usw.). Dazu ist es notwendig, sich erstmal mit den verschiedenen Speicherbereichen des 8051 zu beschäftigen. Dann sollte man sich mit C beschäftigen, d.h. wieviel Bits haben die verschiedenen Datentypen und welche Formatzeichen kennt das printf() und was macht es dann daraus. Auch sollte man generell das large Modell vermeiden, da es sehr großen und langsamen Code erzeugt. Es hat eigentlich nur Nachteile und keine Vorteile. Hier mal eine Funktion, die Dir vielleicht von Nutzen sein könnte: void ram_dump(void) { unsigned char idata *s; s = 0; do{ if( ((char)s & 0x0F) == 0 ) printf( "A: %02X D:", (unsigned int)s ); printf(" %02X", (int) *s ); s++; }while( s ); printf( "\r\n" ); } Peter
@T.Stütz "%16x" kann nicht sein!! ich würde mal vermuten, das macht mindestens 12 Leerzeichen gefolgt von maximal 4 Digits. Peter
@peter dannegger Stimmt, er will aber "...%16x (Variable umfasst 16Stellen und ist vom Typ Hexadezimal)" also hexdump von 8 Byte auf einmal (das geht so nicht) => ram_dump() von dir um Speicherbereich 64KByte auszugeben (nette kleine Routine (Adresse noch vierstellig ausgeben und CR+LF vor Ausgabe Adresse, dann paßt schon... :-) Gruss
Danke für die Antworten. Habe die Fehler in meinem Programm soweit korrigiert. @ all Wisst ihr, wie man Registerbänke unter C ausliest? Ich möchte z.B. den Inhalt der ersten Registerbank (RB 0) komplett (64bit=8byte) oder auch das Universalregister R2 (8bit) der ersten Registerbank auslesen. Wie gehe ich da vor? Danke.
"Wisst ihr, wie man Registerbänke unter C ausliest?" Meinst Du wirklich, das es was hilft, die Antworten zu ignorieren und die Frage zu wiederholen ? Ich jedenfalls nicht, tschüß Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.