Forum: Mikrocontroller und Digitale Elektronik Probleme beim Start mit 8051 µC


von Mic U. (micyourcontroller)


Lesenswert?

Hi,

ich habe die vergangenen Wochen mit einem Atmel Atmega 8-bit 
Mikrocontroller gearbeitet. Atmel Studio als IDE fand ich sehr 
anwenderfreundlich und verständlich, ich hatte auch keine Probleme 
peripherielle Schnittstellen in Betrieb zu nehmen und die Ports 
anzusteuern. Das Atmel Datenblatt war klasse.

Nun arbeite ich mit einem anderen Kit, werde aus dem Datenblatt aber 
einfach nicht schlau.
Bei Atmega gab es für Ports immer folgende Optionen:

DDxn
PORTxn
PINxn

Bei dem SiLabs C8051F970 Kit:

http://www.silabs.com/Support%20Documents/TechnicalDocs/C8051F97x.pdf

Dabei gibt es folgende Register:

PnMDOUT
PnMDIN
PnSKIP

Und die Crossbar muss man auch betätigen.

Kann mir jemand helfen, einfach nur eine LED anzuschalten?
Verstehe das hier leider überhaupt nicht bzw. funktioniert nichts, wenn 
ich es debugge.

von Andreas R. (andreasr)


Lesenswert?

Der 8051 hat macht keine Unterscheidung zwische Ein-und Ausgang. Die 
Pins verhalten sich quasi wie Open Drain Ausgänge mit Pull-Up. Nur beim 
Wechsel von Low nach High wird kurzzeitig der obere Transistor 
durchgesteuert.
Also LED Low-aktiv ansteuern dann sollte es gehen.

Andreas

von Mic U. (micyourcontroller)


Lesenswert?

hey,

danke für die schnelle Antwort.

Beim Atmel reichen mir diese zwei Funktionen:

void LED_init_off () // All LEDs are "deactivated"

{

  DDRB = 0xFF;

  PORTB = 0xFF;

}

void single_LED_ON(int var) // activate certain LEDs

{

  PORTB &=~(1<<var);

}

In diesem Fall habe ich ja nur einen Befehl beim 8051:

void single_LED_ON_8051(int var) // activate certain LEDs

{

  P1 &=~(1<<var);

}

-> funktioniert aber leider nicht, allerdings blinkt der SILABS Debug 
Adapter nur beim Download, im Betrieb leuchtet er gar nicht; an was 
könnte das liegen?

: Bearbeitet durch User
von Andreas R. (andreasr)


Lesenswert?

Der Code sieht soweit richtig aus. Leider mache ich aktiv nichts mehr 
mit dem 8051. Die aktuellen Debug-Tools kenne ich nicht.
Aufpassen muss man bei obigem Code dass man nicht aus Versehen einen 
Eingang an P1, der auf Low liegt mit umschaltet. Wenn z.B. das Register 
P0.7 auf 1 steht (weil der Port als Eingang benutzt wird) aber am Pin 
Low anliegt, kann es sein dass wird nach der Operation Low auf dem Pin 
ausgegeben (das Ergebnis der Verundung). Stichwort READ-MODIFY-WRITE 
Operation.

von TomA (Gast)


Lesenswert?

Hallo Juli An,

ich würde hier mit 8-Bit Variablen arbeiten, denn die Ports sind nur 
8Bit breit. Die oberen 8-Bit sind nur Ballast, der Compiler führt sie 
mit, obwohl sie nicht gebraucht werden.
Mit dem Keil-Compiler sieht die Ansteuerung der LED, wie im folgenden 
Beispiel aus.

void single_LED_ON_8051(char cVar)
{
  P1 &= ~cVar;    // cVar invertiert verknüpfen
}

Du kannst auch einzelne Bit ansprechen:
  P1_5 = 0;   Port1-Bit5 löschen
  P3_1 = 1;   Port3-Bit1 setzen

Mit den Ports eines normalen 51er, verhält es sich, wie Andreas schon 
gesagt hat. Es wird nur der Low-Pegel aktiv geschaltet, der High-Pegel 
kommt von einem internen Widerstand. Wenn du 0xFF zum Port schreibst, 
kannst du die 8-Bit als Eingang benutzen. Jedes zu "1" gesetzte Bit ist 
hochohmig genug dafür.

Wie das bei deinem Chip ist, weiß ich nicht. Der hat ja Multifunktionale 
Ports. Den mußt du sicher vorher erst als Ein/Ausgabeport 
initialisieren. Die Infos dazu findest du sicher im Datenblatt.

Gruß. Tom

von Lothar (Gast)


Lesenswert?

Andreas Richter schrieb:
> Der 8051 hat macht keine Unterscheidung zwische Ein-und Ausgang

Der Original 8051. Hier geht es aber um einen modernen mit GPIO. Also 
z.B. P1.1:

P1MDOUT = (1<<1);  // Ausgang
P1.1 = 1;          // High

von Wilhelm F. (Gast)


Lesenswert?

Beim SiLabs ist es etwas anders als beim Standard-8051. Auswendig weiß 
ich es gerade nicht, aber es sind noch Dinge wie Crossbar bspw. zu 
konfigurieren.

Die üblichen Beispiele (Blinky & Co.) gibts doch aber auf CD im 
Lieferumfang eines Eval-Boardes oder auf der SiLabs Homepage. Als ich 
vor Jahren selbst ein SiLabs-Board bekam, beschäftigte ich mich nach dem 
Auspacken zu allererst mal mit der CD, um ein Blinkbeispiel zu finden.

Wenn man das dann so weit hat, und das Beispiel läuft, kann man 
beginnen, den Code nach eigenem Geschmack zu modifizieren.

von Peter D. (peda)


Lesenswert?

Juli An schrieb:
> Und die Crossbar muss man auch betätigen.

Ja, diese dämliche Crossbar war auch der Hauptgrund, warum ich die 
Silabs nie eingesetzt hab.
Daß sich mit Aktivieren einer Peripheriefunktion alle nachfolgenden Pins 
mitverschieben, ist schon krank.
Man muß daher schon vor dem Schaltplan genau festlegen, welche 
Peripherie man alles benutzen will.

von Ralf (Gast)


Lesenswert?

@Peda:
> Man muß daher schon vor dem Schaltplan genau festlegen, welche
> Peripherie man alles benutzen will.
Japp - wobei ich das nicht unbedingt als Nachteil sehe. Faktisch ist das 
halt für diejenigen, welche sich eine MCU raussuchen und die jeweils 
verwendete Hardware über die Crossbar rausführen, ein Vorteil (speziell 
dann, wenn die MCU in einem Package sitzt, welches gar nicht genug Pins 
hat, um alle Funktionen gleichzeitig zu nutzen) - des einen Segen ist 
des anderen Fluch...

@Juli An:
1) Vorsicht bei der Portkonfiguration: die SiLabs MCUs haben echte 
Push-Pull-Stufen, d.h. bei einer Fehlkonfiguration kann es rauchen.
2) die SiLabs Software-Beispiele sind eigentlich recht gut für einen 
Einstieg geeignet -> schon probiert?
3) Hast du den Debugger nun korrekt am Laufen?

Ralf

von  Gast (Gast)


Lesenswert?

Ähm,


von Silabs gibt es doch ein Tool mit dem man die Ports einstellen kann, 
und dann spuckt dieses bereits fertigen Sourcecode in C oder ASM aus.

Hier kann man eigentlich alles einstellen.


mfg
Gast

von ./. (Gast)


Lesenswert?

Um mit der Crossbar ein wenig herumzuspielen, kann ich die 
Keil-Entwicklungsumgebung mit ihrem Debugger allerwaermstens empfehlen.
Dazu braucht man natuerlich dann den passenden JTAG-Adapter.
(Die Demoversion mit Codelimit reicht dafuer vollkommen.)

Mit ein paar ansgeschlossenen LEDs oder einem LA hat sich die
Funktionsweise der Crossbar dann schnell erschlossen.

von  Gast (Gast)


Lesenswert?

Ja,


und wenn man das Kit bei Silabs registriert, bekommt man die Keil-Lizenz 
umsonst.

Zum Debuggen reicht der C2-Adapter der im Kit mitgeliefert wird, da 
braucht man keinen extra.


mfg
Gast

von Mic U. (micyourcontroller)


Lesenswert?

Hey,

nach etlichen Versuchen ist es mir nun gelungen, das SiLabs Testprogramm 
blinkey über µVision zum laufen zu bekommen. Nachdem mir zunächst der 
SiLabs Treiber gefehlt hatte, musste ich ihn trotz SiLabs Treiber 
Installation in den richtigen Pfad legen und die Datei in der 
Konfigurationsdatei als neuen Driver vermerken.

Jedoch irritieren mich die Header und die Schreibweise mit der man in 
der IDE von SILABS arbeitet.
Ist es tatsächlich üblich so code zu schreiben? Ich finde das sehr 
verwirrend, da geh ich doch lieber über die klassische Methode oder?

SBIT (LED, P0, 5);                       // LED=1 means ON

Im Header-File finde ich dazu folgende Implementierung

# define SBIT(name, addr, bit)  sbit  name = addr^bit

Soll ich damit arbeiten oder lieber wie beim Atmel
durch bitweises schiften und & / | verknüpfungen?

Mir ist klar, dass dies dasselbe ist.

 P1 &= ~(1<<2);
und
SBIT (LED12, P1, 2);

Was soll ich nehmen? Oder soll ich diese Grundfunktionen/diese Library 
einfach mal selbst programmieren?

Das Blinkey Testprogramm läuft jetzt, dh der Debugger Funktioniert und 
meine Einstellungen in Keil µVision stimmen schon mal. FREU
Danke für eure Hilfe!

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Juli An schrieb:
> Mir ist klar, dass dies dasselbe ist.
>
>  P1 &= ~(1<<2);
> und
> SBIT (LED12, P1, 2);

Nein, ist es nicht.
Mit SBIT definierst Du nur eine Bitvariable.
Erst mit "LED12 = 0;" setzt Du den Pin auf 0.

Ein ähnliches Macro habe ich auch für den AVR-GCC geschrieben:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=835728#835728

von Mic U. (micyourcontroller)


Lesenswert?

Stimmt, du hast recht, jetzt versteh ich es!
Noch eine weitere Frage:

Was hat es mit den ganzen SFR (Special Function Register) Anweisungen 
auf sich; hier ist die Timer Init vom Beispielprogramm von SILabs...

void TIMER2_Init (void)
{
   U8 SFRPAGE_save = SFRPAGE;          // Save the current SFRPAGE
   SFRPAGE = TIMER2_PAGE;

   TMR2CN_TR2 = TMR2CN_TR2__STOP;      // Stop Timer2
   TMR2CN &= ~TMR2CN_T2XCLK__SYSCLK_DIV_12_CAP_CMP; // Use SYSCLK/12 as 
timebase

   CKCON &= ~(CKCON_T2MH__EXTERNAL_CLOCK | // Timer2 clocked based on 
T2XCLK
              CKCON_T2ML__EXTERNAL_CLOCK);

   TMR2RL = -(SYSCLK  12  4);        // Init reload values
   TMR2 = 0xFFFF;                      // Set to reload immediately

   IE_ET2 = 1;                         // Enable Timer2 interrupts
   TMR2CN_TR2 = 1;                     // Start Timer2

   SFRPAGE = SFRPAGE_save;             // Restore saved SFRPAGE
}

Ich versteh das Prinzip dahinter nicht.Die Timer Confi an sich schon, 
die ist klar. Warum ich aber auf die SFR zugreif, versteh ich nicht. 
Timer an sich sind ja eine Special Function, aber die Pages und die 
Organisation ist mir schleierhaft.

von Herbert (Gast)


Lesenswert?

Es hilft nichts: Du musst Dich ein wenig mit der Memory-Map und der 
Bit-Addressierung beschäftigen. Nimm Dir zwei Stunden Zeit und lies 
einfach ein wenig darüber. Das spart Dir später einige Stunden Arbeit.

Hier die Map für den 8052. Die kann als Einstieg dienen:
http://www.8052.com/tutmemor.php

von Peter D. (peda)


Lesenswert?

Juli An schrieb:
> Ich versteh das Prinzip dahinter nicht.

Vermutlich gibt es mehr als 128 SFRs im Silabs und dann muß man sie in 
Pages unterteilen.

Das Register zur Auswahl der Page ist natürlich in jeder Page an der 
gleichen Stelle und die Standardregister (A, B, DPTR, PSW, SP usw.) 
vermutlich auch.

Es gibt auch einige 8051 die zusätzliche SFRs in XDATA legen.

von Ralf (Gast)


Lesenswert?

Peda schrieb:
> Vermutlich gibt es mehr als 128 SFRs im Silabs und dann muß man sie in
> Pages unterteilen.
Korrekt. Wobei es bei den meisten Derivaten wenn überhaupt nur zwei oder 
drei Pages gibt. Ich glaube die F0xx bzw F1xx haben mehr als drei Pages.

> Das Register zur Auswahl der Page ist natürlich in jeder Page an der
> gleichen Stelle und die Standardregister (A, B, DPTR, PSW, SP usw.)
> vermutlich auch.
Ebenfalls korrekt.

> Es gibt auch einige 8051 die zusätzliche SFRs in XDATA legen.
oO Das hör ich zum ersten mal... Welche Controller sind das?

Ralf

von Peter D. (peda)


Lesenswert?

Wir haben früher mal den Siemens C505C verwendet.
Bei dem liegt der CAN-Controller auf 0xF700-0xF7FF.

von Ralf (Gast)


Lesenswert?

> Wir haben früher mal den Siemens C505C verwendet.
> Bei dem liegt der CAN-Controller auf 0xF700-0xF7FF.
Sachen gibt's... Danke für die Info, wieder ein bisschen schlauer.

Ralf

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.