www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Pin ansprechen


Autor: Klausi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define DATA (P1OUT |= BIT3) // so gehts

Und rücksetzen:
P1OUT &= ~BIT3

Autor: Klausi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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  ???

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klausi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klausi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.