www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051F120 Blinklicht


Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich versuche mich an einem ersten Programm mit meinen vor kurzem in 
Betrieb genommenen 8051F120. Doch irgendwie schaffe ich es nicht, einen 
beliebigen Portpin auf low zu ziehen, um so eine LED zum leuchten zu 
bringen.
#include <c8051F120.h>

void main()
{
   PCA0MD &= ~0x40; //Watchdog timer dissable
   XBR2 = 0x40; //Crossbar and weak pull-up enable
   OSCICN = 0x83; //full speed

   P0 = 0;

   while(1);
}

Also leider wird keiner der Pins von P0 auf Low gezogen. Auch im Debug 
Modus von Keil unter Preipherals->Port0 wird 0xFF anstelle von 0x00 
angezeigt. Ich bin mir ziemlich sicher, dass ich irgend etwas übersehen 
habe (irgend ein Register falsch oder gar nicht eingestellt). Hat jemand 
von euch vl. ein kleines funktionierendes Testprogramm für den F120 oder 
weis jemand, was ich übersehen habe?
Beim F330 funktioniert obiger Code einwandfrei (statt XBR2 wird hier 
XBR1 verwendet).

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> weis jemand, was ich übersehen habe? Beim F330 funktioniert obiger Code
> einwandfrei
Klar, ist ja auch für den F330... Würdest du anstatt die Programme zu 
kopieren die Programme migrieren, wäre dir dann aufgefallen, dass der 
F120 einen eigenen Watchdog besitzt... Also nie kopieren, stattdessen 
das was gemacht wird entsprechend auf dem anderen Controller umsetzen.

Und gleich noch ein Tipp: Falls an deinem Port 0 nur eine LED hängt, 
gewöhn dir gleich an, dass du auch nur den betreffenden Portpin 
beeinflusst und nicht den ganzen Port. Das machts für später 
einfacher...

Ralf

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf schrieb:
> Und gleich noch ein Tipp: Falls an deinem Port 0 nur eine LED hängt,
> gewöhn dir gleich an, dass du auch nur den betreffenden Portpin
> beeinflusst und nicht den ganzen Port. Das machts für später
> einfacher...

Das ist schon klar, das habe ich deswegen gemacht, weil ja ein Portpin 
kaputt sein könnte. Darum habe ich jetzt zum testen alle 8 Portpins 
versucht auf Low zu ziehen.

Ralf schrieb:
> Würdest du anstatt die Programme zu
> kopieren die Programme migrieren, wäre dir dann aufgefallen, dass der
> F120 einen eigenen Watchdog besitzt... Also nie kopieren, stattdessen
> das was gemacht wird entsprechend auf dem anderen Controller umsetzen.

Ja aber auch wenn diese Zeile auskommentiert ist funktioniert es 
nicht...

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ja aber auch wenn diese Zeile auskommentiert ist funktioniert es
> nicht...
SEUFZ LIES DAS DATENBLATT!!! Dann würdest du merken dass der WATCHDOG 
NACH EINEM RESET AKTIV IST :)

Dreh's doch mal rum: Warum deaktiviert die Software für den F330 wohl 
den Watchdog? Richtig, da die Software ihn vorher nicht aktiviert hat, 
heisst das, dass er nach einem Reset aktiv ist. Das wiederum heisst, 
entweder deaktivieren oder richtig füttern, damit er keinen Reset 
auslöst... Du musst schon mitdenken =)

Ralf

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auszug aus dem Datenblatt:
>13.7.2. Disable WDT
>Writing 0xDE followed by 0xAD to the WDTCN register disables the WDT.
WDTCN=0xde;    //Disable 
WDTCN=0xad;    //Watchdog

Skriptkiddy

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <c8051F120.h>

void main()
{
   //Watchdog timer dissable
   EA = 0;
   WDTCN = 0x0DE;
   WDTCN = 0x0AD;
   EA = 1;

   XBR2 = 0x40; //Crossbar and weak pull-up enable
   OSCICN = 0x83; //full speed

   P0 = 0;

   while(1);
}

Ich habe nun den Watchdogtimer wie im Datenblatt beschrieben 
deaktiviert. Funktioniert trotzdem nicht. Ich bin mir ziemlich sicher, 
dass ich irgend etwas beim den Port I/0 Registern vergessen habe 
einzustellen. Aber laut Datenblatt sollte Port 0 nach dem Reset 
automatisch of Open Collector und als Ausgangspin aktiviert sein. 
Crossbar wurde auch enabled. Hmmm... irgend eine Idee was ich vergessen 
habe?

Danke für deine Hilfe!

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter S. schrieb:
> Hmmm... irgend eine Idee was ich vergessen
> habe?

Ja. Du hast vergessen, dass die SFR aufgrund ihrer hohen Anzahl in Pages 
angeordnet sind, um für Compiler und Assembler die Kompatibilität zum 
Standard-8051 zu wahren. Beispielsweise haben XBR2, XBR1, XBR0 die selbe 
8Bit-Adresse, liegen aber in unterschiedlichen Pages. Das heißt, wenn du 
nicht auf die Richtige Page umstellst, schreibst oder liest du nicht das 
gewollte Register. Mit SFRPAGE kann man die jeweilige Page auswählen. 
Schau mal ins Datenblatt, da siehst du welches SFR in welcher Page 
liegt.
http://www.silabs.com/pages/DownloadDoc.aspx?FILEU...

Gruß
Skriptkiddy

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <c8051F120.h>

void main()
{
   //Watchdog timer dissable
   EA = 0;
   WDTCN = 0x0DE;
   WDTCN = 0x0AD;
   EA = 1;

   SFRPAGE = 0x0F;
   XBR2 = 0x40; //Crossbar and weak pull-up enable
   OSCICN = 0x83; //full speed

   P0 = 0;

   while(1);
}

Danke für den Tipp!
XBR2 und OSCICN liegen in Page 0x0F. P0 ist in allen Pages verfügbar. 
Habe das nun umgestellt, funktioniert aber trotzdem nicht....

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skript Kiddy schrieb:
> Beispielsweise haben XBR2, XBR1, XBR0 die selbe
> 8Bit-Adresse

Das ist natürlich Blödsinn. Die haben die Selbe Page (F). Hab nicht 
richtig gelesen. Aber die Page musst du trotzdem auf F stellen. Sonst 
schreibst du nicht XBR2.

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja, WDTCN kann auch von allen Pages beschrieben werden.

Skript Kiddy schrieb:
> Aber die Page musst du trotzdem auf F stellen. Sonst
> schreibst du nicht XBR2.

Siehe letzter Post von mir.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und nein, der Port steht nicht auf Ausgang nach einem Reset. Das wär ja 
fatal.

1. Wie sieht deine Entwicklungsumgebung aus, kannst du debuggen? Grüne 
LED am Debugadapter an?

2. Wie sehen deine Projekteinstellungen aus, hast du die internen 8kB 
RAM scharfgeschalten? In dem Fall kann es sein, dass die STARTUP.A51 
erstmal versucht das RAM zu löschen, und das wiederum kann so lange 
dauern, dass der Watchdog zuschlägt.

Ralf

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf schrieb:
> Und nein, der Port steht nicht auf Ausgang nach einem Reset. Das wär ja
> fatal.

Nein da ja die Crossbar nach einem Reset deaktiviert ist. Sobald die 
Crossbar aktiviert wird ist laut Datenblatt alles für einen Digitalen 
Ausgabepin in Open Collector eingestellt.

Ralf schrieb:
> Wie sieht deine Entwicklungsumgebung aus, kannst du debuggen? Grüne
> LED am Debugadapter an?

Meine Entwicklungsumgebung ist Keil µVision 4. Zusätzlich ist der Debug 
Adapter Treiber von Silabs installiert. Debuggen funktioniert. Jedoch 
wei weiter oben schon beschrieben, wird wenn ich mir die Portzustände 
anzeigen lasse obwohl P0 = 0x00; ausgeführt wurde Port0 = 0xFF 
angezeigt.

Ok moment ich glaube das es jetzt funktioniert. Ich weis aber noch nicht 
warum auf einmal...

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok also es funktioniert nur, wenn ich das Programm über Start/Stop Debug 
Session hineinschreibe. Es funktioniert dann aber auch wenn ich den µC 
resette. Über Download Flash funktioniert es komischerweise nicht, 
obwhol das eigentlich gleich sein sollte.

Wahrscheinlich ein Fehler in den Projekteinstellungen.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter S. schrieb:
> Über Download Flash funktioniert es komischerweise nicht,
> obwhol das eigentlich gleich sein sollte.

Funktioniert es, wenn du nach dem Downloaden Reset drückst?

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Datenblatt alles für einen Digitalen Ausgabepin...
Ich sag's nochmal: KEIN CONTROLLER HAT NACH EINEM RESET EINEN PORT AUF 
AUSGANG KONFIGURIERT, EGAL OB PUSH_PULL ODER OPEN_DRAIN.
Auf welcher Seite des DB hast du das gelesen? Haben die einen Fehler im 
DB?

> Über Download Flash funktioniert es komischerweise nicht, obwhol das
> eigentlich gleich sein sollte.
Aber nur wenn du "Power device after programming" eingestellt hast :)

Ralf

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf schrieb:
> Ich sag's nochmal: KEIN CONTROLLER HAT NACH EINEM RESET EINEN PORT AUF
> AUSGANG KONFIGURIERT, EGAL OB PUSH_PULL ODER OPEN_DRAIN.
> Auf welcher Seite des DB hast du das gelesen? Haben die einen Fehler im
> DB?

Ist er ja im Prinzip nicht solange die Crossbar deaktiviert ist. Mit 
deaktivierter Crossbar sind alle Ports abgekoppelt. Aber nach 
Aktivierung der Crossbar ist der Port als Ausgabeport eingestellt. 
(Siehe Seite 239, 18.1.2 Configuring the Output Modes of the Port Pins).

Ralf schrieb:
> Aber nur wenn du "Power device after programming" eingestellt hast :)

Hmmm... ich finde diese Einstellung nirgendst. Wo genau befindet sich 
diese bzw. bist du sicher das es diese im µVision4 auch noch gibt? Habe 
auch die Hilfe von µVision zum Suchen dieser Einstellungg benutzt, kein 
Treffer...

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mit deaktivierter Crossbar sind alle Ports abgekoppelt.
Nur die Ausgangstreiber. Gelesen werden kann auch bei deaktivierter 
Crossbar. Ausnahme davon sind für gewöhnlich die als Analogfunktion 
konfigurierten Pins, da liefert die Portabfrage immer Null (evtl. aber 
nicht bei allen MCUs, die Aussage bezieht sich konkret auf das Wissen 
bzgl. der F7xx/F92x/F93x).

> Aber nach Aktivierung der Crossbar ist der Port als Ausgabeport
> eingestellt. (Siehe Seite 239, 18.1.2 Configuring the Output Modes of the
> Port Pins).
Ich vermute du meinst diesen Satz:
"All Port pins default to Open-Drain output."
Okay, dann müssen wir das mal klarstellen, denn wir hatten beide recht. 
Du bist dem schlecht formulierten Satz aufgesessen, und ich hatte recht, 
dass der Pin kein Ausgang ist.
Open-Drain-Output bedeutet, dass der Port auf Eingang gestellt ist, wenn 
im Portregister eine 1 steht. Und das ist der Fall nach einem Reset. 
Also handelt es sich entgegen der Beschreibung nach einem Reset um einen 
Eingang (wie seit zigtausend Jahren schon bei allen 8051ern und auch 
anderen MCUs).
Die Datenblätter zu den "neueren" SiLabs-Controllern beschreiben das 
wesentlich besser, aber Hauptsache, wir sind wieder auf Stand :)

> Wo genau befindet sich diese bzw. bist du sicher das es diese im
> µVision4 auch noch gibt? Habe auch die Hilfe von µVision zum Suchen
> dieser Einstellungg benutzt, kein Treffer...
µV3 und µV4 benutzen den Debugtreiber. Dieser schaltet die 
Versorgungsspannung zwar ein, aber µV lässt den Controller im Debugmodus 
nicht loslaufen, sondern setzt entweder einen Breakpoint bei Adresse 
0x0000 oder läuft bis zur main-Funktion und stoppt dann. Starten kannst 
du in dem Fall nur durch "RUN".
Wenn du es so haben willst, dass das Programm nach einem Download direkt 
losläuft dann darfst du erstens den Download nicht über den Simulator 
machen und musst zweitens für den Programmdownload nicht den 
SiLabs-Treiber aus dem Auswahldialog wählen, sondern manuell die 
Kommandozeilenversion des Flashprogrammers (der hat die von mir erwähnte 
Funktion zumindest in der GUI-Variante) ansprechen. Ein anderer Weg 
direkt aus µV raus zu flashen und gleich loslaufen zu lassen fällt mir 
grad nicht ein.

Ralf

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok verstehe! Vielen Dank nochmal für eure Hilfe!

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.