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
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.