www.mikrocontroller.net

Forum: Compiler & IDEs Portrichtung beim 8051


Autor: Nils W. (rincewind23)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M. Beffa (m_beffa)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nils W. (rincewind23)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.