8051F120 Blinklicht

Gast #1831969
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).
Gast #1832101
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
Gast #1832363
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...
Gast #1832379
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
Gast #1832410
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!
#1832497
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
Gast #1832520
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....
Gast #1832532
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
Gast #1832554
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...
Gast #1832566
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.
Gast #1833039
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
Gast #1833924
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...
Gast #1834940
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren