[MSP430G2553] Einige Ausgangsports funktionieren nicht

Gast #3711132
Lesenswert?
• ▲
▼
Hey, ich wollte mit meinem MSP Schieberegister ansteuern. Zuerst habe 
ich eine minimale Schaltung aufgebaut ohne Last, um zu überprüfen, ob 
die Ausgänge funktionieren(siehe Anhang). Mein CLK und mein OE 
funktionieren wunderbar. Auf den anderen Ports Latch und SIMO passiert 
nichts. Ich kann mir das nicht erklären und wäre für eine Hilfe dankbar.
Angehängte Dateien:
Gast #3711136
Lesenswert?
• ▲
▼
Sry nochmal. Mein Code:
1
#include "msp430g2553.h"
2

3

4

5
void delay(unsigned int i);
6
void enable(void);
7
void disable(void);
8
void latch_on(void);
9
void latch_off(void);
10
void write_SPI(unsigned long long data);
11

12

13
volatile unsigned long long Data; //64 bit
14
int i, k;
15

16
int main(void)
17
{ 
18
 
19
  //int i;
20
    WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
21
    BCSCTL1 = CALBC1_1MHZ;    //changing the DCO's oscillations to 16MHz
22
    DCOCTL = CALDCO_1MHZ;
23
    
24
    //P2SEL =0;
25
    //P1SEL =0;
26
    
27
    P2DIR |= 0xC6;
28
    P1DIR |= 0x14;
29
    P1SEL |= 0x14;
30
    P2SEL &= ~0xC0;
31
    //P3SEL |= 0x31;
32
    UCA0CTL1 |= UCSWRST;                     // RESET
33
    UCA0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC;
34
    UCA0CTL1 |= UCSSEL_2;     
35
    UCA0BR0 = 0x00;
36
    UCA0BR1 = 0;
37
    UCA0MCTL = 0;
38
    UCA0CTL1 &= ~UCSWRST; 
39
    
40
    //printf("Hallo Welt\n");
41
    
42
    Data=0x11D521084;
43
    while(1)
44
      {
45
    if (Data==0x8EA908420000)
46
      {
47
        Data=0x11D521084;
48
        k=0;
49
      }
50

51
    if(k==1)
52
      {
53
    Data=Data<<5;                                 // Increment Data value
54
      }
55
    write_SPI(Data);
56
    latch_on();
57
    enable();
58
    delay(500);
59
    disable();
60
    k=1;
61
    }
62
}
63
    
64
// Fubnktion Daten in den Shiftregister schieben
65

66
void write_SPI(unsigned long long data)
67
{  
68
    latch_off();
69
    while (!(IFG2 & UCA0TXIFG));            // USCI_A0 TX buffer ready?
70
    UCA0TXBUF = data>>56;                       // Byte to SPI TXBUF
71
    while (!(IFG2 & UCA0TXIFG));            // USCI_A0 TX buffer ready?
72
    UCA0TXBUF = data>>48;                       // Byte to SPI TXBUF
73
    while (!(IFG2 & UCA0TXIFG));            // USCI_A0 TX buffer ready?
74
    UCA0TXBUF = data>>40;                       // Byte to SPI TXBUF
75
    while (!(IFG2 & UCA0TXIFG));            // USCI_A0 TX buffer ready?
76
    UCA0TXBUF = data>>32;                       // Byte to SPI TXBUF
77
    while (!(IFG2 & UCA0TXIFG));            // USCI_A0 TX buffer ready?
78
    UCA0TXBUF = data>>24;                       // Byte to SPI TXBUF
79
    while (!(IFG2 & UCA0TXIFG));            // USCI_A0 TX buffer ready?
80
    UCA0TXBUF = data>>16;                       // Byte to SPI TXBUF
81
    while (!(IFG2 & UCA0TXIFG));            // USCI_A0 TX buffer ready?
82
    UCA0TXBUF = data>>8;                       // Byte to SPI TXBUF
83
    while (!(IFG2 & UCA0TXIFG));            // USCI_A0 TX buffer ready?
84
    UCA0TXBUF = data;                       // Byte to SPI TXBUF
85
    while (!(IFG2 & UCA0TXIFG));            // USCI_A0 TX buffer ready?
86
    //delay(100);            // Delay  
87
}
88

89
void latch_on( void )
90
{
91
  P2OUT |= 0x4;
92
  P2OUT &= ~0x4;
93
 
94
} 
95

96
void latch_off(void)
97
{
98
  P2OUT &= ~0x4;
99
}
100

101
void delay(unsigned int ms)
102
{
103
   while (ms--)
104
    {
105
         __delay_cycles(1000); 
106
    }
107
}
108

109
void enable( void )
110
{
111
  P2OUT &= ~0x2;
112
}
113
 
114
void disable( void )
115
{
116
  P2OUT |= 0x2;
117
}
Persönliche Seite #3711202
Lesenswert?
• ▲
▼
Steffen M. schrieb:
>     P1SEL |= 0x14;
>     P2SEL &= ~0xC0;

Hast Du Dir im "Family User's Guide" mal angesehen, wie diese beiden 
Register nach dem POR initialisiert sind?

Hältst Du das hier

>     P2SEL &= ~0xC0;

tatsächlich für lesbarer als das hier?

>     P2SEL &= 0x3F;

Und warum verwendest Du hier hexadezimale Konstanten, statt die in den 
Headerfiles für die einzelnen Bits definierten #defines zu nutzen?

Und ist Dir aufgefallen, daß die Funktion "latch_on" das Bit setzt, um 
es sofort danach wieder zu löschen? Wozu dient dann die Funktion 
"latch_off"?
Gast #3711234
Lesenswert?
• ▲
▼
Rufus, deine Gegenfragen sind nich hilfreich.

> Hältst Du das hier
>     P2SEL &= ~0xC0;
> tatsächlich für lesbarer als das hier?
>     P2SEL &= 0x3F;

Ja, ich schon.

> Und ist Dir aufgefallen, daß die Funktion "latch_on" das Bit setzt,
> um es sofort danach wieder zu löschen?

Na und, genau dieses Verhalten ist wohl gewollt. Ich nehem an, dadurch 
soll das Takt-Signal für das Schieberegister erzeugt werden. Was ist 
daran falsch? Ich würde eher den irreführenden Namen der Funktion 
kritisieren.

> Wozu dient dann die Funktion "latch_off"?
Offensichtlich ein ungenutzter Überrest aus Zeiten, als die latch_on 
Funktion noch das tata, was ihr Name suggeriert.
Gast #3711299
Lesenswert?
• ▲
▼
So, das Problem habe ich gelöst. Der Blick ins Blockschaltbilder hat 
mein Fehler aufgezeigt.

Bei mir habe ich nur P1SEL gemaacht. Dadurch wird aber nur der Timer 
durchgeschoben.

Man musste auch P2SEL für USCI benutzen:
1
// [...]
2
BCSCTL2 = 0;
3

4
    P2SEL =0;
5
    P2SEL2 =0;
6
    P1SEL =0;
7
    P1SEL2 =0;
8

9
    P1DIR =0;
10
    P2DIR =0;
11

12
    P1DIR |= BIT2 + BIT4;
13
    P2DIR |= BIT1 + BIT2;
14

15
    P1SEL |= BIT2 + BIT4;
16
    P1SEL2 |= BIT2 + BIT4;
17
    
18
    //P2DIR |= 0xCA;
19
    //P1DIR |= 0x14;
20
    //P1SEL |= 0x14;
21
    //P2SEL &= ~0xC0;
22
    //P3SEL |= 0x31;
23
    UCA0CTL1 |= UCSWRST;                     // RESET
24
[...]

latch_off ist tasächlich aus früheren Zeiten. Ich glaube die Idee war um 
ein LOW auf dem Latch Port sicherzustellen vor dem Schieben der 
Daten(MOSI).

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.