www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zählschleife asm PIC12F


Autor: BlackArrow (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
list p=12f675
#include <P12f675.INC>
ERRORLEVEL      -302      ;SUPPRESS BANK SELECTION MESSAGES
;__CONFIG  _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF

  org  0x00

;ledON  Equ    0x24  ;Ist die LED ein?
#define OUT1  GPIO,0
#define IN1    GPIO,1
cnt    Equ    0x20  ;Zähler
ledon  Equ    0x21  ;Statusspeicher

goto  Init

Init

  bcf STATUS,RP0 ;Bank 0
  clrf GPIO ;Init GPIO
  ;movlw 3Fh ;Set GP<5:0> to
  movlw B'0111'  ;Eingänge nicht invertiert + Eingänge auf DigitalInput
  movwf CMCON ;digital IO
  bsf STATUS,RP0 ;Bank 1
  clrf ANSEL ;Digital I/O
  movlw B'00000010'
  movwf TRISIO
  bcf STATUS,RP0


  ; internen Taktgenerator kalibrieren
  bsf  STATUS, RP0    ; Bank 1
  call  0x3FF
  movwf  OSCCAL      ; 4-MHz-Kalibrierung
  bcf  STATUS, RP0    ; Bank 0

  ;Variable initialisieren
start
  movlw D'10'
  movwf cnt
  movlw 0
  movwf ledon


loop
  movf ledon,1
  btfsc STATUS,Z  ;überspringe, wenn ledon=0
  decfsz cnt,1
  goto weiter
  call check
weiter
  btfsc IN1  ;überspringe, wenn kein Signal
  call setzeEINS
  btfss IN1  ;Überspringe, wenn Signal da
  call setzeNULL

  goto loop


check
bsf OUT1
return

setzeNULL
movlw 0
movwf ledon
return

setzeEINS
movlw 1
movwf ledon
return
end

Autor: Bascomfehler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Schalter wird wohl prellen.

Autor: BlackArrow (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heißt, im Grunde müsste das Programm so funktionieren?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.