mikrocontroller.net

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


Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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
//***************************************************************************************
// MSP430 Driver for Dogm132x32
//
// 
//
// MSP430g2231
//
//***************************************************************************************
#include <msp430g2231.h>
 
//Define our pins 
#define HG BIT0
#define SI BIT7
#define SCL BIT6
#define A0 BIT5
#define RST BIT3
#define CS BIT4

#define Lcd_Select()        P1OUT &= ~(CS)
#define Lcd_Deselect()      P1OUT |=(CS)
#define Lcd_A0_LO()         P1OUT &=~(A0)
#define Lcd_A0_HI()         P1OUT |=(A0)
#define Lcd_Reset_HI()      P1OUT |=(RST)
#define Lcd_Reset_LO()      P1OUT &=~(RST)
#define HG_on()        P1OUT |=(HG)
#define HG_off()      P1OUT &=~(HG) 
#define LCD_HEIGHT       64
#define LCD_WIDTH       128

const char Lcd_InitData[] = {  0x40,   // Display Start Line 0
  0xA1,   // Display Normal
  0xC0,   // Set Bias
  0xA6,   // Power Control set
  0xA2,   // Booster Ratio set
  0x2F,   // ""
  0xF8,   // // V0 Voltage regulator set
  0x00,   // Static Indicator set
  0x23,   // ""
  0x81,  // Display on/off
  0x1F,
  0xAD,
  0x00,
  0xAF};

// Declare functions
void delay ( unsigned int );
void Lcd_Init(void);
void Lcd_Clear(unsigned char inv);
void pinWrite( unsigned char bit, unsigned char val );
void shiftOut(unsigned char val);

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P1OUT=0x00;
  Lcd_Deselect(); 
  Lcd_Reset_HI();
  P1DIR = HG + SI + SCL + A0 + RST + CS;  // Setup pins as outputs
  //Do a "ping-pong" effect back and forth
  Lcd_Init();
  Lcd_Clear(1);
  for(;;){
    HG_on();
    delay(500);
    HG_off(); 
    delay(500);
    }
}

// Delays by the specified Milliseconds
// thanks to:
// http://www.threadabort.com/archive/2010/09/05/msp430-delay-function-like-the-arduino.aspx
void delay(unsigned int ms)
{
 while (ms--)
    {
        __delay_cycles(1000); // set for 16Mhz change it to 1000 for 1 Mhz
    }
}

void Lcd_Init(void)
{
  unsigned int i;
  char y;
  Lcd_Reset_LO();
  Lcd_Reset_HI();   // Display Reset-Leitung High
  
  Lcd_Select();     // Display selektieren
  Lcd_A0_LO();      // Command-Mode
  for(i = 0; i < sizeof(Lcd_InitData); i++) {
    shiftOut(Lcd_InitData[i]);
  }
  Lcd_Deselect();   // Display deselektieren
}

void Lcd_Clear(unsigned char inv)
{
  unsigned char x, y;

  Lcd_Select();       // Display selektieren
  for(y = 0; y < 8; y++) {
    Lcd_A0_LO();      // Command-Mode
    shiftOut(0xB0 + y); // Row select
    shiftOut(0x10);     // Column select high
    shiftOut(0x00);     // Column select low
    Lcd_A0_HI();      // Data-Mode
    if(inv)
    for(x = 0; x < 128; x++) { shiftOut(255);}
    else
    for(x = 0; x < 128; x++) { shiftOut(0);}
    }
   Lcd_Deselect();     // Display deselektieren
}
// Writes a value to the specified bitmask/pin. Use built in defines
// when calling this, as the shiftOut() function does.
// All nonzero values are treated as "high" and zero is "low"
void pinWrite( unsigned char bit, unsigned char val )
{
  if (val){
    P1OUT |= bit;
  } else {
    P1OUT &= ~bit;
  }
}
 
// Take the given 8-bit value and shift it out, LSB to MSB
void shiftOut(unsigned char val)
{
  char i;
 
  // Iterate over each bit, set data pin, and pulse the clock to send it
  // to the shift register
  for (i = 0; i < 8; i++)  {
      pinWrite(SI, (val & (1 << i)));
    P1OUT |= SCL;
    P1OUT ^= SCL;
  }
}

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

Liebe Grüße
Littlegonzo

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn wirklich niemand eine Idee?

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: LuXXuS 909 (aichn)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: LuXXuS 909 (aichn)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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ß

Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ist halt das Eclipse Feeling... . Tip, man kann bei TI auch 
samplen.

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: LuXXuS 909 (aichn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt haste's hinbekommen :)

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

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: LuXXuS 909 (aichn)
Datum:

Bewertung
0 lesenswert
nicht 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.
/************************************************************************
 * ADC LTC2411 - Test-Ansteuerung                                       *
 ************************************************************************
 * Dennis E.                 29.10.2009          IAR Embedded Workbench *
 *                                                                      *
 * MSP430F2013 (eZ430F2013 Texas Instruments USB Flash-Emulation-Tool)  *
 ************************************************************************
 * MSP PIN-Belegungen:                                                  *
 * -------------------                                                  *
 *                          __________                                  *
 *                   Vcc  =|1°      14|=  Vss                           *
 *   P1.0/TACLK/ACLK/A0+  =|2   F   13|=  XIN/P2.6/TA1                  *
 *      P1.1/TA0/A0-/A4+  =|3   2   12|=  XOUT/P2.7                     *
 *      P1.2/TA1/A1+/A4-  =|4   0   11|=  TEST/SBWTK                    *
 *         P1.3/VREF/A1-  =|5   1   10|=  °RST/NMI/SBWTDIO              *
 *    P1.4/SMCLK/A2+/TCK  =|6   3    9|=  P1.7/A3-/SDI/SDA/TDO/TDI      *
 * P1.5/TA0/A2-/SCLK/TMS  =|7________8|=  P1.6/TA1/A3+/SDO/SCL/TDI/TCLK *
 *                                                                      *
 ************************************************************************
 * LTC2411 Pin-Belegungen:                                              *
 * -----------------------                                              *
 *                          __________                                  *
 *                   Vcc  =|1°  2   10|=  F0                            *
 *                  REF+  =|2   4    9|=  SCK                           *
 *                  REF-  =|3   1    8|=  SDO                           *
 *                   IN+  =|4   1    7|=  °CS                           *
 *                   IN-  =|5________6|=  GND                           *
 *                                                                      *
 ************************************************************************
 * Datenstrom ADC:                                                      *
 * ---------------                                                      *
 *                                                                      *
 *    32-Bit insgesamt, 24 davon Konversionsergebnis (MSB first)        *
 *     -------------------------------------------------------          *
 *    | Bit31 | Bit30 | Bit29 | Bit28 - Bit05 | Bit04 - Bit00 |         *
 *    |  EOC  |  "0"  | SIGN  |  MSB     LSB  |   SUB LSBs    |         *
 *     -------------------------------------------------------          *
 *                                                                      *
 ************************************************************************
 * Port-Belegungen:                                                     *
 * ----------------                                                     *
 *                                                                      *
 * P1.0:                                                                *
 * P1.1:                                                                *
 * P1.2:                                                                *
 * P1.3:                                                                *
 * P1.4:                                                                *
 * P1.5: SCK (Clock-Signal)                                             *
 * P1.6:                                                                *
 * P1.7: SDO (Serial Data Out vom ADC - SDI am MSP)                     *
 * P2.6:                                                                *
 * P2.7: CS  (active low)                                               *
 *                                                                      *
 ************************************************************************/

#include "msp430x20x3.h"

...

void main( void )
{
  

  WDTCTL = WDTPW + WDTHOLD;              // Watchdog Timer anhalten

  ...

//****************************************************************************
  // USI initialisieren
  // ------------------
  //
  // USICTL0 - USI Control Register 0
  // --------------------------------
  // SDI/SDA enable + SCLK enable + Master Select + Software Reset
     USICTL0 = USIPE7 + USIPE5 + USIMST + USISWRST;
  
  // USICKCTL - USI Clock Control Register
  // -------------------------------------
  // Clock Divider Select 128 + Clock Source Select SMCLK
     USICKCTL = USIDIV_7 + USISSEL_2;
  
  // USICNT - USI Bit Counter Register
  // ---------------------------------
  // 16-Bit Shit Register Enable
     USICNT = USI16B;
  
  //----------------------------------------------------------------------------   
     
  // USI Software Reset loeschen
     USICTL0 &= ~USISWRST;
  
  // USI Interrupt Flag loeschen
     USICTL1 &= ~USIIFG;

  //****************************************************************************
    
  ...
  
} //Ende Main



void adceinlesen (void)
{
  ADC_E;                           // ADC enable
  while (EOC) {}                   // Pruefen ob Wandlung fertig
  USICNT = 16;                     // Oberen 16 Bit einlesen
  while (!(USIIFG & USICTL1)) {}   // Warten bis 16 Bit empfangen wurden
  byte1 = USISRH;                  // Hoeheres oberes Byte speichern
  byte2 = USISRL;                  // Niedrigeres oberes Byte speichern
  USICNT = 16;                     // Unteren 16 Bit einlesen
  while (!(USIIFG & USICTL1)) {}   // Warten bis 16 Bit empfangen wurden
  byte3 = USISRH;                  // Hoeheres unteres Byte speichern
  byte4 = USISRL;                  // Niedrigeres unteres Byte speichern
  ADC_D;                           // ADC disable
}

Autor: Harry S. (littlegonzo)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.