Forum: Mikrocontroller und Digitale Elektronik Zählschleife asm PIC12F


von BlackArrow (Gast)


Lesenswert?

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

von Bascomfehler (Gast)


Lesenswert?

Der Schalter wird wohl prellen.

von BlackArrow (Gast)


Lesenswert?

Das heißt, im Grunde müsste das Programm so funktionieren?

von Chris (Gast)


Lesenswert?

nach Loop, füge einen 100ml delay mit folgendem Code ein:

  movlw 100
  call dly_ms

es braucht 2 Variablen, dly1 sowie dly0

dly_ms
 movwf dly1
 movlw  250 ; 1ms Interval
 movwf  dly0
 clrwdt
 decfsz dly0
 goto   $-2
 decfsz dly1
 goto   dly_ms+1
 return

von Severino R. (severino)


Lesenswert?

Chris wrote:
> nach Loop, füge einen 100ml delay mit folgendem Code ein:

Man nehme 100ml delay, 200 g Mehl, 1 dl Loop etc.

Gibt's delay denn in Deziliter-Packungen?

SCNR

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.