Forum: Mikrocontroller und Digitale Elektronik 8051F120 Blinklicht


von Peter S. (Gast)


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.
1
#include <c8051F120.h>
2
3
void main()
4
{
5
   PCA0MD &= ~0x40; //Watchdog timer dissable
6
   XBR2 = 0x40; //Crossbar and weak pull-up enable
7
   OSCICN = 0x83; //full speed
8
9
   P0 = 0;
10
11
   while(1);
12
}

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).

von Ralf (Gast)


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

von Peter S. (Gast)


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

von Ralf (Gast)


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

von Oliver J. (skriptkiddy)


Lesenswert?

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

Skriptkiddy

von Peter S. (Gast)


Lesenswert?

1
#include <c8051F120.h>
2
3
void main()
4
{
5
   //Watchdog timer dissable
6
   EA = 0;
7
   WDTCN = 0x0DE;
8
   WDTCN = 0x0AD;
9
   EA = 1;
10
11
   XBR2 = 0x40; //Crossbar and weak pull-up enable
12
   OSCICN = 0x83; //full speed
13
14
   P0 = 0;
15
16
   while(1);
17
}

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!

von Oliver J. (skriptkiddy)


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?FILEURL=Support%20Documents/TechnicalDocs/C8051F12x-13x.pdf&src=DocumentationWebPart

Gruß
Skriptkiddy

von Peter S. (Gast)


Lesenswert?

1
#include <c8051F120.h>
2
3
void main()
4
{
5
   //Watchdog timer dissable
6
   EA = 0;
7
   WDTCN = 0x0DE;
8
   WDTCN = 0x0AD;
9
   EA = 1;
10
11
   SFRPAGE = 0x0F;
12
   XBR2 = 0x40; //Crossbar and weak pull-up enable
13
   OSCICN = 0x83; //full speed
14
15
   P0 = 0;
16
17
   while(1);
18
}

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

von Oliver J. (skriptkiddy)


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.

von Peter S. (Gast)


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.

von Ralf (Gast)


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

von Peter S. (Gast)


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

von Peter S. (Gast)


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.

von Oliver J. (skriptkiddy)


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?

von Peter S. (Gast)


Lesenswert?

Nein.

von Ralf (Gast)


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

von Peter S. (Gast)


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

von Ralf (Gast)


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

von Peter S. (Gast)


Lesenswert?

Ok verstehe! Vielen Dank nochmal für eure Hilfe!

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.