MSP430 Pin ansprechen

Gast #341658
Lesenswert?

Hallo,
ich weiß wie ich I/0 Pin ansprechen muss. Allerdings möchte ich gerne
wissen wie ich eine #define ... Anweisung auf einen einzelen Pin eines
Ports schreibe. Hab hier schon mal was gelesen finde es aber nicht
mehr.

Bei Keil und Co scheint das ja so zu funktionieren:
#define DATA P1_2 oder so ähnlich. Ist auch egal ich brauchs für den
MSP430 und IAR-Compiler.

Ich hätte gern z.B:
#define DATA (P1OUT | BIT3) // so gehts aber nicht

Ich hoffe Ihr hab verstanden was ich gerne möchte und kennt die Lösung.


Das ganze brauch ich um einen vorhandenen Code möglichst ohne viel
arbeit auf den MSP430 um zu setzen.

Danke für Eure Hilfe
Gruß Klausi
Gast #341660
Lesenswert?

Danke, aber für den vorhandenen Code geht das immer noch nicht:

#define DATA (P1OUT |= BIT3)
...
char s_write_byte(unsigned char value)
{
    ...
    for (i=0x80;i>0;i/=2) //shift bit for masking
        {
        ...
          DATA=1; //Wert maskieren mit i , auf Bus schreiben
          else DATA=0;
          SCK=1; //clk for SENSI-BUS
          _ NOP();_NOP();_NOP(); //Pulsweite ca. 5 us
          SCK=0;
        }
        DATA=1; //release DATA-line
        SCK=1; //clk #9 for ack
        ...
        SCK=0;
        ...
        }

Error[Pe137]: expression must be a modifiable lvalue  ???
Gast #341662
Lesenswert?

Hi Jörg,

ich hab mir das auch schon fast so gedacht, aber der Beispiel Code von
Sensirion zum ansprechen des Feuchtesensors SHTx machts doch auch so?
Deshalb, faul wie ich bin, wollte ich mir nicht viel Arbeit machen und
nur die #define Anweisungen anpassen und evtl. die Timings.

So siehts beim 8051-Keil-Code aus, mit dem bereits gezeigten
Quellcode:
#define DATA P1_1
#define SCK P1_0

Schade, dann wirds doch etwas mühseliger das ganze auf den MSP430 um zu
setzen.

Gruß Klausi
Gast #341664
Lesenswert?

Falsche Includes?
Der IAR benutzt für C (io430...) und Assembler (msp430...)
unterschiedliche.
PxOUT für byteweisen Zugriff und PxOUT_bit für den bitweisen Zugriff.
Damit funktioniert dann auch #define DATA P1OUT_bit.P1OUT_0 und DATA =
1
Gast #341665
Lesenswert?

@ Arc

Danke, das funktioniert. Zumindest meckert der IAR nicht mehr.
Wußte gar nicht das es einen Unterschied gibt bei
#include <msp430x14x.h> zwischen C und Assembler. Hat bisher immer so
gekappt. Mal sehen ob der Rest jetzt läuft.

Leider kennt er jetzt _NOP() nicht mehr. Dafür kann ich aber ne eigene
wait(x) Funktion einsetzen. Also fast egal.
Gibt es noch andere Überraschungen, Vorteile wenn ich statt
msp430x14x.h die #include <io430x14x.h>  verwende?
Beide zusammen wollte er nicht ;-) da gibts wohl einige
Überschneidungen.

Danke an alle.
Gruß Klausi
Gast #341666
Lesenswert?

Das _NOP() ist in "in430.h" definiert, was in den msp430xxx-Headern
automatisch eingebunden wird. Nachteil: Bei Inline-Assembler kann man
nicht mehr auf die Peripherie zugreifen, ohne die Includes anzupassen.
Was IAR auch selbst hätte lösen können, wenn sie statt

__no_init volatile union
{
  unsigned char P1OUT;  /* Port 1 Output */

  struct
  {
    ...
  } P1OUT_bit;
} @ 0x0021;

z.B.

#ifdef _IAR_SYSTEMS_ICC_
__no_init volatile union
  struct
  {
    ...
  } P1OUT_bit;
#endif

#define P1OUT_ (0x0021)
READ_ONLY DEFC( P1OUT, P1OUT_)

geschrieben hätten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren