Forum: Compiler & IDEs Portrichtung beim 8051


von Nils W. (rincewind23)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe ein kleines Problem das für euch vielleicht ganz einfach zu 
lösen ist. Die Frage dreht sich um den angehängten C Code, ich 
beschreibe als Erklärung schnell das gesamte Projekt.

Die Situation ist diese:
Ich  versuche gerade, einen 8051 IPCore auf einem Actel Fusion FS600 
FPGA zum laufen zu bekommen. Der IPCore wird von Actel kostenlos 
angeboten und implementiert einen Standard 8051. Als Komponenten werden 
neben dem 8051 noch ein ROM mit 4kb und ein 128Byte RAM instanziert.

Das Design sieht so aus: Ein Zähler zählt mit einem Takt von 1Hz von 0 
bis 230, die Zahl wird auf einem LCD Display ausgegeben. Parallel dazu 
wird der 8051 mit ROM und RAM instanziert und soll mit einem einfachen C 
Programm (siehe Anhang) ebenfalls zählen (1..128). Der 8051 ist mit 
10MHz getaktet. Wird ein Knopf auf dem Demoboard gedrückt, zeigt das LCD 
den Zähler des 8051, wird kein Knopf gedrückt wird der VHDL Zähler 
angezeigt.

Der VHDL Zähler funktioniert, ich kann das ganze Design synthetisieren 
und es gibt keine Warnungen oder Fehlermeldungen. Die Instanzierung des 
8051 habe ich aus einem Beispiel von Actel übernommen und setze mal 
voraus dass dieses richtig ist.

Der C Zähler funktioniert leider nicht, es wird eine konstante 255 
ausgegeben. Der Blinker der zusätzlich im C Programm steckt sollte 
eigentlich mit ca. 1 Hz eine LED toggeln, diese LED ist aber auch 
konstant an.

Das ganze Design ist nicht besonders einfach zu simulieren, da der 8051 
nur als kompilierte Netzliste vorliegt und ich noch etwas mit Modelsim 
und den zugehörigen Bibliotheken kämpfe, ich versuche nun das Problem im 
Vorfeld etwas einzugrenzen.

Ich habe leider noch nie einen "originalen" 8051 programmiert, nur 
Abkömmlinge wie die AVRs. Z.B. bei dem ATMega16 muss ich die 
Portregister vorher als Ein- oder Ausgang konfigurieren, eine solche 
Möglichkeit habe ich in der Registerbeschreibung des 8051 nicht 
gefunden. Vermutlich muss das aber irgendwie passieren, und bei meiner 
einfachen Zuweisung auf die Portregister liegt das Problem.

Kann mir jemand sagen ob mein (einfaches) C Programm prinzipiell 
funktionieren müsste? Ich habe noch ein paar andere Stellen im Verdacht 
wie zum Beispiel mein ROM und die entsprechende Taktung. Wenn ich das C 
Programm schonmal ausschließen könnte wäre das ein erster Fortschritt.

Als Compiler habe ich einen älteren Keil C51 Compiler und den SDCC in 
der neuesten Version zur Verfügung, angeblich unterscheiden die sich 
aber nur in der Größe des erzeugten Codes und haben sonst keine größeren 
Schwachstellen.

Vielen Dank und viele Grüße,
Nils

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du meinst, im GCC-Forum findest du dafür die richtigen Leute?

von Peter D. (peda)


Lesenswert?

Ich würd mal bei allen long-Konstanten ein L dahinter schreiben.

Delayloops um 1Hz zu erzeugen, ist außerdem der falsche Ansatz, dazu 
sind ja die Timer da.

Mit Delayloops erreichst Du nur rein zufällige Zeiten, abhängig vom 
Core-Typ, Optimierungslevel, Memory-Model usw.


Peter

P.S.:
Da hat mich zwar einer für blöd erklärt, aber manche Cores können nicht 
mit der vollen FPGA-Frequenz laufen, geht einfach mal auf 10MHz runter.

von M. B. (m_beffa)


Lesenswert?

Also beim 8051 musst du tatsächlich nicht vorher definieren ob du einen 
Port nun als Eingang oder Ausgang benutzen willst!

Sieh dir mal das Datenblatt z.b. vom SAB80C535 an.. dort siehst du wie 
die Ausgangsschaltung eines I/O-Pins ist

von Nils W. (rincewind23)


Lesenswert?

@Jörg Wunsch: Da mein Problem sich um den C-Code dreht dachte ich, dass 
ich hier richtig wäre. Welches Forum wäre deiner Meinung nach besser 
geeignet gewesen? Ich bin hier zwar schon eine Weile registriert und 
lese relativ regelmäßig mit, habe aber noch nicht so oft gepostet und 
war nicht besonders sicher wo das hier hingehört.

@Peter Dannegger: Das mit den Long Konstanten werde ich mal 
ausprobieren, danke für den Tip.
Dass das mit dem Zähler keine genaue Lösung wird war mir schon klar, ich 
wollte nur einen "schnellen" sichtbaren Beweis dafür haben, dass der 
Core funktioniert. Bei der späteren "echten" Anwendung verwende ich dann 
die Timer. Der Core ist schon mit 10MHz getaktet. Das FPGA läuft mit 
einem internen 100MHz RCO, geteilt wird der Takt über eine interne PLL.

@Marco Beffa: Ich werde mir das Datenblatt gleich mal ansehen. Wenn ich 
die Richtung nicht konfigurieren muss, heisst das aber leider dass ich 
meinen Fehler an anderer Stelle suchen muss. Das wäre ja auch zu leicht 
gewesen :)

Vielen Dank euch allen, ich werde mal berichten wie es am Ende 
ausgegangen ist.
Nils

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.