Forum: Mikrocontroller und Digitale Elektronik MSP430 Pin ansprechen


von Klausi (Gast)


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

von Jörg S. (Gast)


Lesenswert?

#define DATA (P1OUT |= BIT3) // so gehts

Und rücksetzen:
P1OUT &= ~BIT3

von Klausi (Gast)


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

von Jörg S. (Gast)


Lesenswert?

DATA=1 ??
Einem #define kannst du nichts zuweisen. Darum geht es je gerade :)

DATA_HIGH (P1OUT |= BIT3) // Setzt Pin 1.3 auf High
DATA_LOW (P1OUT &= ~BIT3) // Setzt Pin 1.3 auf Low

von Klausi (Gast)


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

von Jörg S. (Gast)


Lesenswert?

Warum mühselig? Alles was jetzt "DATA=1" ist wird jetzt z.B. einfach
"DATA_HIGH".
Einfach die suchen und ersetzen Funktion benutzen und fertig.

von arc (Gast)


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

von Klausi (Gast)


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

von arc (Gast)


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.

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.