PIC16F630 Schleife für Delay einer LED

Gast #3844639
Lesenswert?

Guten Morgen,

ich eigne mir momentan erste Erfahrungen mit Assembler und 
Mikrocontrollern an. Der erste Testaufbau auf Steckboard und die erste 
Programmierung hat geklappt, die Schleife für die Verzögerung zur 
Visualisierung der blinkenden LED jedoch funktioniert nicht!

Ohne Schleife kann ich mit dem Oszi die HIGH-LOW Wechsel des Ausgangs 
beobachten, aber selbst kleinste Schleifen gehen nicht - der Ausgang 
bleibt dauerhaft HIGH. Wenn ich die Funktion 'Delay' durch einfache 
"nop"s ersetze, dann zeigt mir das, das der Sub-Routinen Aufruf 
zumindest schon einmal funktioniert. Muss also irgendwie an dem 
Konstrukt ..
1
Loop1  decfsz COUNT1, 1  
2
       goto   Loop1    
3
       decfsz COUNT2,1  
4
       goto   Loop1
liegen. Ich dachte aber das sollte so funktionieren?

Der Gesamte Code:
1
;-----------------------------------------------------------------------
2

3
  LIST P=16F630, R=DEC    
4
  errorlevel 0 ,-302    
5
  INCLUDE "P16f630.inc"
6

7
;-----------------------------------------------------------------------
8

9
STATUS  equ 0x03  ;Adresse des STATUS-Registers
10
TRISC   equ 0x87  ;Adresse des Tristate-Registers für Port A
11
PORTC   equ 0x07  ;Adresse Port A
12
COUNT1  equ 0x08  ;Erster Counter für Verzögerung
13
COUNT2  equ 0x09  ;Zweiter Counter für Verzögerung
14

15
;-----------------------------------------------------------------------
16
 __CONFIG _CP_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON  & _WDT_OFF & _MCLRE_OFF
17

18
;-----------------------------------------------------------------------
19

20
  ORG     0x000          ; Reset-Vektor für Prozessor
21

22
;****Ports definieren****
23

24
  bcf     STATUS,RP0   ;Bank 0
25
  clrf    PORTC        ;Init PORTC
26
  bsf     STATUS,RP0   ;Wechsel zu Bank 1
27
  movlw   0x00         ;Alle Ports als Ausgang
28
  movwf   TRISC
29
  bcf     STATUS,RP0   ;Wechsel zu Bank 0
30
  movlw    0x01        ;LED on
31

32
;****LED ausschalten****
33

34
START  xorwf  PORTC,1  ;LED togglen
35

36
;****Verzögerung hinzufügen
37

38
  call  Delay
39

40
;****Jetzt zurück zum START 
41

42
  goto  START 
43

44
;****Subroutine
45

46
Delay
47

48
Loop1  decfsz COUNT1, 1  
49
   goto   Loop1    
50
   decfsz COUNT2,1  
51
   goto   Loop1  
52

53
  return
54

55
;****Ende des Programms
56

57
  end
Hat jemand eine Idee?
Gast #3844748
Lesenswert?

Kai R. schrieb:
> ;-----------------------------------------------------------------------
>  __CONFIG _CP_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON  & _WDT_OFF &
> _MCLRE_OFF
>
> ;-----------------------------------------------------------------------
>
>   ORG     0x000          ; Reset-Vektor für Prozessor
>
> ;****Ports definieren****
>
>   bcf     STATUS,RP0   ;Bank 0
>   clrf    PORTC        ;Init PORTC
>   bsf     STATUS,RP0   ;Wechsel zu Bank 1
>   movlw   0x00         ;Alle Ports als Ausgang
>   movwf   TRISC
>   bcf     STATUS,RP0   ;Wechsel zu Bank 0
>   movlw    0x01        ;LED on

Du solltest beachten, dass bei den PIC16 bei 0x004 der Interrupt-Vector 
liegt. Ein Interrupt würde bei deinem Code an die Stelle
movwf   TRISC
springen. Man löst das im allgemeinen folgendermaßen:
1
   ORG    0x000              ; Reset-Vektor für Prozessor
2
   goto   Label1
3

4
   ORG    0x004              ; Interrupt-Vektor
5
   goto   Interrupt-Routine
6

7
   ORG    0x005              ; erste nutzbare Speicherstelle
8
Label1
9
;****Ports definieren****
10

11
   bcf     STATUS,RP0   ;Bank 0
12
   clrf    PORTC        ;Init PORTC
13
   bsf     STATUS,RP0   ;Wechsel zu Bank 1
14
   movlw   0x00         ;Alle Ports als Ausgang
15
   movwf   TRISC
16
   bcf     STATUS,RP0   ;Wechsel zu Bank 0
17
   movlw    0x01        ;LED on
Gast #3844778
Lesenswert?

Silvio schrieb:

> Du solltest beachten, dass bei den PIC16 bei 0x004 der Interrupt-Vector
> liegt. Ein Interrupt würde bei deinem Code an die Stelle
> movwf   TRISC
> springen. Man löst das im allgemeinen folgendermaßen:   ORG    0x000
> ; Reset-Vektor für Prozessor
>    goto   Label1
>
>    ORG    0x004              ; Interrupt-Vektor
>    goto   Interrupt-Routine
>
>    ORG    0x005              ; erste nutzbare Speicherstelle
> Label1
> ;****Ports definieren****
>
>...

Danke für den Hinweis. Für das nächste kleinere Projekt werde ich das 
auf jeden Fall berücksichtigen!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren