MSP430 Port abfragen

OP #4980690
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
Angehängte Dateien:
#4980900
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
}
OP #4986735
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
#4986818
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.
OP #5028082
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.
Persönliche Seite #5028189
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;

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