Forum: Mikrocontroller und Digitale Elektronik MSP430 ADC-funktioniert nicht


von GS (chromosoma)


Lesenswert?

Abend
Ich versuche mein erstes Projekt auf MSP430F2013 zu programmieren, 
leieder stoße ich auf einige Probleme:

Die Idee ist folgende:
µC schläft in LPM3M während  TimerA zählt, und in regelmäßigen Abständen 
die ADC-Wandlung startet. Der AD misst interne Temperatur und schaltet 
eine LED.

Leider geht es nicht:
1. Beim Debuggen hängt  der mC in DONE-Interrupt hängen. Eigentlich soll 
er nach einem DONE wieder schlafen gehen. Aber wenn ich debugge, sehe 
ich dass der mC diesen Interrupt  4-5 mal ausführt...
2. Im SD16MEMO Register steht eigentlich ein sinnvolles Ergebnis, aber 
wenn ich versuche ihm  zu speichern(mov.w R4), steht im R4 immer  die 
selbe Zahl, 0x0112 oder so...


3. Generel sit mir aufefallen, dass beim debuggen einige Register 
nicht/falsch reagieren, wenn ich sie im Debugger betrachte.  Ist es 
normal?

 Hier ist mein Code:

1
#include "msp430.h"                     ; #define controlled include file
2
3
RSEG CSTACK
4
5
RSEG CODE
6
7
  Reset: 
8
    mov.w #5350h,R5; ca room temp
9
    mov.b #SELM_1|SELS,&BCSCTL2; VCO as SMCLK
10
    mov.b #LFXT1S_2,&BCSCTL3; USE VCO as LFXT
11
    mov.w #SFE(CSTACK),SP; init stack
12
    mov.w #WDTPW|WDTHOLD, &WDTCTL ; stop watchdog
13
    mov.w #MC_0|TACLR, &TACTL; stop timer
14
    mov.w #SD16REFON|SD16SSEL_1, &SD16CTL; ref on,use SMCLK
15
    mov.b #SD16INCH_6,&SD16INCTL0; internal temp. sensor
16
    mov.w #SD16SNGL|SD16IE|SD16DF,&SD16CCTL0; interrupt enable, single convertion, 2' complement
17
    ;-----------------------------------------------------------------------------------;
18
    mov.w #00ffh, &TACCR0; count to 00ff
19
    mov.w #CCIE ,&TACCTL0; compare interrupt enable 
20
    mov.w #MC_1|TASSEL_1, &TACTL; RESET  start timer and set clock to SMCLK
21
    mov.b #BIT0, &P1DIR; output
22
  Main: 
23
    mov.w #GIE|LPM3, SR;
24
    jmp $;
25
   TIMER:
26
     bis.w  #SD16SC,&SD16CCTL0; START converstion
27
     reti 
28
   DONE:
29
      mov.w #SD16MEM0, R4; store result
30
      cmp.w R4,R5; compare result to R5
31
      jlo   LEDON    ;jump if R5 < SD16MEMO 
32
      mov.b #BIT0, &P1OUT; LEDOFF
33
      reti
34
   LEDON:
35
     bic.b #BIT0, &P1OUT;LEDON
36
     reti
37
     
38
RSEG RESET
39
   DW Reset;
40
   
41
RSEG INTVEC ;segment with interrupt vectors
42
ORG TIMERA0_VECTOR; CCIE Interrupt
43
    DW TIMER             
44
ORG  SD16_VECTOR; interrupt on conversion complete
45
    DW DONE
46
END
Ich benutze IAR Workbench

Hilft mir bitte)

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Böser Kommunist schrieb:
> einige Register
> nicht/falsch reagieren, wenn ich sie im Debugger betrachte.

Meinst Du damit Register der eigentlichen CPU oder Peripherie-Register?

Das Debuggen von Interrupts ist naturgemäß nicht folgenlos, bedenke, daß 
der Prozessor dafür angehalten wird, die Peripherie aber weiterläuft.

Hier hast Du vermutlich bessere Chancen, wenn Du in Deine ISR einen 
einfachen "Pinwackler" einbaust und Dir den mit einem Oszilloskop 
ansiehst.

Übrigens gibt es funktionierenden Beispielcode zur Ansteuerung der 
Peripherie von TI, auch für den 'F2013, und auch in Assembler.

: Bearbeitet durch User
von GS (chromosoma)


Lesenswert?

Ich meine Peripherie-register.

Ja, so habe ich auch gedacht, das die schrittweise Betrachtung von 
Interupts  unmöglich/sehr schwierig wird.
Aber vllt. liegt ein Fehler im Code selbst.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Böser Kommunist schrieb:
> Ich meine Peripherie-register.

Die sind, je nach Register, nicht für mehrfaches Lesen ausgelegt, das 
musst Du berücksichtigen.

> Aber vllt. liegt ein Fehler im Code selbst.

Dann kannst Du den ja mit den funktionierenden Beispielen von TI 
vergleichen ...

von Rx2000 (Gast)


Lesenswert?

Ich kenne jetzt den MSP430 Assembler nicht auswendig aber sollte da 
nicht ein & vor SD16MEM0?
--> mov.w &SD16MEM0, R4; store result

von Erik (Gast)


Lesenswert?

Hallo "rote Socke"

schon mal ohne LPM3 probiert ?

Geht ADC überhaupt im LPM3 ?
fehlt da nicht noch "EINT"  eine Zeile vor Main: ?
muss der Controller nicht erst geweckt werden beim Timer Interrupt ?

du startest die Conversation ,was ist als nächstes ?
die Main:  oder Done:
ich behaupte die Main:

von GS (chromosoma)


Lesenswert?

Bingo:)

#SD16MEMO ist die Adresse , &SD16MEMo ist der Wert. Argh...

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.