Forum: Mikrocontroller und Digitale Elektronik kann man die In-Port-Register nicht abfragen?


von max (Gast)


Lesenswert?

hey leute,

probiere gerade eine pin abfrage zu machen mit 430F2274.
mit diesem Code:

#include "msp430x22x4.h"

volatile unsigned int i;

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;
  P1DIR |= 0x01;

  for (;;)
  {
   if(P1IN & BIT2){
     P1OUT ^= 0x01;              // Toggle P1.0 using exclusive-OR

     i = 50000;                  // Delay
     do (i--);
     while (i != 0);
   }
  }
}
----------------------------
das problem ist auch wenn ich den taster am Port1-Pin2 drücke, passiert 
nichts.

Ich benutze den Code Composer E version 2. Hier gibt es eine 
Registerleiste. das komische ist, wenn ich den taster drücke, wird der 
Flag des Ports für Pin2 gesetzt , aber im P1IN register verändert sich 
nichts.

habe ich da was übersehen? darf ich den P1IN-register nicht abfragen?

hm.......

MFG max

von Peter Diener (Gast)


Lesenswert?

Hallo,

lass mal den Debugger weg, übersetz das Programm nativ ohne Debugcode 
und lass es dann am Prozessor laufen.
Außerdem solltest du die P1DIR und P1SEL für beide verwendeten Ports 
richtig einstellen, bei solchen Fehlern nicht dran glauben, dass die 
defaultmäßig stimmen, schon gar nicht im Debugmode.

P1IN ist das Port input register, da steht der momentane Zustand der 
PortEINGÄNGE. Deine Abfrage ist also korrekt.

Grüße,

Peter

von max (Gast)


Lesenswert?

Danke Peter.  naja habe das jetzt aufm port 2 probiert und es geht.
kennst du dich mit CCE v2 aus, wie übersetze ich da progrramm ohne 
Debugcode?

MFG Max

von Johnny (Gast)


Lesenswert?

Beim MSP430 gibt es meines Wissens, normalerweise keinen separaten 
Debug-Code bzw. Monitor Software, da er ja per JTAG "gedebuggt" wird und 
das Zeug in Hardware vorhanden ist.

von Johnny (Gast)


Lesenswert?

Kann Dein code überhaupt funktionieren?
do (i--);
while (i != 0);

sollte wohl eher heissen:
do
{
  i--;
} while (i != 0);

von Peter Diener (Gast)


Lesenswert?

Hallo,

wenn es nur eine Anweisung im do ist, dann ist das zulässig.

Mit CCE kenn ich mich nicht sehr gut aus, aber man kann auf jeden Fall 
von Debug auf Release umstellen.

Project -> Properies -> C/C++ Build

hier kann man normal zwischen Debug und Release umstellen, wenn es das 
Profil Release noch nicht gibt, musst du eins anlegen. Dazu muss man bei 
den Optionen im unteren Fensterteil alles auf höchste Optimierung 
stellen und nicht auswählen, dass irgenein Debugcode integriert wird, so 
genau kenn ich mich damit aber auch nicht aus. Dann kann man einfach ein 
neues Profil speichern.

Ich verwende immer den mspgcc Compiler und übertrage meine Programme 
dann im BSL-Modus in den Controller. Zusammen mit Programmers Notepad 
und einem kleinen Batchfile zum Abarbeiten der Compilierungsschritte 
geht das sehr gut.
Aber der CCE Compiler ist wohl auch nicht schlecht, vor allem ist nur 
die Codesequenz auf 8kB begrenzt, Data darf beliebig groß sein, man darf 
also auch für 32kB irgendwelche Schriftarten und Bilder für Displays 
usw. in arrays legen, ohne dass der Compiler aussteigt. IAR lässt das 
nicht zu, da ist alles zusammen auf 4 kB begrenzt.


Grüße,

Peter

von max (Gast)


Lesenswert?

jop peter , danke nochmal, habe die einstellung gefunden für release.

PS: kleines updatechen (nur zu info)--> mit dem neuen  CCE_v3 kann man 
bis zu 16kB code programmieren ;)

von Johnny (Gast)


Lesenswert?

> do (i--);
> while (i != 0);

Ok, wusste nicht, dass dies zulässig ist. Aber ich würde es auf jeden 
Fall anders schreiben. Schnell ändert man mal was am Code und dann geht 
gar nichts mehr, wenn man sowas dann übersieht.

Habe nochmal nachgedacht. Wenn Dein Code mit Port 2 funktioniert, dann 
hast Du bei Port 1 vielleicht noch ein Peripheriemodul aktiviert, dass 
das IO 0 oder 2 belegt und die Kontrolle darüber hat. Vielleicht ist es 
sogar der BSL, keine Ahnung.
Am besten zu Beginn Deines Programmes auch noch P1SEL wie gewünscht 
setzen. Und "P1DIR |= 0x01;" ersetzen durch "P1DIR = 0x01;", damit es zu 
Beginn mal einen bekannter Wert zugewiesen wird.

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.