MSP430G2231 (Launchpad) und Dogm132-5

OP #2078413
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
OP #2079294
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.
Gast #2079303
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!
OP #2079807
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
(Firma: my-solution) #2080353
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.
Angehängte Dateien:
OP #2080410
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
OP #2080480
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.
#2080550
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
}

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