Forum: Mikrocontroller und Digitale Elektronik Msp430F5438 DC77 Signal


von Ausländer (Gast)


Lesenswert?

Guten Abend
also, ich bin Neuling in Bereich Micorcontroller .
mein Problem ist: Ich will das Signal vom DCF77 sichtbar machen indem 
ein Led leuchtet wenn das Signal vorhanden ist. Leider passiert nichts. 
Kann mir jemand sagen was ich falsch mache danke
1
//7.4 sin  7.6 vcc 
2
3
4
#include "msp430x54x.h"
5
6
void main(void)
7
{
8
 PAOUT  = 0;
9
  PADIR  = 0xFFFF;  
10
  PASEL  = 0;
11
  PBOUT  = 0;  
12
  PBDIR  = 0xFFFF;
13
  PBSEL  = 0;
14
  PCOUT  = 0;    
15
  PCDIR  = 0xFFFF;
16
  PCSEL  = 0;  
17
  PDOUT  = 0;  
18
  PDDIR  = 0xFFFF;
19
  PDSEL  = 0;  
20
  PEOUT  = 0;  
21
  PEDIR  = 0xFEFF;                                                          
22
  PESEL  = 0;  
23
  P11OUT = 0;
24
  P11DIR = 0xFF;
25
  PJOUT  = 0;    
26
  PJDIR  = 0xFF;
27
  P11SEL = 0;
28
  
29
    
30
  
31
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
32
  TA1CCTL0 = CCIE;                          // CCR0 Interrupt Aktivieren
33
  TA1CCR0 = 125;
34
  TA1CTL = TASSEL_1 + MC_1 + TACLR; 
35
  
36
  
37
  P1DIR |= 0x01;                           //  LED1
38
  P1DIR |= 0x02;                           // LED e 
39
  P7DIR |= BIT6;                           // DCF77 VCC
40
  P7IN  |= BIT4;
41
  
42
  
43
  
44
   P7OUT =BIT6;                            // DCF77 VCC--->1
45
  
46
  
47
 
48
49
  __bis_SR_register(LPM3_bits + GIE);       // LPM3 Modus + Interrupts Aktivieren 
50
 
51
}
52
53
54
55
#pragma vector=TIMER1_A0_VECTOR
56
__interrupt void TIMER1_A0_ISR(void)
57
{
58
 
59
  P1OUT ^= 0x01;                            // LED1 Blincken
60
  if((P7IN&BIT4))
61
   {
62
   P1OUT ^=0x02;                        // LED2 Blincken wenn DCF77 Signal( port 7.6) vohanden ist 
63
   }  
64
65
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ausländer schrieb:
>   PAOUT  = 0;
>   PADIR  = 0xFFFF;
>   PASEL  = 0;
>  ....
>   PJDIR  = 0xFF;
>   P11SEL = 0;

Was soll das?


Die Initialisierung von P7 solltest Du Dir nochmal genauer ansehen.

Ausländer schrieb:
>   P7DIR |= BIT6;                           // DCF77 VCC

Mit Deiner etwas willkürlichen Initialisierung am Anfang

>  PDDIR  = 0xFFFF;

hast Du alle Bits in P7DIR bereits auf 1 gesetzt, damit ist jedes 
der Bits ein Eingang.

PDDIR nämlich sind P7DIR und P8DIR zu einem 16-Bit-Register 
zusammengefasst.

>   P7IN  |= BIT4;

Was bringt es, P7IN zu beschreiben? Das ist ein read-only Register.

von Ausländer (Gast)


Lesenswert?

Dankeschön für Deine Antwort

Rufus t. Firefly schrieb:
> Mit Deiner etwas willkürlichen Initialisierung am Anfang
>
>  PDDIR  = 0xFFFF;
>
> hast Du alle Bits in P7DIR bereits auf 1 gesetzt, damit ist jedes
>
> der Bits ein Eingang.

Kann man dies nicht überschreiben?


Die Initialisierung :
PAOUT = 0;
PADIR = 0xFFFF;
PASEL = 0;
PBOUT = 0;
PBDIR = 0xFFFF
...
wenn ich die weglasse dann habe ich nur 1.4V statt 3v (im output) .


Ich habe es jetzt so gemacht aber es ist genau wie vorher Led1 blinkt 
aber Led2 nicht
1
//7.4 sin  7.6 vcc 
2
3
4
#include "msp430x54x.h"
5
6
void main(void)
7
{
8
 
9
  
10
    
11
  
12
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
13
  TA1CCTL0 = CCIE;                          // CCR0 Interrupt Aktivieren
14
  TA1CCR0 = 125;
15
  TA1CTL = TASSEL_1 + MC_1 + TACLR; 
16
  
17
  
18
  P1DIR |= 0x01;                           //  LED1
19
  P1DIR |= 0x02;                           // LED e 
20
  P7DIR |= BIT6;                           // DCF77 VCC
21
 
22
  
23
  
24
  
25
   P7OUT =BIT6;                            // DCF77 VCC--->1
26
  
27
  
28
 
29
30
  __bis_SR_register(LPM3_bits + GIE);       // LPM3 Modus + Interrupts Aktivieren 
31
 
32
}
33
34
35
36
#pragma vector=TIMER1_A0_VECTOR
37
__interrupt void TIMER1_A0_ISR(void)
38
{
39
 
40
  P1OUT ^= 0x01;                            // LED1 Blincken
41
  if((P7IN&BIT4))
42
   {
43
   P1OUT ^=0x02;                        // LED2 Blincken wenn DCF77 Signal( port 7.4) vohanden ist 
44
   }  
45
46
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ausländer schrieb:
> Rufus t. Firefly schrieb:
>> Mit Deiner etwas willkürlichen Initialisierung am Anfang
>>
>>  PDDIR  = 0xFFFF;
>>
>> hast Du alle Bits in P7DIR bereits auf 1 gesetzt, damit ist jedes
>> der Bits ein Eingang.
>
> Kann man dies nicht überschreiben?

Ja, natürlich kann man das. Aber genau das tust Du nicht, Du setzt nur 
das sowieso schon gesetzte Bit 6 nochmal, löschst aber keines der 
anderen:

>  P7DIR |= BIT6;                           // DCF77 VCC

Sinnvoller wäre hier

   P7DIR = BIT6;                           // DCF77 VCC

von Ausländer (Gast)


Lesenswert?

Hallo
irgendwie läuft alles anderes, wie ich es haben will. Ich habe das dcf77 
abgeklemmt --> led2 blinkt
habe das Ganze in Debug-Watch(ccs4)
Port_7_8_P7IN.P7IN4 =1 wenn dcf77 mit msp430 nicht verbunden ist .
Port_7_8_P7IN.P7IN4 =0 wenn dcf77 mit msp430 verbunden ist.
Das ist aber das Gegenteil was ich haben will

von Dennis (Gast)


Lesenswert?

Guten morgen lieber Ausländer!

Also ich weiß bis jetzt nicht gnau, was du vor hast, aber mal ein paar 
Hinweise zu deinem Programm:

Wie du ja schon bemerkt hast, werden die Ports beim MSP üblicherweise 
NICHT mit PA, PB usw. angesprochen, sondern mit P1, P2 usw.

Welches Signal möchtest du denn genau vom DCF-Empfänger am MSP sichtbar 
machen? Und welches DCF-Modul benutzt du überhaupt?

Bist du dir sicher, dass du mit LPM3 nicht zuviel im Controller 
abschaltest? Da läuft meines Wissens nurnoch der ACLK. Benutzt du den? 
Für deinen Timer hast du den ja als Quelle eingestellt, aber hast du da 
auch einen Quarz dran? Wenn ja, OK, aber welchen, dann erklärt sich 
vielleicht auch der Timer mit seinen 125 Takten. Wieso fragst du den 
Eingang überhaupt in einem Timer ab?

von Wolfgang-G (Gast)


Lesenswert?

>also, ich bin Neuling in Bereich Micorcontroller .
jeder fängt mal an.
Hast Du schon mal mit Deinem µC eine LED nach Deinem Willen zum Blinken 
gebracht? Oder die allgemeinen Spielchen, die man man als Anfänger so 
macht.
MfG

von Ausländer (Gast)


Lesenswert?

Guten Morgen

Dennis schrieb:

> machen? Und welches DCF-Modul benutzt du überhaupt?

Ich habe das DCF77 Modul vom Conrad

> Welches Signal möchtest du denn genau vom DCF-Empfänger am MSP sichtbar

Also dcf77 von Conrad hat 2 Signalausgänge Sout und non-Sout, ich möchte 
Sout mit uC bearbeiten

Dennis schrieb:
> Bist du dir sicher, dass du mit LPM3 nicht zuviel im Controller
> abschaltest? Da läuft meines Wissens nurnoch der ACLK.

LPM3 reicht(glaube ich ). ich brauch nur den ACLK

Dennis schrieb:
> Für deinen Timer hast du den ja als Quelle eingestellt, aber hast du da
> auch einen Quarz dran? Wenn ja, OK, aber welchen, dann erklärt sich
> vielleicht auch der Timer mit seinen 125 Takten

ja ich habe  einen XT2 mit 12Mhz

Dennis schrieb:
> Wieso fragst du den  Eingang überhaupt in einem Timer ab?

Ich glaube um ein Signal zufangen braucht macht ein Interrupt, und weil 
das P7 ist und kein P1_2 ist habe ich den Timer genommen?

Wolfgang-G schrieb:
> Hast Du schon mal mit Deinem µC eine LED nach Deinem Willen zum Blinken
> gebracht? Oder die allgemeinen Spielchen, die man man als Anfänger so
> macht.

:) ja das habe ich schon (mit while,[TimerA,timerB Rtc und 
watchdog]-Interrups , mit Taster ... das war alles Pout .jetzt bin bei 
der 2te stufe Pin

von Dennis (Gast)


Lesenswert?

Ausländer schrieb:
> ja ich habe  einen XT2 mit 12Mhz

Du musst deine Taktquelle aber auch auf den Quarz umstellen... Und der 
ACLK ist i.d.R. nur für LF-Quarze wie die Uhrenquarze. Aber auch bei dem 
muss man dem Controller sagen, dass einer existiert.

Du arbeitest mit dem internen DCO. Dass der Timer da überhaupt was 
macht, wundert mich.

Ausländer schrieb:
> Ich glaube um ein Signal zufangen braucht macht ein Interrupt, und weil
> das P7 ist und kein P1_2 ist habe ich den Timer genommen?

Also das ist Quark. Natürlich macht man es, um ein plötzlich 
auftretendes Signal zu erfassen, aber man kann nicht irgendeinen 
Interrupt nehmen, um den Pin abzufragen...??!!

Dann mach dir zum Test doch erstmal ein
1
while (1)
2
{
3
  if (P7IN & BIT4)
4
  {
5
    P1OUT |= 0x02;
6
  }
7
  else
8
  {
9
    P1OUT &= ~0x02;
10
  }
11
}

von Ausländer (Gast)


Lesenswert?

Hallo

Dennis schrieb:
> Du arbeitest mit dem internen DCO. Dass der Timer da überhaupt was
> macht, wundert mich


TA1CCTL0 = CCIE;
TA1CCR0 = 125;
TA1CTL = TASSEL_1 + MC_1 + TACLR;

In dem Fall ist ACLK = TACLK = 32768Hz  und DCO ist  ~1.045MHz
habe ich auch gemessen 131.7Hz ist fast gleich 32768Hz/(2*125)= 131.072 
Hz also der Timer funktioniert .

Dennis schrieb:
> aber man kann nicht irgendeinen
> Interrupt nehmen

Ja eben deswegen haben ich Timer A0 Interrupt genommen.

von Dennis (Gast)


Lesenswert?

Ausländer schrieb:
> In dem Fall ist ACLK = TACLK = 32768Hz

Also hast du doch nen Uhrenquarz dran?

Ausländer schrieb:
> (2*125)

Misst du die togglende LED?

Ausländer schrieb:
> Dennis schrieb:
>> aber man kann nicht irgendeinen
>> Interrupt nehmen
>
> Ja eben deswegen haben ich Timer A0 Interrupt genommen.

Das widerspricht sich doch gerade...

Wenn du nur erstmal ein Signal sehen willst, dann nimm doch erstmal die 
while-Schleife und gucke, was da los ist.

von Ausländer (Gast)


Lesenswert?

Hallo
Dennis schrieb:
> Also hast du doch nen Uhrenquarz dran?

ja das habe ich

Dennis schrieb:
> Misst du die togglende LED?

ja

Dennis schrieb:
> Ausländer schrieb:
>
>> Dennis schrieb:
>
>>> aber man kann nicht irgendeinen
>
>>> Interrupt nehmen
>
>>
>
>> Ja eben deswegen haben ich Timer A0 Interrupt genommen.
>
>
>
> Das widerspricht sich doch gerade...

jetzt bin ich überfordert.

Dennis schrieb:
> dann nimm doch erstmal die  while-Schleife und gucke, was da los ist

habe ich gemacht  ,blincken beide ob dcf77 darn ist,oder nicht  .

(Ah noch was ich habe das DCF77 direkt mit den Pins verbunden ist das 
Okay ?)

von Dennis (Gast)


Lesenswert?

Also irgendeinen Interrupt zu nehmen ist Blödsinn wollte ich damit 
sagen.

Mach den Timer weg und bau die while erstmal in die main.

Was macht dein DCF? Liefert die das ein HIGH oder LOW-Pegel oder ist es 
evtl. nur ein Open-Collector-Ausgang?

Setze vorsichtshalber mal noch das P7SEL &= ~BIT4.

Eigentlich braucht man das nicht, weil es das standardmäßig sein sollte, 
jedoch hatte ich auch schon MSPs, bei denen ein Port danach erst 
vernünftig anzusprechen war.

von Ausländer (Gast)


Lesenswert?

hallo

Dennis schrieb:
> Was macht dein DCF? Liefert die das ein HIGH oder LOW-Pegel oder ist es
>
> evtl. nur ein Open-Collector-Ausgang?

ist nur ein Open-Collector

Ich habe es jetzt so gemacht und es funktioniert.
(LED an wenn P7.4 und P7.6 verbunden sind .LED aus wenn nicht)
Ich glaube dann , dass das DCF77-Modul nicht in Ordnung ist.
1
//7.4 sin  7.6 vcc 
2
3
4
#include "msp430x54x.h"
5
6
void main(void)
7
{
8
 
9
  PAOUT  = 0;
10
  PADIR  = 0xFFFF;  
11
  PASEL  = 0;
12
  PBOUT  = 0;  
13
  PBDIR  = 0xFFFF;
14
  PBSEL  = 0;
15
  PCOUT  = 0;    
16
  PCDIR  = 0xFFFF;
17
  PCSEL  = 0;  
18
  PDOUT  = 0;  
19
  PDDIR  = 0xFFFF;
20
  PDSEL  = 0;  
21
  PEOUT  = 0;  
22
  PEDIR  = 0xFEFF;                                                          
23
  PESEL  = 0;  
24
  P11OUT = 0;
25
  P11DIR = 0xFF;
26
  PJOUT  = 0;    
27
  PJDIR  = 0xFF;
28
  P11SEL = 0;
29
  
30
  
31
  
32
  
33
  
34
    
35
  
36
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
37
  TA1CCTL0 = CCIE;                          // CCR0 Interrupt Aktivieren
38
  TA1CCR0 = 1000;
39
  TA1CTL = TASSEL_1 + MC_1 + TACLR; 
40
  
41
  
42
  P1DIR |= 0x01;                           //  LED1
43
  P1DIR |= 0x02;                           // LED e 
44
  P7DIR = BIT6;                           // DCF77 VCC
45
  P7REN = BIT4;                             
46
  
47
 
48
  
49
  
50
  
51
   P7OUT =BIT6;                            // DCF77 VCC--->1
52
   
53
  
54
 
55
while(1)
56
{
57
  __bis_SR_register(LPM3_bits + GIE);       // LPM3 Modus + Interrupts Aktivieren 
58
}
59
}
60
61
62
63
#pragma vector=TIMER1_A0_VECTOR
64
__interrupt void TIMER1_A0_ISR(void)
65
{
66
 
67
  P1OUT ^= 0x01;                            // LED1 Blincken
68
  if(P7IN & BIT4)
69
   {
70
   P1OUT ^= 0x02;                        // LED2 Blincken wenn DCF77 Signal( port 7.4) vohanden ist 
71
   return ;
72
   }  
73
74
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und jetzt lass mal den ganzen Krempel vor dem Abklemmen des Watchdogs 
weg. Der ist unnötig bzw. hat Nebeneffekte, die Dich 
durcheinanderbringen können.

von Ausländer (Gast)


Lesenswert?

:-) das habe ich weggemacht.
Ich habe noch eine Frage.
LED2 Blinkte noch eine Weile nach dem Abklemmen und habe P7REN = BIT4; 
dazugefügt ist das die richtige Lösung .
Danke für eure Hilfe.

von Dennis (Gast)


Lesenswert?

Ausländer schrieb:
> habe P7REN = BIT4;
> dazugefügt ist das die richtige Lösung

JA! Deswegen fragte ich nach dem Open-ColleCtor. Sonst geht es nämlich 
nicht.

von Dennis (Gast)


Lesenswert?

Obwohl du eigentlich dann auch P7OUT |= BIT4 setzen musst, um einen 
Pull-Up zu bekommen, den der Open-Collector dir nach unten ziehen kann.

Trotzdem - bei deinem Vorhaben hat das nichts mit dem Timer-Interrupt zu 
tun.

Aber wenn es dir so reicht, dann ist doch prima!

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.