kann man die In-Port-Register nicht abfragen?

Gast #1011393
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
Gast #1012263
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
Gast #1015804
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
Gast #1016102
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.

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