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.
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
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
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.
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
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
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.
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.
@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
Ä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
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.
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
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
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
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.
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
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.
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
Wir haben früher mal den Siemens C505C verwendet. Bei dem liegt der CAN-Controller auf 0xF700-0xF7FF.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.