Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage: MSP430F2274


von Chris (Gast)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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.

von Peter Diener (Gast)


Lesenswert?

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

von Gerümpel (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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.

von Gerümpel (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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.

von Gerümpel (Gast)


Lesenswert?

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

von Jörg S. (joerg-s)


Angehängte Dateien:

Lesenswert?

>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.

von Gerümpel (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.