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
voidmain()
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).
> 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
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...
> 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
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!
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
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....
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.
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.
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
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...
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.
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?
> 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
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...
> 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