mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 Debug Deadlock bei Run, SBS geht!


Autor: Johann85 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jungs,

gleich zu meinem Problem: Programm in Assembler geschrieben. Debug on 
Board funktioniert step by step aber sobald man auf "Run" klickt bleibt 
er in der Initialisierung hängen und kommt noch nicht mal mehr in den 
mainloop, ab dann läuft er freudig in der Initialisierung herum. Was 
könnte das sein? Ich hab leider nicht so die Erfahrung aber der 
Controllertyp ist richtig eingestellt

Besten Dank schonmal :)

Autor: Petra (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Johann

bei den wenigen Infos werden Dir die Jungs nichts sagen können....
und uns Mädels fragst Du ja nicht.

Gruß
Petra

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann85 schrieb:
> Ich hab leider nicht so die Erfahrung aber der
> Controllertyp ist richtig eingestellt

Ooch, es gibt ja nur etwa 1063 verschiedene Typen des 8051.


Peter

Autor: Johann85 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huhu Jungs und Mädls,

ihr wollt das programm ;)?! es handelt sich um einen 8051 F340 besten 
dank schonmal ;)

$NOMOD51                ;der Modus fuer 8051 wird abgeschaltet
$debug
$nolist                 ;es wird kein Listing fuer reg535 erstellt
$include(C8051F340.inc) ;die C8051F340-spezifischen Daten
$list                   ;es wird ein Listing erstellt
$title (kolben.A51)
;------------------------------------------------------------------------
;Programmbeschreibung
;------------------------------------------------------------------------
;Programm:
;
;
;
;
;Erstellt am: Samstag, 29. Mai 2010 13:07:59 
;Programmiert: 
;
;Verwendete Einspruenge: keine
;
;Verwendete Unterprogramme: keine
;
;
;Verwendete Register und Variable:
;Registerbank(0)
;R0-R4
;
; System clock :
; 12MHZ
; 1MHZ der Timer Clock

;Kommentar:
;;Timer0 -> Bremse auslösen,  auslöser = 0.1s kein Interupt0
;Timer1 -> Timer0 Starten,  auslöser = Motor 20s an
;Zuendung -> signal vom Zuendung, Zündschloss bei an auf 0 (Eingang)
;Bremse ->   bremssignal (Ausgang)
;R0 = wiederhohungen von Timer0
;R1 = wiederhohungen von Timer1


;Aenderungen:


;Geaendert am: Samstag, 29. Mai 2010 13:07:59
;
;
;------------------------------------------------------------------------
;Initialisierungsteil fuer allgemeine Konstanten
;------------------------------------------------------------------------
 
;************************************************************************
;*                        Konstanten-Deklaration                        *
;************************************************************************
;Timer0 Relaod Werte   Zeit= 50ms bei 1µs clk   Gewünscht 0.1s



TL0_res equ 0Afh
TH0_res equ 03ch
;Time1 Reload Werte     Zeit= 50ms bei 1µs clk  Gewünscht 20s
TL1_res equ 0Afh
TH1_res equ 03ch
;Variablen
R0_res equ 01h      ; Anzahl Wiederhohlung timer0 = 2
R1_res equ 028h      ; Anzahl Wiederhohlung timer1 = 40

R4_res equ 01h;01eh      ; für die Pause nach dem Klemmen R4=30

CSEG AT 0H              ; Legt absolute Codesegmentadresse auf 0h
ljmp INIT
;
;------------------------------------------------------------------------
;Interrupt-Vektoren
;------------------------------------------------------------------------
ORG  03h          ; Interrupt0
   call ISR_E0         ; Sprungbefehl zur eigentlichen ISR 
 reti
ORG  0bh          ; Timer0
   call ISR_TO         ; Sprungbefehl zur eigentlichen ISR
   reti
ORG  01bh          ; Timer1
   call ISR_T1         ; Sprungbefehl zur eigentlichen ISR
   reti
;------------------------------------------------------------------------
;Initialisierungsteil fuer On-Chip Peripherie
;------------------------------------------------------------------------
ORG 100H                ; Programmstart bei 100H
INIT:

call Init_Device    ; Aufruf zur Initialisierung der Controller Funktionen

; eigene Interrupt INIT
clr EA        ; Interrupt aus
  ;timer 0
  setb ET0        ; Timer 0 freischalten
  mov TH0,#TH0_res    ; Timer weite setzen (Zeit)
  mov TL0,#TL0_res
  ;Timer1
  setb ET1        ; Timer 1 freischalten
  mov TH1,#TH1_res    ; Timer weite setzen (Zeit)
  mov TL1,#TL1_res

  mov TMOD,#00010001b ; Modus auswählen Timer1/2 Modus1    = 16 bit timer
  ;Interrupt 0 (p3.2)
  setb  EX0      ; Interrupt0 freischalten
  setb IT0      ; If IT0 = 0, low level triggered external interrupt 0 is selected.
            ; If IT0 = 1, falling edge triggered external interrupt 0 is selected.
                               
  setb EA        ; Interrupt ein , Ende Interrupt/timer setting
  
  ;SONSTIGES
  
  mov R0,#R0_res
  mov R1,#R1_res
  mov R2,#01h
  mov R3,#02h
  mov R4,#R4_res
  setb P2.0      ; Bremslicht aus
  
;************************************************************************
;*                           Programmschleife                           *
;************************************************************************
MAINLOOP:
   
  jnb P1.0,Timer1   ; Zuendung an?
  jb P1.0,Timer1_aus  ; Zuendung aus?
    jmp MAINLOOP
  
Timer1:              
  setb TR1      ; Starten des timer1 
  jmp MAINLOOP

Timer1_aus:
  clr TR1        ; timer stoppen
  clr TR0
  mov TH1,#TH1_res    ; Timer zurücksetzen (Zeit)
  mov TL1,#TL1_res
  mov R0,#R0_res      ; Zähler zurücksetzen (Zeit)  
  mov R1,#R1_res
  ;setb P2.0      ; Bremslicht aus
  jmp MAINLOOP
;************************************************************************
;*                          Interrupts/Timer                           *
;************************************************************************
;-------------------------Auslösen der Bremse nach 100ms
ISR_TO:
  mov TH0,#TH0_res    ; Zählerweite reset (Zeit)
  mov TL0,#TL0_res
  djnz R0,T0_exit     ; Gesammte Wartezeit abgelaufen?
  mov R0,#R0_res      ; Schleife restart
  clr P2.0      ; Bremslicht Auslösen
  call klemmer      ; Bremslicht bleibt 6 Sekunden lang an
  setb P2.0      ; Bremslicht aus

T0_exit:
  ret
                        
;-------------------------starten des Timer0 nach 20s   
ISR_T1:          ; Timer1
  mov TH1,#TH1_res    ; Timerweite rücksetzen (Zeit)
  mov TL1,#TL1_res
  djnz R1,T1_exit    ; Gesammte Wartezeit abgelaufen?
  mov R1,#R1_res    ; schleife Restart
  setb TR0      ; Timer0 Starten
T1_exit:
  ret
;-------------------------Rücksetzen des Timer0 (Bremse)
ISR_E0:            ; Zündsignal
  mov TL0,#TL0_res
  mov TH0,#TH0_res    ; Zählerweite reset (Zeit)
  mov R0,#R0_res      ; Schleife Restart
  ret
;-------------------------andere Unterprogramme
klemmer:
clr EA           ; Interupts sperren
clr TR0
clr TR1
; interne pause
break:
djnz R2,break
djnz R3,break
djnz R4,break
mov R4,#R4_res

setb EA         ; Interrupts wieder freigeben
setb TR0
setb TR1
ret


; Peripheral specific initialization functions,
; Called from the Init_Device label
Timer_Init:
    mov  TCON,      #005h
    mov  TMOD,      #011h
  mov ckcon, #04h
    ret

Port_IO_Init:
    ; P0.0  -  Skipped,     Push-Pull,  Digital
    ; P0.1  -  SYSCLK,      Open-Drain, Digital
    ; P0.2  -  T0  (Timr0), Open-Drain, Digital
    ; P0.3  -  T1  (Timr1), Open-Drain, Digital
    ; P0.4  -  Unassigned,  Open-Drain, Digital
    ; P0.5  -  Unassigned,  Open-Drain, Digital
    ; P0.6  -  Unassigned,  Open-Drain, Digital
    ; P0.7  -  Unassigned,  Open-Drain, Digital

    ; P1.0  -  Skipped,     Push-Pull,  Digital
    ; P1.1  -  Unassigned,  Open-Drain, Digital
    ; P1.2  -  Unassigned,  Open-Drain, Digital
    ; P1.3  -  Unassigned,  Open-Drain, Digital
    ; P1.4  -  Unassigned,  Open-Drain, Digital
    ; P1.5  -  Unassigned,  Open-Drain, Digital
    ; P1.6  -  Unassigned,  Open-Drain, Digital
    ; P1.7  -  Unassigned,  Open-Drain, Digital

    ; P2.0  -  Skipped,     Open-Drain, Digital
    ; P2.1  -  Unassigned,  Open-Drain, Digital
    ; P2.2  -  Unassigned,  Open-Drain, Digital
    ; P2.3  -  Unassigned,  Open-Drain, Digital
    ; P2.4  -  Unassigned,  Open-Drain, Digital
    ; P2.5  -  Unassigned,  Open-Drain, Digital
    ; P2.6  -  Unassigned,  Open-Drain, Digital
    ; P2.7  -  Unassigned,  Open-Drain, Digital

    ; P3.0  -  Unassigned,  Open-Drain, Digital
    ; P3.1  -  Unassigned,  Open-Drain, Digital
    ; P3.2  -  Unassigned,  Open-Drain, Digital
    ; P3.3  -  Unassigned,  Open-Drain, Digital
    ; P3.4  -  Unassigned,  Open-Drain, Digital
    ; P3.5  -  Unassigned,  Open-Drain, Digital
    ; P3.6  -  Unassigned,  Open-Drain, Digital
    ; P3.7  -  Unassigned,  Open-Drain, Digital

    mov  P0MDOUT,   #001h
    mov  P1MDOUT,   #001h
    mov  P0SKIP,    #001h
    mov  P1SKIP,    #001h
    mov  P2SKIP,    #001h
    mov  XBR0,      #008h
    mov  XBR1,      #070h
    ret

Oscillator_Init:
    mov  OSCICN,    #083h
    ret

Interrupts_Init:
    mov  IT01CF,    #00h
    mov  IE,        #08Bh
    ret

; Initialization function for device,
; Call Init_Device from your main program
Init_Device:
    lcall Timer_Init
    lcall Port_IO_Init
    lcall Oscillator_Init
    lcall Interrupts_Init
    ret

end

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> bleibt er in der Initialisierung hängen und kommt noch nicht mal mehr in
> den mainloop, ab dann läuft er freudig in der Initialisierung herum.
Abgesehen von der etwas unverständlichen Formulierung...

< Debug on Board funktioniert step by step
... bedeutet das eigentlich, dass deine IDE in der Lage sein sollte, 
nach einem RUN und einem darauffolgenden STOP auf den ungefähren 
Programmteil zu zeigen, der da "loopt".

Also, was ich damit sagen will, du musst ja ungefähr vermitteln können, 
wo es hängen bleibt, und selbst wenn du dazu einzelne Initialisierungen 
z.B. in rauswirfst...

Prinzipiell behaupte ich mal, dass das:
djnz R4,break
mov R4,#R4_res
... murks ist...
Erklärt aber nicht, warum's angeblich in Single-Step läuft...

Ralf

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Prinzipiell behaupte ich mal...
argl das ist ja Ende der Schleife, sorry. Verwirrender 
Programmierstil...

Mach mal den RUN/STOP-Check und poste dann, wo er stehen geblieben 
ist...

Ralf

Autor: Johann85 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst der watchdog war noch an ;) trotzdem danke an alle 
programm läuft so!

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
argl Stimmt, das war noch was, auf was ich hinweisen wollte, passiert 
bei SiLabs-"Neulingen" gern... :) Sorry, dass ich nicht gleich dran 
gedacht hab.

Ralf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.