Hallo zusammen! Ich habe das PIC-Programmieren begonnen. Ein paar Grundlegende Dinge funktionieren schon! Nun will ich einen Zähler bauen. Funktionsweise wiefolgt: Ich lege setze mittels eines Tasters den Digitaleingang auf 5V und das ganze 10 mal. Danach soll die LED am anderen Pin zu leuchten beginnen. Leider leuchtet die LED schon nach dem 1. Impuls. Kann mir jemand sagen, was ich da falsch mache? mfG. Michael Hier der Code:
1 | list p=12f675 |
2 | #include <P12f675.INC> |
3 | ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES |
4 | ;__CONFIG _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF |
5 | |
6 | org 0x00 |
7 | |
8 | ;ledON Equ 0x24 ;Ist die LED ein? |
9 | #define OUT1 GPIO,0 |
10 | #define IN1 GPIO,1 |
11 | cnt Equ 0x20 ;Zähler |
12 | ledon Equ 0x21 ;Statusspeicher |
13 | |
14 | goto Init |
15 | |
16 | Init |
17 | |
18 | bcf STATUS,RP0 ;Bank 0 |
19 | clrf GPIO ;Init GPIO |
20 | ;movlw 3Fh ;Set GP<5:0> to |
21 | movlw B'0111' ;Eingänge nicht invertiert + Eingänge auf DigitalInput |
22 | movwf CMCON ;digital IO |
23 | bsf STATUS,RP0 ;Bank 1 |
24 | clrf ANSEL ;Digital I/O |
25 | movlw B'00000010' |
26 | movwf TRISIO |
27 | bcf STATUS,RP0 |
28 | |
29 | |
30 | ; internen Taktgenerator kalibrieren |
31 | bsf STATUS, RP0 ; Bank 1 |
32 | call 0x3FF |
33 | movwf OSCCAL ; 4-MHz-Kalibrierung |
34 | bcf STATUS, RP0 ; Bank 0 |
35 | |
36 | ;Variable initialisieren |
37 | start |
38 | movlw D'10' |
39 | movwf cnt |
40 | movlw 0 |
41 | movwf ledon |
42 | |
43 | |
44 | loop |
45 | movf ledon,1 |
46 | btfsc STATUS,Z ;überspringe, wenn ledon=0 |
47 | decfsz cnt,1 |
48 | goto weiter |
49 | call check |
50 | weiter |
51 | btfsc IN1 ;überspringe, wenn kein Signal |
52 | call setzeEINS |
53 | btfss IN1 ;Überspringe, wenn Signal da |
54 | call setzeNULL |
55 | |
56 | goto loop |
57 | |
58 | |
59 | check |
60 | bsf OUT1 |
61 | return |
62 | |
63 | setzeNULL |
64 | movlw 0 |
65 | movwf ledon |
66 | return |
67 | |
68 | setzeEINS |
69 | movlw 1 |
70 | movwf ledon |
71 | return |
72 | end |