Forum: Mikrocontroller und Digitale Elektronik Easy Web 2 / Ports


von Bonkas (Gast)


Lesenswert?

Hallo liebe Freunde des Mikrocontroller.

Ich habe gerade angefangen mich mit dem MSP430 zu beschäftigen und hab 
mir das easy web 2 development Board von Olimex bestellt.
Das flashen funktioniert auch schon einwandfrei und ich habe schon ein 
laufendes Programm, wo Taster, Buzzer und Relais betätigt werden. Ich 
habe aber immer noch ein Problem mit den herausgeführten Ports. Ich 
finde sie einfach nicht auf dem Schaltplan und kann sie dementsprechend 
auch nicht ansprechen und nutzen.

Vielleicht könnt ihr mir helfen.
Wäre für alles dankbar.

Noch der Link für den Schaltplan:

http://www.olimex.com/dev/images/msp430-easyweb2-sch.gif

von Niels H. (monarch35)


Lesenswert?

Wenn ich das richtig sehe ist beispielsweise P6 am AEXT rausgeführt. 
Wonach suchst du denn genau?!

von Bonkas (Gast)


Lesenswert?

ah... ja, das hab ich grad eben gefunden^^
eigentlich ganz offensichtlich gg
aber danke dafür

noch was anderes...
und zwar...
wie ist die portinitialisierung hier zu verstehen?
SEL, OUT und DIR...

um z.B. AI0 auf high zu setzen, habe ich mir gedacht ich define das mal 
so...

#define          AI0_ON             P6OUT |= BIT0     //AI0 - P6.0
#define          AI0_OUT            P6OUT &= ~BIT0    //AI0 - P6.0


und sprech den in der main über einen taster an, so ungefähr...

    InitPorts();

    if ((B1) == 0)
      {
      AI0_ON;
      }
    else
      {
       AI0_OUT;
      }


InitPorts sieht bei mir folgendermaßen aus:

void InitPorts(void)
{
  P1SEL = 0;
  P1OUT = 0;
  P1DIR = BIT5 | BIT6;

  P2SEL = 0;
  P2OUT = 0;
  P2DIR = ~BIT0;                                //only P2.0 is input

  P3SEL |= BIT4 | BIT5;                         //enable UART0
  P3DIR |= BIT4;                                //enable TXD0 as output
  P3DIR &= ~BIT5;                               //enable RXD0 as input

  P4SEL = 0;
  P4OUT = 0;
  P4DIR = BIT2 | BIT3;                          //only buzzer pins are 
outputs

  P6SEL = 0x80;
  P6OUT = 0;
  P6DIR = 0x00;                                 // all output

  }

nach meiner Theorie sollte das nun gehn, aber es tut sich nix^^

von Msp 4. (msp430_crew)


Lesenswert?

Du musst Dir unbeding das Datenblatt durchlesen!
Also von vorn:
PxDIR gibt die Richtung des Ports an, also Ausgang oder Eingang 
(0=Eingang, 1=Ausgang)
PxSEL gibt an, ob Du den Port als Eingang/Ausgang oder Zweitfunktion 
benutzen willst (0=Ein-/Ausgang, 1=Zweitfunktion)
PxOUT ist halt der Wert den Du an Port x ausgeben willst oder PxIN der 
den Du einlesen willst.

Wenn Du also Port 6.0 als Ausgang haben willst:

P6DIR |= BIT0;
P6SEL &= ~BIT0;

Und dann mit AI0_ON P6.0 auf 1 setzen oder mit AI0_OUT auf 0.

von Bonkas (Gast)


Lesenswert?

Juhuu

Habs nun geschafft.

Dankesehr

von Bonkas (Gast)


Lesenswert?

guten tag, ich bins wieder

ich hab ein problem mit meinem momentanen programm...
als "vorlage" habe mir das "testprogramm" für dieses board 
heruntergeladen
da ich aber dieses ganze serverzeug nicht brauche, habe ich mir das für 
mich wichtigste herauskopiert...


Hier mein momentanes programm^^

#include "msp430x14x.h"
#include "stdlib.h"
#include "stdio.h"

#define          B1                 BIT4&P4IN         //B1 - P4.4
#define          B2                 BIT5&P4IN         //B2 - P4.5
#define          B3                 BIT6&P4IN         //B3 - P4.6
#define          B4                 BIT7&P4IN         //B4 - P4.7
#define          DI1                BIT1&P1IN         //Digital Input 1 
- P1.1
#define          DI2                BIT2&P1IN         //Digital Input 2 
- P1.2
#define          DI3                BIT3&P1IN         //Digital Input 3 
- P1.3
#define          DI4                BIT4&P1IN         //Digital Input 4 
- P1.4
#define          RELAY1_ON          P1OUT |= BIT5     //RELAY1 - P1.5
#define          RELAY1_OFF         P1OUT &= ~BIT5    //RELAY1 - P1.5
#define          RELAY2_ON          P1OUT |= BIT6     //RELAY1 - P1.6
#define          RELAY2_OFF         P1OUT &= ~BIT6    //RELAY1 - P1.6
#define          STATUS_LED_ON      P2OUT &= ~BIT1    //STATUS_LED - 
P2.1
#define          STATUS_LED_OFF     P2OUT |= BIT1     //STATUS_LED - 
P2.1
#define          BUZ1_ON            P4OUT |= BIT2     //P4.2
#define          BUZ1_OFF           P4OUT &= ~BIT2    //P4.2
#define          BUZ2_ON            P4OUT |= BIT3     //P4.3
#define          BUZ2_OFF           P4OUT &= ~BIT3    //P4.3
#define          _100us             66
#define          _10us              6
#define          E                  3                 //P2.3
#define          bitset(var,bitno) ((var) |= 1 << (bitno))
#define          bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
#define          RS                 2                 //P2.2
#define          LCD_Data           P2OUT
#define          CLR_DISP      0x01
#define          DISP_ON      0x0c
#define          DD_RAM_ADDR      0x80
#define          DD_RAM_ADDR2      0xc0
#define          AI0_ON             P6OUT |= BIT0     //AI0 - P6.0
#define          AI0_OFF            P6OUT &= ~BIT0    //AI0 - P6.0


const unsigned char LCD_Message[] = "   HALLO WELT   ..:----------:..";
const unsigned char P6_error_Message[] = "    P6 error    ";
const unsigned char EXT_error_Message[] = "   EXT error    ";

void InitPorts(void);
void Delay (unsigned int a);
void Delayx100us(unsigned char b);
void stopP6 (void);
void InitLCD(void);
void stop_ext (void);
void SEND_CMD (unsigned char e);
void SEND_CHAR (unsigned char d);
void _E(void);

unsigned char i,j,k,temp,RX_flag,cntr,time_out;

void main( void )
{

    InitPorts();

    if ((B2) == 0)
      {
      AI0_ON;
      }
    else
      {
       AI0_OFF;
      }

    if ((B3) == 0)
        {
          RELAY2_ON;
        }
    else
      {
       RELAY2_OFF;
      }

    while ((B4) == 0)
        {
          BUZ1_OFF;
          BUZ2_ON;
          Delay(_10us);
          BUZ2_OFF;
          BUZ1_ON;
          Delay(66);
        }
     BUZ1_OFF;
     BUZ2_OFF;

    InitLCD();
    WDTCTL = WDTPW + WDTHOLD;

    for (i=0; i!=32; i++)
    {
      SEND_CHAR(LCD_Message[i]);
      if (i==15) SEND_CMD (DD_RAM_ADDR2);
    }

    SEND_CMD(DD_RAM_ADDR);
    RX_flag=0;
    cntr = 0;
 }

void InitPorts(void)
{
  P1SEL = 0;
  P1OUT = 0;
  P1DIR = BIT5 | BIT6;

  P2SEL = 0;
  P2OUT = 0;
  P2DIR = ~BIT0;                                //only P2.0 is input

  P3SEL |= BIT4 | BIT5;                         //enable UART0
  P3DIR |= BIT4;                                //enable TXD0 as output
  P3DIR &= ~BIT5;                               //enable RXD0 as input

  P4SEL = 0;
  P4OUT = 0;
  P4DIR = BIT2 | BIT3;                          //only buzzer pins are 
outputs

  P6SEL &= ~BIT0;
  P6DIR |= BIT0;                                 // all output
}

void Delay (unsigned int a)
{
  for (k=0 ; k != a; ++k);                      //9+a*12 cycles
}

void Delayx100us(unsigned char b)
{
  for (j=0; j!=b; ++j) Delay (_100us);
}

void stopP6 (void)
{
    P6DIR = 0;
    cntr=0;
    SEND_CMD(CLR_DISP);
    SEND_CMD(DD_RAM_ADDR);
    for (i=0 ; i!= 16; i++) SEND_CHAR(P6_error_Message[i]);
    while(1);
}

void stop_ext (void)
{
    P2DIR &= ~BIT0;
    P4DIR = 0;
    cntr=0;
    SEND_CMD(CLR_DISP);
    SEND_CMD(DD_RAM_ADDR);
    for (i=0 ; i!= 16; i++) SEND_CHAR(EXT_error_Message[i]);
    while(1);
}

 void _E(void)
{
        bitset(P2OUT,E);    //toggle E for LCD
  Delay(_10us);
  bitclr(P2OUT,E);
}

void SEND_CMD (unsigned char e)
{
  Delayx100us(10);                //10ms
  temp = e & 0xf0;    //get upper nibble
  LCD_Data &= 0x0f;
  LCD_Data |= temp;               //send CMD to LCD
  bitclr(P2OUT,RS);               //set LCD to CMD mode
  _E();                           //toggle E for LCD
  temp = e & 0x0f;
  temp = temp << 4;               //get down nibble
  LCD_Data &= 0x0f;
  LCD_Data |= temp;
  bitclr(P2OUT,RS);             //set LCD to CMD mode
  _E();                           //toggle E for LCD
}

void SEND_CHAR (unsigned char d)
{
  Delayx100us(5);                 //.5ms
  temp = d & 0xf0;    //get upper nibble
  LCD_Data &= 0x0f;
  LCD_Data |= temp;
  bitset(P2OUT,RS);               //set LCD to data mode
  _E();                           //toggle E for LCD
  temp = d & 0x0f;
  temp = temp << 4;               //get down nibble
  LCD_Data &= 0x0f;
  LCD_Data |= temp;
  bitset(P2OUT,RS);             //set LCD to data mode
  _E();                           //toggle E for LCD
}

void InitLCD(void)
{
    bitclr(P2OUT,RS);
    Delayx100us(250);                   //Delay 100ms
    Delayx100us(250);
    Delayx100us(250);
    Delayx100us(250);
    LCD_Data |= BIT4 | BIT5;            //D7-D4 = 0011
    LCD_Data &= ~BIT6 & ~BIT7;
    _E();                               //toggle E for LCD
    Delayx100us(100);                   //10ms
    _E();                               //toggle E for LCD
    Delayx100us(100);                   //10ms
    _E();                               //toggle E for LCD
    Delayx100us(100);                   //10ms
    LCD_Data &= ~BIT4;
    _E();                               //toggle E for LCD

    SEND_CMD(DISP_ON);
    SEND_CMD(CLR_DISP);
}

hier gehn die tastenbelegungen, also das relai, der buzzer und ein 
signal auf port6
aber display is hier noch nicht beschrieben

wenn ich dann (WDTCTL = WDTPW + WDTHOLD; //Watchdog aus) im programm 
weiter nach vorne gebe, um genau zu sein direkt unter die 
Portinitialisierung, dann ist das display beschrieben, die 
tastebelegungen funktionieren jedoch nicht mehr...

also entweder display oder taster^^
blick da nicht mehr durch

wisst ihr da weiter?!

mfG
Bonkas

von Niels H. (monarch35)


Lesenswert?

Bonkas wrote:

> wenn ich dann (WDTCTL = WDTPW + WDTHOLD; //Watchdog aus) im programm
> weiter nach vorne gebe, um genau zu sein direkt unter die
> Portinitialisierung, dann ist das display beschrieben, die
> tastebelegungen funktionieren jedoch nicht mehr...

.....und warum lässt du das WDT nicht einfach an der Stelle?

von Bonkas (Gast)


Lesenswert?

ja, wie gesagt, dann geht nur mehr das display und die tasten nicht 
mehr...

von Bonkas (Gast)


Lesenswert?

????

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.