Forum: Mikrocontroller und Digitale Elektronik Assembler unerwartete Reset


von Anfänger fragen assembler (Gast)


Lesenswert?

Hallo
ich kenne mich sehr gut mit C und C++. aber mit Assembler habe ich nie 
etwas Programmiert.
meine erstes Program habe ich mit Hilfe von MSP430 Exempel Code 
geschrieben.
das Problem bei mir (was mir echt nervt) ist, dass das Programm ins 
Reset springt, immer wenn die Prozedur TESTVALUE ausgeführt wird.

kann jemand mir hier helfen
1
#include "GLOBALVARIABLE.ASM"
2
;-------------------------------------------------------------------------------
3
            RSEG    CSTACK                  ; Define stack segment
4
;-------------------------------------------------------------------------------
5
            RSEG    CODE                    ; Assemble to Flash memory
6
;-----------------------------------------------------------------------------
7
IMPORT  PROSSEDUR1_INIT
8
IMPORT  PROSSEDUR2_INIT
9
;******************************************************************************
10
;   MSP430x261x Demo - Timer_A, Toggle P1.0, TACCR0 Cont. Mode ISR, DCO SMCLK
11
;   Description: Toggle P1.0 using software and TA_0 ISR. Toggles every
12
;   50000 SMCLK cycles. SMCLK provides clock source for TACLK.
13
;   During the TA_0 ISR, P1.0 is toggled and 50000 clock cycles are added
14
;   to TACCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off
15
;   and used only during TA_ISR.
16
;   ACLK = 32.768kHz, MCLK = SMCLK = TACLK = default DCO
17
;
18
;                MSP430F241x
19
;                MSP430F261x
20
;             -----------------
21
;         /|\|              XIN|-
22
;          | |                 |  32kHz
23
;          --|RST          XOUT|-
24
;            |                 |
25
;            |             P1.0|-->LED
26
;
27
;   Bhargavi Nisarga
28
;   Texas Instruments Inc.
29
;   September 2007
30
;   Built with IAR Embedded Workbench Version: 3.47A
31
;****************************************************************************
32
33
RESET       mov.w   #SFE(CSTACK),SP         ; Initialize stackpointer
34
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT
35
36
OFIFGcheck  bic.b   #OFIFG,&IFG1            ; Clear OFIFG
37
            mov.w   #047FFh,R15             ; Wait for OFIFG to set again if
38
OFIFGwait   dec.w   R15                     ; not stable yet
39
            jnz     OFIFGwait
40
            bit.b   #OFIFG,&IFG1            ; Has it set again?
41
            jnz     OFIFGcheck              ; If so, wait some more
42
43
44
SetupP5     bis.b   #BIT0,&P1DIR            ; P1.0 output
45
            mov.w   #0,r12                                            
46
SetupC0     mov.w   #CCIE,&TACCTL0          ; TACCR0 interrupt enabled
47
            mov.w   #50000,&TACCR0          ;
48
SetupTA     mov.w   #TASSEL_2+MC_2,&TACTL   ; SMCLK, continuous mode
49
SetPort     call    #PROSSEDUR1_INIT
50
            call    #PROSSEDUR2_INIT
51
                                            ;            
52
Mainloop    bis.w   #CPUOFF+GIE,SR          ; CPU off, interrupts enabled
53
            nop                             ; Required for debugger
54
TESTVALUE:                                            ;
55
            call #HAUPT_ROUTIN 
56
            clr  r12 
57
            ret
58
            ;
59
;------------------------------------------------------------------------------
60
TA0_ISR;    Toggle P1.0
61
;----------------------------------------------------------------------------
62
            inc   r12       ;einzähler incrementieren
63
            cmp   #20,r12    
64
            jeq   TESTVALUE              ; wenn das stimmt 
65
            reti                              ; 
66
67
;----------------------------------------------------------------------------
68
            COMMON  INTVEC                  ; Interrupt Vectors
69
;----------------------------------------------------------------------------
70
            ORG     RESET_VECTOR            ; MSP430 RESET Vector
71
            DW      RESET                   ;
72
            ORG     TIMERA0_VECTOR          ; Timer_A0 Vector
73
            DW      TA0_ISR                 ;
74
            END

: Bearbeitet durch User
von spontan (Gast)


Lesenswert?

Diese Assmbler-Sprache kenn ich nicht, aber seltsam erscheint mir der 
RET in TESTVALUE.

Wohin wird denn zurückgesprungen?

von Stefan F. (Gast)


Lesenswert?

Mich verwundert viel mehr "call #HAUPT_ROUTIN". Ich sehe nirgends ein 
Label mit diesem namen. Wo ist denn diese Hauptroutine? Existiert sie 
überhaupt?

von Assembler Nichtkenner (Gast)


Lesenswert?

Anfänger fragen assembler schrieb:
> TESTVALUE:                                            ;
>             call #HAUPT_ROUTIN

Da ich keine #HAUPT_ROUTIN im Programm gesehen habe, könnte es sein, das 
der call nach Null geht und damit einen Reset auslöst?

von Stefan F. (Gast)


Lesenswert?

Ja.

> Da ich keine #HAUPT_ROUTIN im Programm gesehen habe

Dieser Satz irritiert mich allerdings. Ist das gar nicht DEIN Programm?

Falls doch, solltest du mal mit was kleinerem Anfangen. Einfach mal eine 
LED toggeln und im zweiten Schritt mit einer bestimmten Frequenz blinken 
lasse.

von Anfänger fragen assembler (Gast)


Lesenswert?

hallo,
danke für die schnelle Antworten.
call #HAUPT_ROUTIN habe ich in einem andren Modul definiert.
ich habe call #HAUPT_ROUTIN  schon kommentiert leider dieses Problem ist 
nicht aufgehoben.

von uwe (Gast)


Lesenswert?

Mainloop    bis.w   #CPUOFF+GIE,SR          ; CPU off, interrupts 
enabled
            nop                             ; Required for debugger
TESTVALUE:                                            ;
            call #HAUPT_ROUTIN
            clr  r12
            ret
            ;
;----------------------------------------------------------------------- 
-------
TA0_ISR;    Toggle P1.0
;----------------------------------------------------------------------- 
-----
            inc   r12       ;einzähler incrementieren
            cmp   #20,r12
            jeq   TESTVALUE              ; wenn das stimmt
            reti

Wenn die CPU aus HAUPT_ROUTIN zurück kommt macht sie ein clr r12 und ein 
ret.
der ret springt dann wohl ins nichts (bzw. dortihin was auf dem 
Kapuutten Stack zu finden ist, der durch das nachfolgende Problem 
verursacht wird).
Solange sich die CPU noch in HAUPT_ROUTIN befindet und ein TA0 Interupt 
kommt spring sie mit "jeq TESVALUE" ohne irgendwie den Stack zu 
bereinigen. In Testbvalue dann packt Sie noch mehr auf den eh schon 
Zerstörten Stack. Und falls die ISR doch mal zum reti kommt spring die 
CPU irgendwohin(je nachdem was auf dem kaputten Stack zuletzt 
raufgepackt wurde).

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.