Forum: Mikrocontroller und Digitale Elektronik MSP430G2231 (Launchpad) und Dogm132-5


von Harry S. (littlegonzo)


Lesenswert?

Hallo Leute,
ich versuche seit Stunden das DogM132-5 mit dem MSP430G2231 zum laufen 
zu bekommen. Da ich das Launchpad erst seit gestern habe, fehlen mir 
noch die Infos das per Hardware SPI zu machen, bzw. steig ich bisher 
durch deren Datasheets nur bedingt durch...bin wohl doch zu sehr von den 
AVRs verwöhnt scheinbar....

Hier mein Source bisher, bitte nicht auf die Kommentare achten da ich 
die Sourcen nur zusammen gehauen habe...

Auf dem Display passiert bisher NULL, wenn ich die "pins" an die LEDs 
hänge leuchten sie so wie sie es sollten...nu bin ich gerade ein bissel 
ratlos.
Die Initsequence für das Display muß gehen da ich das Display mit den 
ATMEGA 644 mit diesem Init zum laufen bekomme!

Hier der Source
1
//***************************************************************************************
2
// MSP430 Driver for Dogm132x32
3
//
4
// 
5
//
6
// MSP430g2231
7
//
8
//***************************************************************************************
9
#include <msp430g2231.h>
10
 
11
//Define our pins 
12
#define HG BIT0
13
#define SI BIT7
14
#define SCL BIT6
15
#define A0 BIT5
16
#define RST BIT3
17
#define CS BIT4
18
19
#define Lcd_Select()        P1OUT &= ~(CS)
20
#define Lcd_Deselect()      P1OUT |=(CS)
21
#define Lcd_A0_LO()         P1OUT &=~(A0)
22
#define Lcd_A0_HI()         P1OUT |=(A0)
23
#define Lcd_Reset_HI()      P1OUT |=(RST)
24
#define Lcd_Reset_LO()      P1OUT &=~(RST)
25
#define HG_on()        P1OUT |=(HG)
26
#define HG_off()      P1OUT &=~(HG) 
27
#define LCD_HEIGHT       64
28
#define LCD_WIDTH       128
29
30
const char Lcd_InitData[] = {  0x40,   // Display Start Line 0
31
  0xA1,   // Display Normal
32
  0xC0,   // Set Bias
33
  0xA6,   // Power Control set
34
  0xA2,   // Booster Ratio set
35
  0x2F,   // ""
36
  0xF8,   // // V0 Voltage regulator set
37
  0x00,   // Static Indicator set
38
  0x23,   // ""
39
  0x81,  // Display on/off
40
  0x1F,
41
  0xAD,
42
  0x00,
43
  0xAF};
44
45
// Declare functions
46
void delay ( unsigned int );
47
void Lcd_Init(void);
48
void Lcd_Clear(unsigned char inv);
49
void pinWrite( unsigned char bit, unsigned char val );
50
void shiftOut(unsigned char val);
51
52
int main( void )
53
{
54
  // Stop watchdog timer to prevent time out reset
55
  WDTCTL = WDTPW + WDTHOLD;
56
  P1OUT=0x00;
57
  Lcd_Deselect(); 
58
  Lcd_Reset_HI();
59
  P1DIR = HG + SI + SCL + A0 + RST + CS;  // Setup pins as outputs
60
  //Do a "ping-pong" effect back and forth
61
  Lcd_Init();
62
  Lcd_Clear(1);
63
  for(;;){
64
    HG_on();
65
    delay(500);
66
    HG_off(); 
67
    delay(500);
68
    }
69
}
70
71
// Delays by the specified Milliseconds
72
// thanks to:
73
// http://www.threadabort.com/archive/2010/09/05/msp430-delay-function-like-the-arduino.aspx
74
void delay(unsigned int ms)
75
{
76
 while (ms--)
77
    {
78
        __delay_cycles(1000); // set for 16Mhz change it to 1000 for 1 Mhz
79
    }
80
}
81
82
void Lcd_Init(void)
83
{
84
  unsigned int i;
85
  char y;
86
  Lcd_Reset_LO();
87
  Lcd_Reset_HI();   // Display Reset-Leitung High
88
  
89
  Lcd_Select();     // Display selektieren
90
  Lcd_A0_LO();      // Command-Mode
91
  for(i = 0; i < sizeof(Lcd_InitData); i++) {
92
    shiftOut(Lcd_InitData[i]);
93
  }
94
  Lcd_Deselect();   // Display deselektieren
95
}
96
97
void Lcd_Clear(unsigned char inv)
98
{
99
  unsigned char x, y;
100
101
  Lcd_Select();       // Display selektieren
102
  for(y = 0; y < 8; y++) {
103
    Lcd_A0_LO();      // Command-Mode
104
    shiftOut(0xB0 + y); // Row select
105
    shiftOut(0x10);     // Column select high
106
    shiftOut(0x00);     // Column select low
107
    Lcd_A0_HI();      // Data-Mode
108
    if(inv)
109
    for(x = 0; x < 128; x++) { shiftOut(255);}
110
    else
111
    for(x = 0; x < 128; x++) { shiftOut(0);}
112
    }
113
   Lcd_Deselect();     // Display deselektieren
114
}
115
// Writes a value to the specified bitmask/pin. Use built in defines
116
// when calling this, as the shiftOut() function does.
117
// All nonzero values are treated as "high" and zero is "low"
118
void pinWrite( unsigned char bit, unsigned char val )
119
{
120
  if (val){
121
    P1OUT |= bit;
122
  } else {
123
    P1OUT &= ~bit;
124
  }
125
}
126
 
127
// Take the given 8-bit value and shift it out, LSB to MSB
128
void shiftOut(unsigned char val)
129
{
130
  char i;
131
 
132
  // Iterate over each bit, set data pin, and pulse the clock to send it
133
  // to the shift register
134
  for (i = 0; i < 8; i++)  {
135
      pinWrite(SI, (val & (1 << i)));
136
    P1OUT |= SCL;
137
    P1OUT ^= SCL;
138
  }
139
}

Wäre wahnsinnig toll wenn da mal jemand was zu sagen könnte.

Liebe Grüße
Littlegonzo

von Harry S. (littlegonzo)


Lesenswert?

Hat denn wirklich niemand eine Idee?

von Johann (Gast)


Lesenswert?

Harry S. schrieb:
> Hat denn wirklich niemand eine Idee?

1) Oszi dranhängen, Signal aufzeichnen, mit 644 vergleichen.
2) Der MSP arbeitet bei Dir mit 1MHz, soweit ich sehen kann. Passt das?
3) Der 2231 hat ein SPI-Interface eingebaut, warum benutzt Du das nicht?

von Harry S. (littlegonzo)


Lesenswert?

Ich weiß das der 2231 ein SPI-Interface eingebaut hat, doch bisher 
steige ich durch die Datenblätter von TI noch nicht durch....
Ich finde sie leider nicht so sonderlich klar durchdacht wie z.b. die 
von Atmel :(

Das mit Oszi wäre eine super Sache, doch habe ich leider keines.
Wenn ich LEDs an die Pins stecke, verhalten die sich zumindest so wie 
sie sollen, CS, DatenOut, Reset, Clock, alles wie erwartet, ich teste 
das im Einzelschritt..doch....nix tut sich auf den Display.
Dummerweise kann ich den ATMega nicht im Einzelschritt testen da ich mit 
dem STK500 arbeite.

von Johann (Gast)


Lesenswert?

Nur, weil sich irgendwelche Pegel statisch so verhalten, wie sie sollen, 
müssen sie das lange noch nicht tun, wenn's dynamisch wird. Du könntest 
probieren, die Pegelwechsel langsamer zu gestalten, indem Du Pausen 
dazwischen einbaust. Oder Du besorgst Dir ein Oszi. Oder Du liest Dich 
in die SPI-Thematik ein. Oder Du besorgst Dir ein Oszi.

PS: Besorg' Dir ein OSZI!

von Harry S. (littlegonzo)


Lesenswert?

lol, hm...irgendwie lese ich in deinem Post immer das Wort Oszi, soll 
mir das etwas sagen?

Ja Du hast recht, es gibt immer wieder Argumente dafür...

von LuXXuS 9. (aichn)


Lesenswert?

Harry S. schrieb:
> Ich weiß das der 2231 ein SPI-Interface eingebaut hat, doch bisher
> steige ich durch die Datenblätter von TI noch nicht durch....

Also das SPI vom MSP ist wirklich ne Sache von 2 Minuten. Der User's 
Guide beeinhaltet alles super erklärt.

Sag womit du Probleme hast und dir wird geholfen.

von Harry S. (littlegonzo)


Lesenswert?

Hallo Dennis,
super vielen Dank. Ich schau es mir heute Abend nochmal an, die Register 
hab ich heute morgen entdeckt gehabt, aber zu mehr war ich noch nicht 
gekommen.

von Harry S. (littlegonzo)


Lesenswert?

Hallo Dennis,
wäre nett wenn du mal drüber schauen könntest, natürlich auch jeder 
andere der sich mit dem 430g2231 auskennt :)
Hab den Source mal weggelassen nur die spi_send ist noch drin, ist wohl
übersichtlicher.

typedef unsigned char  u8;

Konfiguration für SPI in der main()

USICTL0=USIPE7+USIPE6+USIPE5+USILSB+USIMST+USIGE+USIOE;
USICKCTL=USISSEL_1;

[c]
u8 spi_send(u8 val)
{
  u8 in;
  USISR=val;
  USICNT=USICNT3;
  while(USICTL1&(1<<USIIFG))
  in=USISR;
  return in;
}
[c]

Bin ich soweit richtig?
Liebe Grüße
Harry

von Harry S. (littlegonzo)


Lesenswert?

..läuft leider immer noch nicht. Hab das Display mal wieder an den 
ATMega angeschloßen und läuft. Also der InitString ist okay und auch die 
Pins sind richtig definiert. Irgendwas mit dem SPI haut noch nicht 
hin...

von LuXXuS 9. (aichn)


Angehängte Dateien:

Lesenswert?

Hi!

Also ich guck mir das nachher mal an. Hier ist mal eine Übersicht über 
die kompletten USI-Register. Das habe ich mir letztes Jahr mal gemacht, 
damit ich nicht immer durch den User's Guide gucken muss.

Gruß

von Icke M. (Firma: my-solution) (hendi)


Angehängte Dateien:

Lesenswert?

Ich hab dir mal ein Minimalbsp. angehängt mit dem bei mir das SPI 
funktioniert hat. War mit einem MCP23017 (SPI Version) von Microchip. 
Was ich bei mir festgestellt habe ist, dass ich immer nach einem Reboot 
einmal was raus schreiben musste, sonst hat die Kommunikation nicht 
funktioniert. In den Errata hab ich dazu aber nichts gefunden. Der Code 
für das SPI ist nicht von mir, der war von nem Ninja Serial SPI Adapter. 
Wie gesagt, funktioniert definitiv, einfach den MCP Kram ignorieren und 
nur die SPI relevanten Sachen raus nehmen.
EDIT: Das Project ist für das Code Composer Studio, geile IDE im 
Übrigen, nicht vergleichbar mit dem IAR Ding.

von Harry S. (littlegonzo)


Lesenswert?

Super, vielen Dank. Werde mich gleich mal dran machen.
Was mich allerdings noch ein wenig stört muß ich sagen, die 
verfügbarkeit dieser kleinen Sch**cherchen...
Die AVRs bekommt man ja echt an jeder Straßenecke inzwischen, aber bei 
den MSP430G2231 z.B. ist es fast günstiger immer die Boards zu kaufen ;)

von Harry S. (littlegonzo)


Lesenswert?

Nachtrag:
Ja das verwende ich auch, ganz angenehm. Auch wenn es echt ne Umstellung 
ist wenn man vorher nur mit dem PN oder der Atmel IDE gearbeitet hat. 
Aber ich bin ja lernwillig :)

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Naja, ist halt das Eclipse Feeling... . Tip, man kann bei TI auch 
samplen.

von Harry S. (littlegonzo)


Lesenswert?

Ja ich weiß, habe ich damals bei den PICs auch sehr gern gemacht :)

Wow es läuft super!!!!

EXTREM Wichtig, das erste mal senden Zeile spi_write8(0xff);
Hattest Du geschrieben und nu kann ich es sogar bestätigen!!

Keine Ahnung wieso, aber nu läuft es, merkwürdiges verhalten muß ich 
sagen.

So richtig was machen kann ich nu leider trotzdem nicht, da der Speicher 
nicht ausreicht um eine Kopie des Inhalts vorzuhalten :(
Aber Grundsätzlich gehts, darum gings erstmal!

Vielen Dank nochmals!!

Liebe Grüße

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Ja, am Speicher bin ich dann auch gescheitert. Ich glaub das Wissen 
könnte man vll. für einen seriell SPI Adapter nehmen, wo man die Daten 
nur durchreicht, so wie das bei dem Ninja Projekt gemacht wurde. Was 
willst du denn bauen?

von LuXXuS 9. (aichn)


Lesenswert?

Jetzt haste's hinbekommen :)

...wollt dir grad nen Quelltext als Beispiel posten. Aber dann ist's ja 
gut.

von Harry S. (littlegonzo)


Lesenswert?

Dennis kannst Du trotzdem gern machen. Momentan kann ich soviele Sourcen 
wie möglich brauchen :)

Naja das Display hatte ich nur grad rumliegen, wollte nur testen obs 
damit eben läuft. Das mit dem Speicher war ja schon von vornherein klar 
;)
Ich habe vor die MSP mit den RF868 zu nutzen, dafür brauche ich ja 
ebenfalls die SPI Schnittstelle die nun läuft. Habs auch inzwischen 
angepasst und den Takt auf max geschaltet. Damit ist das Display echt 
sehr schnell.
Vorher bei der Routine konnte ich sehen wie er die Zeilen beschrieb oder 
löschte, jetzt ist es eben einfach leer oder voll beschrieben.
War auch t/128 eingeschaltet.

von LuXXuS 9. (aichn)


Lesenswert?

Also das war mal zum Auslesen eines externen ADCs. Ist sehr simpel 
gestrickt...so würde ich es nicht mehr machen, weil ohne Interrupts mit 
Warteschleifen, aber es geht glaube ich auch mehr um die 
Initialisierung.

Hier werden auch nur Daten reingeholt, keine verschickt. Daher ohne SDO. 
Ich muss mal gucken, wo ich noch andere Beispiele zum USI hab. Benutz 
den kaum noch, weil die größeren Modelle alle USCIs haben, die ja wieder 
ganz anders sind.

Aber ich mein, jetzt haste es eh schon hinbekommen :)
Bei konkreten Fragen helfe ich dir natürlich gern.
1
/************************************************************************
2
 * ADC LTC2411 - Test-Ansteuerung                                       *
3
 ************************************************************************
4
 * Dennis E.                 29.10.2009          IAR Embedded Workbench *
5
 *                                                                      *
6
 * MSP430F2013 (eZ430F2013 Texas Instruments USB Flash-Emulation-Tool)  *
7
 ************************************************************************
8
 * MSP PIN-Belegungen:                                                  *
9
 * -------------------                                                  *
10
 *                          __________                                  *
11
 *                   Vcc  =|1°      14|=  Vss                           *
12
 *   P1.0/TACLK/ACLK/A0+  =|2   F   13|=  XIN/P2.6/TA1                  *
13
 *      P1.1/TA0/A0-/A4+  =|3   2   12|=  XOUT/P2.7                     *
14
 *      P1.2/TA1/A1+/A4-  =|4   0   11|=  TEST/SBWTK                    *
15
 *         P1.3/VREF/A1-  =|5   1   10|=  °RST/NMI/SBWTDIO              *
16
 *    P1.4/SMCLK/A2+/TCK  =|6   3    9|=  P1.7/A3-/SDI/SDA/TDO/TDI      *
17
 * P1.5/TA0/A2-/SCLK/TMS  =|7________8|=  P1.6/TA1/A3+/SDO/SCL/TDI/TCLK *
18
 *                                                                      *
19
 ************************************************************************
20
 * LTC2411 Pin-Belegungen:                                              *
21
 * -----------------------                                              *
22
 *                          __________                                  *
23
 *                   Vcc  =|1°  2   10|=  F0                            *
24
 *                  REF+  =|2   4    9|=  SCK                           *
25
 *                  REF-  =|3   1    8|=  SDO                           *
26
 *                   IN+  =|4   1    7|=  °CS                           *
27
 *                   IN-  =|5________6|=  GND                           *
28
 *                                                                      *
29
 ************************************************************************
30
 * Datenstrom ADC:                                                      *
31
 * ---------------                                                      *
32
 *                                                                      *
33
 *    32-Bit insgesamt, 24 davon Konversionsergebnis (MSB first)        *
34
 *     -------------------------------------------------------          *
35
 *    | Bit31 | Bit30 | Bit29 | Bit28 - Bit05 | Bit04 - Bit00 |         *
36
 *    |  EOC  |  "0"  | SIGN  |  MSB     LSB  |   SUB LSBs    |         *
37
 *     -------------------------------------------------------          *
38
 *                                                                      *
39
 ************************************************************************
40
 * Port-Belegungen:                                                     *
41
 * ----------------                                                     *
42
 *                                                                      *
43
 * P1.0:                                                                *
44
 * P1.1:                                                                *
45
 * P1.2:                                                                *
46
 * P1.3:                                                                *
47
 * P1.4:                                                                *
48
 * P1.5: SCK (Clock-Signal)                                             *
49
 * P1.6:                                                                *
50
 * P1.7: SDO (Serial Data Out vom ADC - SDI am MSP)                     *
51
 * P2.6:                                                                *
52
 * P2.7: CS  (active low)                                               *
53
 *                                                                      *
54
 ************************************************************************/
55
56
#include "msp430x20x3.h"
57
58
...
59
60
void main( void )
61
{
62
  
63
64
  WDTCTL = WDTPW + WDTHOLD;              // Watchdog Timer anhalten
65
66
  ...
67
68
//****************************************************************************
69
  // USI initialisieren
70
  // ------------------
71
  //
72
  // USICTL0 - USI Control Register 0
73
  // --------------------------------
74
  // SDI/SDA enable + SCLK enable + Master Select + Software Reset
75
     USICTL0 = USIPE7 + USIPE5 + USIMST + USISWRST;
76
  
77
  // USICKCTL - USI Clock Control Register
78
  // -------------------------------------
79
  // Clock Divider Select 128 + Clock Source Select SMCLK
80
     USICKCTL = USIDIV_7 + USISSEL_2;
81
  
82
  // USICNT - USI Bit Counter Register
83
  // ---------------------------------
84
  // 16-Bit Shit Register Enable
85
     USICNT = USI16B;
86
  
87
  //----------------------------------------------------------------------------   
88
     
89
  // USI Software Reset loeschen
90
     USICTL0 &= ~USISWRST;
91
  
92
  // USI Interrupt Flag loeschen
93
     USICTL1 &= ~USIIFG;
94
95
  //****************************************************************************
96
    
97
  ...
98
  
99
} //Ende Main
100
101
102
103
void adceinlesen (void)
104
{
105
  ADC_E;                           // ADC enable
106
  while (EOC) {}                   // Pruefen ob Wandlung fertig
107
  USICNT = 16;                     // Oberen 16 Bit einlesen
108
  while (!(USIIFG & USICTL1)) {}   // Warten bis 16 Bit empfangen wurden
109
  byte1 = USISRH;                  // Hoeheres oberes Byte speichern
110
  byte2 = USISRL;                  // Niedrigeres oberes Byte speichern
111
  USICNT = 16;                     // Unteren 16 Bit einlesen
112
  while (!(USIIFG & USICTL1)) {}   // Warten bis 16 Bit empfangen wurden
113
  byte3 = USISRH;                  // Hoeheres unteres Byte speichern
114
  byte4 = USISRL;                  // Niedrigeres unteres Byte speichern
115
  ADC_D;                           // ADC disable
116
}

von Harry S. (littlegonzo)


Lesenswert?

Hallo Dennis,
vielen Dank für die Sourcen!!

Mein Display läuft auch inzwischen soweit.
Bin leider noch nicht dazu gekommen die RFM zu testen, darum ging es 
eigentlich ja ;) Das display war nur weil ich grad rumliegen hatte ;)

Liebe Grüße
Harry

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.