Forum: Mikrocontroller und Digitale Elektronik MiniModul/MikroVision von KEIL etc.


von Mike Werner (Gast)


Angehängte Dateien:

Lesenswert?

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

von Gerhard Gunzelmann (Gast)


Lesenswert?

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

von T.Stütz (Gast)


Lesenswert?

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!!

von peter dannegger (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Lesenswert?

@T.Stütz

"%16x" kann nicht sein!!

ich würde mal vermuten, das macht mindestens 12 Leerzeichen gefolgt von
maximal 4 Digits.


Peter

von T.Stütz (Gast)


Lesenswert?

@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

von Mike Werner (Gast)


Lesenswert?

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.

von peter dannegger (Gast)


Lesenswert?

"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
Noch kein Account? Hier anmelden.