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)