Forum: Mikrocontroller und Digitale Elektronik PIC16F630 Schleife für Delay einer LED


von Kai R. (Gast)


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?

: Bearbeitet durch User
von Chris B. (dekatz)


Lesenswert?

Kai R. schrieb:
> COUNT1  equ 0x08  ;Erster Counter für Verzögerung
> COUNT2  equ 0x09  ;Zweiter Counter für Verzögerung

Das sind keine gültigen RAM-Adressen sondern "Unimplemented data memory 
locations"

RAM beginnt beim 16F630 ab 0x20.

: Bearbeitet durch User
von Kai R. (Gast)


Lesenswert?

Chris B. schrieb:
> Das sind keine gültigen RAM-Adressen sondern "Unimplemented data memory
> locations"
>
> RAM beginnt beim 16F630 ab 0x20.

Danke! Du hast vollkommen Recht. Jetzt funktioniert es.

von Silvio (Gast)


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

von Kai R. (Gast)


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!

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.