Forum: Mikrocontroller und Digitale Elektronik msp430f1612_testfunktion pins high-low


von Mathias U. (munter)


Lesenswert?

Hallo, ich habe folgendes problem:

erstmal zur hard & software:

- msp430f1612
- iar embedded workbench 3.21a
- das ganze soll in c geschrieben sein

Ich möchte den aktuellen Status meiner SD-Card testen. Ich habe einen 
SD-Card-Adapter,
der 3Pins zusätzlich besitzt.
Mit diesen Pins sollte es möglich sein, per Software zu testen, ob
a) die Karte überhaupt drin ist
b) die Karte drin ist und der Schreibschutz aktiv ist
c) die Karte drin ist und der Schreibschutz inaktiv ist

Ich habe schon den ganzen Vormittag probiert, aber irgendw scheint noch 
ein Denkfehler
zu sein...

Meine Funktion zm testen:
1
// ************************************************************************************************
2
// funktion überprüft den status der sd_card
3
// sd_card_status == 1 --> karte nicht drin
4
// sd_card_status == 2 --> karte drin, aber schreibschutz aktiv
5
// sd_card_status == 3 --> alles OK
6
// ************************************************************************************************
7
char check_sd_card_status (void)
8
{
9
  char sd_card_status;
10
  
11
  P5OUT |= SW1;                                     // SW1 auf high
12
  if (P5IN == 0x30)                                 // test, ob SW3 auf high
13
  {
14
    if (P5IN == 0x70) sd_card_status = 3;           // test, ob SW2 auf high; --> alles OK
15
    else sd_card_status = 2;                        // --> karte drin, aber schreibschutz aktiv
16
  }
17
  else
18
  {
19
    sd_card_status = 1;                             // --> karte nicht drin
20
  }
21
  
22
  P5OUT &= ~SW1;                                    // SW1 wieder auf low
23
24
  return (sd_card_status);
25
}  
26
// ************************************************************************************************

Zur Erklärung: (so SOLL es funktionieren)
Port5 ist mittels
1
P5DIR = 0x10; // alle pins auf eingang setzen, bis auf P5.4 (SW1)
2
P5OUT = 0x00; // alles auf low
initialisiert.

In der Funktion setzte ich SW1 auf high, dann wird getestet, ob auch SW3 
auf high ist.
(SW1 ist P5.4 = 0001 0000; wenn Karte drin, sind beide Pins 
kurzgeschlossen und am Port müsste 0011 0000 == 0x30 anliegen, weil SW3 
= P5.5)
Wenn das der Fall ist, ist die Karte zumindest mal drin...
Sollte dann auch noch SW2 auf high liegen, ist der Schreibschutz 
inaktiv, ansonsten ist er aktiv.
Wenn der Schreibschutz inaktiv sein sollte, müsste am Port 0111 0000 == 
0x70 anliegen.
Dann liegen SW1(P5.4), SW2(P5.6) und SW3(P5.5) auf high.

Ich lasse die Sachen dann per LCD ausgeben...
In einer switch-case Routine wechsele ich zwischen verschiedenen Seiten 
und Anzeigen des LCD.
Hier mal der wichtige Ausschnitt:
1
case 113:
2
  if      (Taste == 1) Seite = 116;
3
  else if (Taste == 3)
4
  {
5
    Anzeige = 1;
6
    if (check_sd_card_status() == 1)          // karte nicht drin
7
    {
8
      Anzeige = 1;                            
9
      Seite = 114;
10
    }
11
    else if (check_sd_card_status() == 2)     // karte drin, aber schreibschutz aktiv
12
    {
13
      Anzeige = 2;                            
14
      Seite = 114;
15
    }
16
    else if (check_sd_card_status() == 3)     // karte drin, alles i.O.
17
    {
18
      Seite = 115;                                      
19
    } 
20
  }           
21
  else if (Taste == 5) Seite = 111;
22
break;

Ich rufe also aus eine bestimmten Seite die Funktion 
check_sd_card_status() auf und vergleiche den Returnwert mit 1,2 oder 3.
Je nachdem führe ich bestimmte Aktionen aus...

Ich weiß, dass der Code jetzt etwas zerstückelt ist, aber ich hoffe, die 
wichtigen Dinge sind vorhanden.
Irgendwo bei meiner check-funktion muss der Wurm drin sein, weil ich 
immer den Status 1, also keine Karte drin, bekomme.

Sieht jemand den Fehler? Wäre Super, wenn mir jemand helfen könnte.
Danke schonmal...

ps: Ach ja, ich bin Anfänger, was die MSP-Programmierung angeht ;-)
Deshalb wird so einiges im Code sicher ziemlich umständlich sein.

von Msp 4. (msp430_crew)


Lesenswert?

Hallo!

Hast Du denn auch die P5SEL-Bits gesetzt? Du muss ja auswählen ob der 
jeweilige Portpin als I/O oder Zweitfunktion eingesetzt wird?
Die Abfrage nach den einzelnen Port-Bits würde ich über eine logische 
Verknüpfung abfragen, also nich immer den gesammten Port abragen! Man 
weiß ja nicht welchen Zustand die anderen Bits haben!

Also nich if(P5IN==0x30) sondern if((P5IN&0x20)==0x20).....

von Jörg S. (Gast)


Lesenswert?

Nutz im Debugger einfach mal die Single Step Funktion und lass dir die 
Register (Portpins) dabei anzeigen, dann kannst du schön sehen welche 
Pins gesetzt werden (oder auch nicht :) ).

von Mathias U. (munter)


Lesenswert?

Hallo,

die Idee mit der logischen Verknüpfung in der Abfrage ist gut. Ich hatte 
es erstmal ohne gemacht, weil mich die anderen Pins erstmal nicht 
interessieren und ich sie ja am Anfang auf low gesetzt habe.

Die Sache mit dem P5SEL versteh ich nicht ganz:
Ich brauche doch (erstmal jedenfalls) keine Zweitfunktion bei den Pins. 
Den kompletten Port hab ich als Eingang definiert, nur P5.4 soll ein 
Ausgang sein.
Also alles I/O...nix mit Zweitfunktion...oder wie?

Debuggen ist sicher ne gute Idee, aber in meinem Programm laufen noch ne 
Menge anderer Dinge ab...Ich muss mich erstmal durchs Menu klicken, bis 
ich an besagter Stelle bin...(also bis ich per Tastendruck dann die 
check-funktion aufrufe)
Ausserdem läuft im Hintergrund ne Uhrzeit mit, die auch nen Interrupt 
braucht...

Ich dachte die Funktion an sich ist so einfach, weil es ja wirklich nur 
folgendes ist:

- bestimmter Pin auf high
- test ob anderer Pin auf high ist
- dann test ob wieder anderer Pin auf high ist...

Also an sich nichts schlimmes. Aber es geht leider nicht...

Evtl. muss ich mal nen neues Projekt machen, und den ganzen 
"unwichtigen" Kram rausschmeissen. Das wollte ich aber vermeiden...

von Msp 4. (msp430_crew)


Lesenswert?

Mathias U. wrote:
> Hallo,
>
> Die Sache mit dem P5SEL versteh ich nicht ganz:
> Ich brauche doch (erstmal jedenfalls) keine Zweitfunktion bei den Pins.
> Den kompletten Port hab ich als Eingang definiert, nur P5.4 soll ein
> Ausgang sein.
> Also alles I/O...nix mit Zweitfunktion...oder wie?

Du musst aber die PxSEL Register auch setzen (auf 0 für I/O) wenn Du 
nicht die Zweitfunktion benutzt!

Bist Du denn auch sicher das diese Überbrückungsgeschichte bei der 
SD-Karte funktioniert? Vielleicht wäre es erstmal sinnvoll die Kontakte 
von Hand zu brücken!?

von Mathias U. (munter)


Lesenswert?

Msp 430_crew wrote:

> Du musst aber die PxSEL Register auch setzen (auf 0 für I/O) wenn Du
> nicht die Zweitfunktion benutzt!

Ja und ich dachte, die Register sind standardmäßig auf Null gesetzt?!

Reicht es nicht aus:
1
P5DIR = 0x10;
2
P5OUT = 0x00;
zu machen? Damit müsste doch alles auf low sein, und nur ein Pin als 
Ausgang.
Der Rest auf Eingang...Ich hab bei meinen ersten Versuchen (Taster 
schaltet Led usw. ) nie was mit den PxSEL-Registern machen müssen.
Wenn es nicht reichen sollte, wie muss es dann heissen?

Und, ja, die Überbrückungsgeschichte funktioniert ;-)
Gerade nochmal getestet. Ist ja am SD-Card-Adapter nur ne mechanische 
Sache.
Und die SD-Card hat ne nen Nippel, womit man den Schreibschutz 
aktivieren kann...das funktioniert schon...
(Die 3 Extra-Pins am Adapter haben keinerlei Verbindung zu den 9 Pins 
der Sd-Card, also wirklich rein mechanisch am Adapter...)

von Msp 4. (msp430_crew)


Lesenswert?

Mathias U. wrote:
> Ja und ich dachte, die Register sind standardmäßig auf Null gesetzt?!
>
> Reicht es nicht aus:
>
1
> P5DIR = 0x10;
2
> P5OUT = 0x00;
3
>
> zu machen? Damit müsste doch alles auf low sein, und nur ein Pin als
> Ausgang.

Ja, Du hast Schon recht das die Ports nach dem Reset auf Eingang 
geschalten sind! Aber man sollte sich angewöhnen sie trotzdem nochmal 
explizit auf Eingang zu setzen mit z.B. P5SEL = 0x00; für den gesammten 
Port 5.
Wo jetzt noch der Fehler liegt ist schwer zu sagen, da man nicht den 
gesammten Quellcode kennt!
Hast Du schonmal deinen SW1 gemessen ob der high ist?
Vielleicht solltest Du versuchen ein neues Projekt zu starten wo Du 
erstmal nur diese hier angesprochene Funktion umsetzt!? Dann weißt Du 
genau wo der Fehler liegt!

von Mathias U. (munter)


Lesenswert?

DAMN, genau das wollte ich vermeiden, aber hilft nix...
Danke trotzdem. Ich meld mich dann, wenns geklappt hat, bzw. wenn 
nicht...

von Mathias U. (munter)


Lesenswert?

Hallo, also meine Funktion an sich geht schon wunderbar, aber das Kabel, 
welches zum SD-Card-Adapter geht, das hat irgendwie ne Meise.
Mache ich nen Flachbandkabel dran, geht alles wunderbar, aber wenn ich 
mein Selbstgebautes nehme, welches nur die drei Leitungen hat, dann 
spinnt er.

Ich habe mir nen neues Projekt gemacht...und dann mal ordentlich 
entkäfert...
der P5IN ist ständig auf irgendwelche Werte gesprungen...völlig 
unerklärlich.
Aber auch wenn ich das Flachbandkabel nehme (14 Adern), hinten offen 
lasse und mal nen Draht in eines der Löcher der Buchsenleiste rein tue, 
dann spinnt er auch...
Wenn ich es einfach offen lasse, dann geht es, aber so...k.A. woran das 
liegt!

Tia, hätte ich mal doch die Pins direkt brücken sollen... ;-)
Dann hätte ich es schneller gefunden.

Egal, jetzt geht es so wie ich es mit vorstelle...

Danke

von Jörg S. (Gast)


Lesenswert?

> Ja, Du hast Schon recht das die Ports nach dem Reset auf Eingang
> geschalten sind! Aber man sollte sich angewöhnen sie trotzdem nochmal
> explizit auf Eingang zu setzen mit z.B. P5SEL = 0x00; für den gesammten
> Port 5.
Na ich weiss nicht. Dann müsste man ja auch SÄMTLICHE andere Register 
vom MSP noch mal schreiben. Wenn im Datenblatt steht das die nach POR 
einen bestimmten Wert haben, kann man das denke ich auch erwarten :)

von Jörg S. (Gast)


Lesenswert?

> Debuggen ist sicher ne gute Idee, aber in meinem Programm laufen noch ne
> Menge anderer Dinge ab...Ich muss mich erstmal durchs Menu klicken, bis
> ich an besagter Stelle bin...(also bis ich per Tastendruck dann die
> check-funktion aufrufe)
> Ausserdem läuft im Hintergrund ne Uhrzeit mit, die auch nen Interrupt
> braucht...
Stichwort: Breakpoint

von Lanius (Gast)


Lesenswert?

Hast du überhaupt PULLUP-Widerstände an den Eingängen?

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.