Forum: Mikrocontroller und Digitale Elektronik MSP430 Port abfragen


von Michael S. (newby101)


Angehängte Dateien:

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)


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)


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)


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) Benutzerseite


Lesenswert?

Aus der Interruptroutine heraus willst Du main() aufrufen?

Du bist da auf einem sehr falschen Weg.

von Michael S. (newby101)


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) Benutzerseite


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)


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.

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.