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:
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
case113:
2
if(Taste==1)Seite=116;
3
elseif(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
elseif(check_sd_card_status()==2)// karte drin, aber schreibschutz aktiv
12
{
13
Anzeige=2;
14
Seite=114;
15
}
16
elseif(check_sd_card_status()==3)// karte drin, alles i.O.
17
{
18
Seite=115;
19
}
20
}
21
elseif(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.
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).....
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 :) ).
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...
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!?
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...)
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!
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
> 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 :)
> 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