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
Wenn ich das richtig sehe ist beispielsweise P6 am AEXT rausgeführt. Wonach suchst du denn genau?!
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^^
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.
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.