Forum: Mikrocontroller und Digitale Elektronik [MSP430G2553] Pin wird nicht korrekt eingelesen


von A. H. (dernetteeddie1978)


Lesenswert?

Hi Leute,

hab mal zum lernen ein ganz einfaches Programm geschrieben. Ich möchte 
die grüne LED an Pin 1.6 meines Launchpad zum Leuchten bringen indem ich 
Pin 1.3 per Kabel gegen VCC oder GND auf 0 oder 1 setze. Das Problem 
ist, das der Wert des Pins nicht eingelesen wird. Wenn ich das Kabel auf 
Vcc lege wird im Debugger trotzdem eine Null angezeigt. Manchmal ist das 
Spiel auch umgekehrt. Die LED leuchtet nicht obwohl der Pin auf Masse 
liegt. Im Registerfenster steht dann trotzdem ne eins. Mein Code scheint 
schon zu funktionieren, denn der im Debugger stehende Wert für das 
register wird korrekt umgesetzt nur der Wert des Pins wird nicht korrekt 
eingelesen.
Vieleicht liegts daran das ich das nicht per Interrupt umgesetzt habe 
oder das ich die Takte nicht weiter konfiguriert habe. Da kenne ich mich 
noch nicht so gut aus. Deshalb wollte ich es erst mal so versuchen.

Der Chip: MSP430G2553
1
/*
2
 * main.c
3
 */
4
5
6
#include "msp430g2553.h"
7
8
void main(void) {
9
  
10
  WDTCTL = WDTPW + WDTHOLD;
11
  P1DIR = 0x40;
12
  
13
14
  while(1)
15
  {
16
    if ((P1IN & 0x08))
17
      P1OUT &= ~0x40;
18
    else
19
      P1OUT |= 0x40;
20
  }
21
}

Gruß

von Launch (Gast)


Lesenswert?

Arvid Hager schrieb:
> Das Problem
> ist, das der Wert des Pins nicht eingelesen wird.

Hängt am P1.3 nicht ein Pullup und der Taster S2? Wirf mal einen Blick 
in den Schaltplan vom Launchpad.

von dernetteeddie1978 (Gast)


Lesenswert?

Ja, der Schalter gegen Masse ist da dran, hatte ich der einfachheit 
halber nicht dazu geschrieben. Deshalb hatte ich den Pin als Eingang 
gewählt. Trotzdem müsste man den Pin doch gegen Masse ziehen können. Der 
Schalter geht ja direkt gegen Masse.

von Absolvent 0815 (Gast)


Lesenswert?

Du solltest P1.3 schon als Input initialisieren... ;)

von Launch (Gast)


Lesenswert?

Absolvent 0815 schrieb:
> Du solltest P1.3 schon als Input initialisieren... ;)

Hat er doch. Auf dem Launchpad sitzt am P1.3 ein externer Pullup. Der 
Pin wird daher immer als 1 gelesen. Für eine 0 muss er satt auf Gnd 
gezogen werden.

Ich denke eher wir sehen hier nicht den ganzen Code und der interne 
Pulldown ist aktiv. >:-(

von A. H. (dernetteeddie1978)


Lesenswert?

Der abgebildete Code ist komplett.

Aber die Zeile:
1
P1DIR = 0x40;

Sollte doch eigentlich P1.6 als Ausgang und den Rest als Eingang 
definieren?
Hab mal die Zeile
1
P1REN = 0;

Hinzugefügt - keine Verbesserung.

Gruß

von ./. (Gast)


Lesenswert?

Launch schrieb:
> Auf dem Launchpad sitzt am P1.3 ein externer Pullup.

Der fehlt ab Rev 1.5...

von A. H. (dernetteeddie1978)


Lesenswert?

In der Tat, kein R34 mehr aufgelötet. Mal schauen ob ich ne 
aktualisierte Doku zu dem Board bei TI bekomme...

von Launch (Gast)


Lesenswert?

./. schrieb:
> fehlt ab Rev 1.5

Seite 20 Schaltplan R34
http://www.ti.com/lit/ug/slau318c/slau318c.pdf

Ist der nicht überall bestückt?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Launch schrieb:
> Ist der nicht überall bestückt?

Nö, auch auf meinem Launchpad 1.5 ist er nicht bestückt. Auch der gegen 
Masse geschaltete Kondensator C24 ist nicht da.

von Launch (Gast)


Lesenswert?

A. H. schrieb:
> Mein Code scheint
> schon zu funktionieren, denn der im Debugger stehende Wert für das
> register wird korrekt umgesetzt nur der Wert des Pins wird nicht korrekt
> eingelesen.

Ich mal gerade mein LP raus gekramt, ein 1.5.
Widerstand und C sind tatsächlich nicht bestückt. Aber egal, ich habe 
folgendes Programm in der IAR EW probiert
1
#include "msp430g2553.h"
2
3
void main(void) {
4
  WDTCTL = WDTPW + WDTHOLD;
5
  P1DIR = 0x40;
6
7
  while(1) {
8
    if ((P1IN & 0x08))
9
      P1OUT &= ~0x40;
10
    else
11
      P1OUT |= 0x40;
12
  }
13
}
Ich lege einen Finger auf die Stiftleiste von Vcc bis P1.3 ist die LED 
aus. Drücke ich dazu S2 geht die LED an. Parallel dazu habe ich P1IN im 
WATCH betrachtet, binär. Das 4te Bit, BIT3 folgt dem Schalter 
invertiert. Also alles Ok.

von A. H. (dernetteeddie1978)


Lesenswert?

Hmm,

habs jetzt mal anders probiert:
1
/*
2
 * main.c
3
 */
4
5
6
#include "msp430g2553.h"
7
8
9
void main(void) {
10
11
  volatile unsigned int i;
12
  
13
  WDTCTL = WDTPW + WDTHOLD;
14
  BCSCTL3 = LFXT1S_2;
15
  BCSCTL2 = SELM_3+DIVM_3;
16
  BCSCTL1 = XT2OFF;
17
  _BIS_SR(GIE);
18
  P1DIR = BIT6+BIT0;
19
  P1REN = BIT3;
20
  P1OUT = BIT3;
21
  P1IES = BIT3;
22
  P1IFG = 0;
23
  P1IE = BIT3;
24
25
  while(1)
26
  {
27
    if ((P1OUT & BIT0))
28
      P1OUT &= ~BIT0;
29
    else
30
      P1OUT |= BIT0;
31
  }
32
}
33
34
35
#pragma vector=PORT1_VECTOR
36
__interrupt void PORT1_ISR (void)
37
{
38
  P1IE = ~BIT3;
39
  if ((P1IN & BIT6))
40
  {
41
    P1OUT &= ~BIT6;
42
    P1IES |= BIT3;
43
  }
44
  else
45
  {
46
    P1OUT |= BIT6;
47
    P1IES &= ~BIT3;
48
  }
49
  P1IE = BIT3;
50
  P1IFG &= ~BIT3;
51
}


Komisch ist das wenn ich den Debugger starte das Programm erst nicht 
läuft und wenn ich dann auf Pause und dann wieder auf Start klicke läuft 
es einwandfrei

von Bernhard S. (b_spitzer)


Lesenswert?

Abschnitt 1.3 in der Beschreibung:
1.3 Revisions
The first production revision of the LaunchPad in 2010 was 1.3. In 2012 
the LaunchPad board revision changed from 1.4 to 1.5 to align with the 
new release of Value Line devices. The differences in the schematic and 
the kit contents are:
• Layout and Schematic:
– ...
– Pullup resistor R34 and capacitor C24 on P1.3 removed to reduce the 
current consumption

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.