Hallo, ich bin noch recht neu in der Materie: auf meinem Targetboard sind eine rote LED und eine grüne LED. Ich nehme jetzt an das die Rote mit 0x01 angesprochen wird und dieser Wert dem P1.0 entspricht: P1DIR |= 0x01; // Set P1.0 to output direction So steht es jedenfalls im Quellcode. Welchen Wert muss ich eingeben, um die grüne LED anzusprechen? Und wo gibt es eine Tabelle, wo ich die zugeordneten Werte ablesen kann, oder nach welchem Algorithmus folgen diese Werte? Ich möchte mich schon hier für Antworten recht herzlich bedanken.
Hm, versetz dich mal in unsere Lage. Wie sollen wir dir jetzt helfen? Glaskugel schauen? Auf eine Eingebung warten? Du musst uns schon mindestens sagen, welches Board das ist, dann könnten wir den Schaltplan suchen, wenn du schon zu faul bist, den selbst anzuschauen.
Hallo, die Ports werden immer byteweise angesprochen, das bedeutet, immer 8 Pins auf ein Mal! Ein Port heißt beim MSP430 immer Pa.b z.B. P1.2 für Port 1, Pin 2. Du kannst z.B. Bit 2 nur setzen, wenn du den ganzen Port neu setzt. Nachdem du ja nur einen Pin der 8 setzen willst, musst du die anderen wieder so setzen, wie sie vorher waren, also die Werigkeit des Pins zu dem aktuellen Stand dazuodern. Ausführlicher geschrieben passiert da Folgendes:
1 | P1OUT = P1OUT | 0x04; //setze Port1.2 auf high |
Der Port ist binär codiert, jedes Bit hat eine Wertigkeit: Bit0 0x01 Bit1 0x02 Bit2 0x04 Bit3 0x08 Bit4 0x10 Bit5 0x20 Bit6 0x40 Bit7 0x80 Rücksetzen (clearen) des Bits erfolgt dann logischerweise mit einer Undierung mit der invertierten Werigkeit des Pins:
1 | P1OUT = P1OUT & ~0x04; //setze Port1.2 auf low |
Wichtig ist, dass der Pin überhaupt als Ausgang konfiguriert ist, sonst kommt kein Strom raus, das macht man mit dem data direction register:
1 | P1DIR = P1DIR | 0x01; // Set P1.0 to output direction |
Rücksetzen geht entsprechend mit UND und der invertierten Pinwertigkeit. Ich nehme an, P1.0 ist dein LED-Pin, dann konfigurierst du Port1.0 als Ausgang
1 | P1DIR = P1DIR | 0x01; // Set P1.0 to output direction |
und setzt dann den Pegel entweder low:
1 | P1OUT = P1OUT & ~0x01; //setze Port1.0 auf low |
oder high:
1 | P1OUT = P1OUT | 0x01; //setze Port1.0 auf high |
Welches KOmmando dabei die LED ein und welches sie ausschaltet, hängt dann davon ab, ob die LED leuchtet, wenn am Pin Vcc anliegt oder ob sie leuchtet, wenn Gnd anliegt, das wiederum hängt nur davon ab, ob die LED vom Pin aus gegen Plus oder Minus deiner Schaltung geschaltet ist, wenn du dir unsicher bist, kannst ja beide Versionen ausprobieren. Aber Vorsicht, du musst den Prozessor auf jeden Fall sinnvoll beschäftigen, sonst siehst du die LED eventuell garnicht aufleuchten, weil er kurz nach dem Setzen des Ports abstürzt. Probier also mal irgend so was:
1 | int main{void} |
2 | {
|
3 | P1DIR = P1DIR | 0x01; //Port1.0 ist jetzt Ausgang |
4 | P1OUT = P1OUT & ~0x01; //setze Port1.0 auf low |
5 | for(;;) {} //warte hier bis in alle Ewigkeit |
6 | return 0; |
7 | }
|
Wenns nicht leuchtet, versuch auf high zu setzen. Wenns dann noch nicht Leuchtet, stimmt wahrscheinlich der Port nicht, also entweder P1OUT ist nicht 1, sondern z.B. P2OUT, oder 0x01 ist falsch, weil die LED nicht an Bit0 des Ports hängt, sondern z.B. an Bit3, dann muss es 0x08 heißen. Ich hoffe, das war genug Starthilfe. Viele Grüße, Peter
Hallo ! Ein Beitrag nach meinem Geschmack ... Einfache Zusammenhänge gut erklärt :D Natürlich schreibe ich hier nicht nur um zu loben, sondern auch, weil ich eine Frage stellen möchte: Konkret arbeite ich seit 1 Woche mit dem MSP4302370 und einem ADC von TI. Arbeiten ist etwas zu viel gesagt, da die Hardware noch nicht vorhanden ist. Aber das ist ja kein Grund nicht schon mal das nötige Programm zu schreiben ;) Der ADC (ADS7844) mochte ein 8 Bit Datenwort, damit er weiß, was zu tun ist. Da beide UART-Schnitstellen in diesem Projekt bereits verplant sind, möchte ich die Kommunikation über normal I/O-Pins bewerkstelligen. Mit den Infos aus diesem Beitrag und dem Datenblatt, hab ich ein Code geschrieben der dem ADC das Kontrollwort sendet. Jedoch mit dem Code fürs Empfangen hab ich noch Probleme. Ich würde gerne eine Schleife verwenden, die die 1 bzw 0 die am Eingangspin des MSP430 liegt in eine Variable scheibt. Der Schleifenzähler soll hierbei die Nummer des Bit in meiner Variable sein ... (ich hoffe das kann man sich so vorstellen) Wie kann ich beim MSP430 ein einzelnes Bit mit Hilfe einer Schleife beschreiben?
1 | #define ADC_SCL_HIGH (P4OUT |= BIT3) // Pin 4.3 auf High
|
2 | #define ADC_SCL_LOW (P4OUT &= ~BIT3) // Pin 4.3 auf Low
|
3 | #define ADC_SDOUT_HIGH (P4IN |= BIT6) // Pin 4.6 Eingang
|
4 | |
5 | uint16_t Wert_ADC=0x00; |
6 | /*Der ADC hat 12bit, ich lasse die ersten 4 MSB frei
|
7 | damit ich die 16bit Variable nacher als "ganz normale Zahl" verwenden kann.*/
|
8 | |
9 | for (uint8_t i=12;i=0;i--) |
10 | {
|
11 | ADC_SCL_LOW; |
12 | Wait(); |
13 | ADC_SCL_HIGH; |
14 | wait(); |
15 | |
16 | if(ADC_SDOUT_HIGH) //FALSCH? |
17 | Wert_ADC |= (1<<i); //FALSCH? |
18 | }
|
Und noch ne Frage: Wenn ich dieses Konstrukt verwende:
1 | P4OUT |= BIT5; //Port-Pin4.5=1 |
Kann ich auch sowas verwenden?
1 | for(uint8_t i=0;i<6;i++) |
2 | P4OUT |= BIT[i]; //Port-Pin 4.0-4.5 =1 |
Vielen Dank fürs Lesen und für eure Kritiken und Ideen! Gruß Gerümpel
> Da beide UART-Schnitstellen in diesem Projekt bereits verplant sind, > möchte ich die Kommunikation über normal I/O-Pins bewerkstelligen. Der '2370 hat keine zwei UARTs, sondern nur je eine USCI_A und eine USCI_B. Nur die USCI_A kann als UART genutzt werden. USCI_B kann nur als SPI- oder I²C-Schnittstelle genutzt weden. Dein ADC nutzt SPI (auch wenn Deine Signalnamen etwas anderes suggerieren), warum nutzt Du nicht die SPI-Schnittstelle zusammen mit ein paar Portpins, mit denen Du Chipselect-Signale für die angeschlossenen Bausteine zur Verfügung stellst? Ansonsten gibt es ausreichend viele Codebeispiele für Soft-SPI, das Rad musst Du nicht neu erfinden.
Hallo Rufus! Vielen Dank für Deine Antwort. Um etwas konkreter zu werden, am UART soll ein FT232RL hängen um mit dem PC zu kommunizieren. Der 2 "Kanal" soll verwendet werden um die Daten zusätzlich zu sichern. (zB auf einer SD-Karte) Außerdem muss der MSP430 noch mit einem DDS , besagtem ADC und einem Schieberegister kommunizieren. Diese letzten 3 Punkte wollte ich über einzelne Portpins erledigen. ... Rad neu erfinden, stimmt, dazu tendiere ich gelegentlich ;) Meinst Du ich soll alles über USCI_B(SPI) machen und dann noch 3 Chipselect Leitungen? Und noch eine Frage: Ich bin noch nicht besonders sattelfest in "guter C Programmierung" Was meinst Du mit "(auch wenn Deine Signalnamen etwas anderes suggerieren)"? Wie sollte ich meine Variablen benennen? Vielen Dank für deine Mühen Gruß Greümpel
> Meinst Du ich soll alles über USCI_B(SPI) machen und dann noch 3 > Chipselect Leitungen? Ja, wobei das natürlich davon abhängt, wie oft die unterschiedlichen Bausteine angesprochen werden sollen. Wenn die SD-Karte nur dann genutzt werden soll, wenn USB nicht verwendet wird, dann kannst Du auch USCI_A im SPI-Modus nutzen (und musst halt hin- und herschalten zwischen SPI- und UART-Betrieb, was erfordert, daß Du den Anschluss an USB detektierst). > Was meinst Du mit "(auch wenn Deine Signalnamen etwas anderes > suggerieren)"? SCL erinnert an die I²C-Namenskonvention.
Hallo Rufus! Sagte ich schon Danke ? ;D Kannst Du mir noch was zu meinen vorherigen Fragen sagen? 1--------------------- Wenn ich dieses Konstrukt verwende: P4OUT |= BIT5; //Port-Pin4.5=1 Kann ich auch sowas verwenden? for(uint8_t i=0;i<6;i++) P4OUT |= BIT[i]; //Port-Pin 4.0-4.5 =1 1--------------------- 2--------------------- Wie kann ich beim MSP430 ein einzelnes Bit mit Hilfe einer Schleife beschreiben? if(ADC_SDOUT_HIGH) //FALSCH? Wert_ADC |= (1<<i); //FALSCH? 2--------------------- Ich weiß, das sind echte N00b-Fragen, aber es würde das schon gern wissen ... Ich überfliege auch seit Tagen (eher Nächten) alle Beiträge zum MSP430 um an Codeschnipsel zu kommen mit denen man als neuling was anfangen kann. Gibts eigentlich ein buch, das sich mit "'C' für MSP430" beschäftigt ... die meisten die ich bis jetzt gesehen hab, scheine mir nur was für 'C'-Profis zu sein? Liebe Grüße Gerümpel
>Kann ich auch sowas verwenden? >for(uint8_t i=0;i<6;i++) >P4OUT |= BIT[i]; //Port-Pin 4.0-4.5 =1 Macht keinen Sinn und nicht das was du willst :) Du brauchst eher: P4OUT |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5; //Port-Pin 4.0-4.5 =1 >if(ADC_SDOUT_HIGH) //FALSCH? >#define ADC_SDOUT_HIGH (P4IN |= BIT6) // Pin 4.6 Eingang Vermutlich willst du eher: #define ADC_SDOUT_HIGH (P4IN & BIT6) >Wert_ADC |= (1<<i); //FALSCH? Das sieht OK aus. Je nachdem wo bei dir das LSB und MSB ist. >Gibts eigentlich ein buch, das sich mit "'C' für MSP430" beschäftigt ... >die meisten die ich bis jetzt gesehen hab, scheine mir nur was für >'C'-Profis zu sein? Es gibt da dieses eine MSP430 Buch von Franzis. Das ist aber nicht sonderlich. Nur eine bessere Übersetzung des User Guide. Schau dich lieber im Internet um. Z.B. hier: http://www.mathar.com/msp430.html Oder die Beispiele im Anhang.
Hallo ! So langsam seh ich wieder Land ;) Vielen Dank nochmals an alle die mir geholfen haben :D :D Liebe Grüße Gerümpel
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.