Forum: Mikrocontroller und Digitale Elektronik MSP430 Port abfragen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael S. (newby101)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin Leute,

ich bin noch neu im Geschäft und habe folgendes Problem bei der 
Programmierung eines MC.
Der u.a. code ruft bei jeder abfallenden Flanke an Port 1.1 eine ISR 
auf. In dieser ISR wird dann eine LED getoggelt und das IFG von Port 1 
gelöscht, soweit sogut.

Jetzt möchte ich einen Schritt wieter gehen und an Port 1.2 bei 
abfallender Flanke an Port 1.1. eine Folge von z.B. 8 Bits einlesen und 
prüfen ob diese Hi oder Low sind und diese später mit bcd 
Adressschaltern die an Port 2 angeschlossen werden vergleichen.Jedesmal 
wenn also eine abfallende Flanke kommt, soll Port 1.2 eingelesen 
werden.Ich habe mir gedacht, dass müsste doch am besten mit einer If 
Abfrage gehen.

Frage 1: schreibt bzw. schiebt man die Hi/Low Werte des Port 1.2 am 
besten in ein Array und vergleicht dann anschliessend mit den bcd 
Schaltern an Port 2, oder würdet Ihr jedes Bit immer direkt nach dem 
einlesen vergleichen, was ist intelligenter?

Frage 2: Wie müsste der Code aussehen (Meine Anfänge, siehe Anhang).

Danke vorab

von Clemens L. (c_l)


Bewertung
0 lesenswert
nicht lesenswert
Michael S. schrieb:
> schreibt bzw. schiebt man die Hi/Low Werte des Port 1.2 am
> besten in ein Array und vergleicht dann anschliessend mit den bcd
> Schaltern an Port 2, oder würdet Ihr jedes Bit immer direkt nach dem
> einlesen vergleichen, was ist intelligenter?

8 Bits passen in ein Byte:
1
unsigned int bit;
2
uint8_t value;
3
4
init()
5
{
6
    value = 0;
7
    bit = 0;
8
}
9
10
interrupt()
11
{
12
    if (P1IN & BIT2)
13
        value |= 1 << bit;
14
    bit++;
15
16
    if (bit == 8) {
17
        // ...
18
        init();
19
    }
20
}

von Michael S. (newby101)


Bewertung
0 lesenswert
nicht lesenswert
Hallo und danke erstmal.
Bin schon ein wenig schlauer, Prog. funktioniert aber noch nicht ganz.

uint8_t kennt der msp430 anscheinend nicht, welchen Typ kann ich beim 
msp nehmen? Ich habe es mit unsigned char versucht, scheint aber nicht 
zu funktionieren. Das Problem ist, dass der MC nicht in die If Abfrage 
springt.

Zum testen wollte ich bei jedem Interrupt Aufruf, also bei jeder 
abfallenden Flanke, die ich per Schalter simuliere den Wert der Variable 
"bit" in die Variable "value" schieben. Sofern die Variable "bit" zwei 
Werte erreicht hat (ob 0/1 ist zunächst mal egal), müsste die LED an 
Port1.0 doch leuchten, oder? Das macht sie aber nicht.

volatile unsigned int bit;
volatile unsigned char value;

int main(void)
{
    value = 0;
    bit = 0;
    if (bit==2) P1OUT |= 0x01; // P1.0 ansteuern
}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)

{
    value |= 1 << bit;
    bit++;
    P1IFG &= ~0x02; // Interrupt Flag Byteport 1 löschen
    main(); // Aufruf der main

: Bearbeitet durch User
von Clemens L. (c_l)


Bewertung
0 lesenswert
nicht lesenswert
Michael S. schrieb:
> uint8_t kennt der msp430 anscheinend nicht

#include <stdint.h>

Michael S. schrieb:
> Das Problem ist, dass der MC nicht in die If Abfrage springt.
>
>     bit = 0;
>     if (bit==2) ...

Weil "bit" an dieser Stelle immer Null ist.

>     main(); // Aufruf der main

Die Variable "bit" muss genau dann auf Null zurückgesetzt werden, 
nachdem acht Bits gelesen und behandelt wurden, nicht vorher.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Aus der Interruptroutine heraus willst Du main() aufrufen?

Du bist da auf einem sehr falschen Weg.

von Michael S. (newby101)


Bewertung
0 lesenswert
nicht lesenswert
Danke Euch, habe das jetzt hinbekommen.

Folgende weitere Frage:
Ich lese an dem Port des MSP430 jetzt also eine Bitfolge ein sobald ich 
in die Interruptroutine springe (bei einer fallenden Flanke). Den Wert 0 
bzw. 1 den ich einlese schreibe ich jedesmal in eine Variable vom Typ 
Char und Shifte dann nach links bis ich acht Bit zusammen habe. Diese 
acht Bit möchte ich jetzt mit zwei Codierschaltern vergleichen, die an 
einen anderen Port anliegen.

1. Ist die Variable vom Typ Char dafür geeignet?
2. Muss ich die eingelesene binäre Folge z.B. 11001110 in Hex umwandeln 
damit ich diese mit den Schaltern vergleichen kann?
Wenn ja, gibt es für das Wandeln einen Befehl. Wenn nein, welche 
Möglichkeit gibt es sonst?

Danke Euch vorab.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Michael S. schrieb:
> 1. Ist die Variable vom Typ Char dafür geeignet?

Etwas besser wäre unsigned char, noch besser uint8_t.

char ist, wie der Namen schon suggeriert, für Zeichen gedacht.

> 2. Muss ich die eingelesene binäre Folge z.B. 11001110 in Hex umwandeln
> damit ich diese mit den Schaltern vergleichen kann?

Nein. Du solltest Dir nochmal genau ansehen, was Zahlensysteme sind und 
wo sie eine Bedeutung haben.

In C ist folgendes absolut gleichwertig:

uint8_t a;

a = 127;
a = 0x7f;
a = 0b01111111;

von Felix A. (davinciclaude)


Bewertung
0 lesenswert
nicht lesenswert
Um uint8_t zu verwenden, musst du noch

#include <stdint.h>

einbinden. Macht aber nichts anderes, als dir einen unsigned char als 
uint8_t zu verkleiden.

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]
  • [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.