Forum: Mikrocontroller und Digitale Elektronik For-Schleife (ASM) funktioniert nicht Brauche Hilfe (PIC16F628A9


von Benedikt O. (Gast)


Lesenswert?

Da dies mein erster Beitrag ist möchte ich mich erst ein mal vorstellen.
Ich heiße Benedikt und bin 13 Jahre alt.
Ich habe vor kurzem angefangen mich mit PIC´s zu beschäftigen.

Mein Problem ist das die schleife die ich programmiert habe nicht 
funktioniert.
Eigentlich soll sie (nur zum Test) 5 mal den Programmabschnitt 
wiederholen, doch er wird endlos wiederholt.
Ich hoffe ihr könnt mir helfen.

Und bitte ich weis das der Code vlt. ein bisschen unprofessionell ist.

Der Code --> https://www.dropbox.com/s/nx7tb96jyocuhts/For-Schleife.pdf

von Karl H. (kbuchegg)


Lesenswert?

Es ist für uns alle, inklusive dir, viel einfacher, wenn du den Code 
einfach hier einstellst anstatt ihn in einem PDF zu verpacken. Längeren 
Code postet man als Dateianhang (und zwar nimmst du einfach dein Source 
Code File, so wie es ist), kürzeren COde kann man einfach hier 
einstellen
1
list p=16f628a
2
#include <P16f628a.INC>
3
ERRORLEVEL -302 ; 302 Warnunten ausblenden
4
; Configuration
5
;BODEN_ON BODEN_OFF _CP_ALL _CP_75 _CP_50 _CP_OFF _DATA_CP_ON _DATA_CP_OFF _PWRTE_OFF
6
;_PWRTE_ON _WDT_ON _WDT_OFF _LVP_ON _LVP_OFF _MCLRE_ON _MCLRE_OFF _ER_OSC_CLKOUT
7
_HS_OSC
8
;_ER_OSC_NOCLKOUT _INTRC_OSC_CLKOUT _INTRC_OSC_NOCLKOUT _EXTCLK_OSC _LP_OSC
9
_XT_OSC
10
;;
11
__CONFIG _PWRTE_OFF & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF &
12
_MCLRE_OFF ; & _CP_ALL
13
; Variablen
14
loops equ 0x20
15
loops2 equ 0x21
16
Lauf equ 0x22
17
;A4 ist nur ein open drain ausgang, kann spannungen bis 8,5 volt auf masse ziehen, max. 20 mA,
18
Ini_con Equ B'00000000' ; Interupt disable
19
Ini_opt Equ B'00000010' ; pull-up
20
;**************************************************
21
goto Init
22
Init
23
; 16f628 anfang
24
BSF CMCON, CM0
25
BSF CMCON, CM1
26
BSF CMCON, CM2 ; Alle porta-pins digitale i/o pins
27
; 16f628 ende
28
clrf PORTB
29
clrf PORTA
30
bsf STATUS, RP0 ; Bank 1
31
movlw Ini_opt ; pull-up Wiederstände ein
32
movwf OPTION_REG
33
movlw B'00000000' ; PortB output
34
movwf TRISB
35
movlw B'11110000' ;Porta A0 is A3 Output, A4, A5... Input
36
movwf TRISA
37
bcf STATUS, RP0 ; Bank 0
38
; --------------- Ende init
39
start
40
movlw .5
41
movwf Lauf
42
Licht
43
bsf PORTA,0
44
call wait500
45
bcf PORTA,0
46
bsf PORTA,1
47
call wait500
48
bcf PORTA,1
49
bsf PORTA,2
50
call wait500
51
bcf PORTA,2
52
call wait500
53
decfsz Lauf, .1
54
goto Licht
55
goto E
56
wait500
57
call wait100
58
call wait100
59
call wait100
60
call wait100
61
call wait100
62
return
63
wait100
64
call wait10
65
call wait10
66
call wait10
67
call wait10
68
call wait10
69
call wait10
70
call wait10
71
call wait10
72
call wait10
73
call wait10
74
return
75
wait10
76
call wait
77
call wait
78
call wait
79
call wait
80
call wait
81
call wait
82
call wait
83
call wait
84
call wait
85
call wait
86
return
87
; call Wait = 1 ms Pause
88
wait
89
movlw D'5' ; 1 ms Pause
90
movwf loops
91
Wai
92
movlw .124 ; 0,2 ms
93
movwf loops2
94
Wai2 nop ;
95
nop
96
nop
97
nop
98
nop
99
decfsz loops2, F
100
goto Wai2
101
decfsz loops, F
102
goto Wai
103
return
104
E
105
end


Ich hab den Code jetzt mal hier einkopiert (inklusive entsprchender 
Tags, damit er als COde hervorgehoben wird), aber leider gehen bei der 
Kopieraktion die Einrückungen verloren.

von Max H. (hartl192)


Lesenswert?

1) Du weißt, dass du Code (am besten als *.asm) auch hier in Forum
   hochladen kannst?
2) Ich würde im "decfsz Lauf, .1" das ".1" durch ein "f" ersetzen,
   ist leichter zu lesen.
3) Versuch mal das "goto E" durch ein "goto $" zu ersetzen.

: Bearbeitet durch User
von Benedikt O. (Gast)


Lesenswert?

Erst ein mal vielen Dank für die schnellen antworten.

Ich weis das es sehr umständlich ist ich war mir aber einfach nicht 
sicher, ob ich den Code hier einfach in der länge reinstellen kann.

Und zum Thema ich habe jetzt das "goto E" durch ein "goto $" ersetzt und 
dann hat es funktioniert.

LG Benedikt

von Max H. (hartl192)


Lesenswert?

Benedikt Oberste schrieb:
> ich war mir aber einfach nicht
> sicher, ob ich den Code hier einfach in der länge reinstellen kann

>> Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Falls du dich fragst, was es mit dem "goto $" auf sich hat:
$ wird von Assembler durch den Programmcounter ersetzt. "goto $" macht 
also adas geiche wie
1
loop 
2
  goto loop
Es ist also eine Endlosschleife wie "while(1);" in C. Wenn diese fehlt, 
führt der PIC den Code in nicht beschriebenen Flash (NOP) aus, bis der 
Programzähler überläuft und das ganze Programm wieder von vorne beginnt.

Falls du diese Seite noch nicht kennst: http://www.sprut.de/
Hier gibt's viel Theorie und Beispiele zu PIC asm.

: Bearbeitet durch User
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.