Kontrola vstupu po určitém času

Zdravím, potřeboval bych radu. Mé krásné začátky ke kterým jsem si vybral 16F690 probíhají velice náročně. Pokusil jsem vytvořit obyčejné hodiny a ty fungují vcelku obstojně. Ale při nastavení hodin jsem chtěl, aby když držím tlačítko (RB4, nebo RB5) se mi cyklus opakoval po jedné vteřině. Po krocích vše OK, ale v reálu po krátkém stisku chvilku nic a potom po vteřinách nabíhá až dvacet najednou.

TlacSmycka
  	call	CAS_ZOBR		;zobrazí čas na display
	movf PORTB,W			
	xorlw .16
    BTFSS STATUS,Z
	goto Tlac2
	; *** Akce tl.1 ***
	call Hodiny			;přičti 1 hodinu
	; *** **** **** ***
Tlac2
	movf PORTB,W
	xorlw .32
    BTFSS STATUS,Z
	goto Tlac3
	; *** Akce tl.2 ***	
	call Minuty			;přičti 1 minutu
	; *** **** **** ***
Tlac3
    movf PORTB,W
	xorlw .64 
    BTFSC STATUS,Z
	; *** Akce tl.3 ***
	goto MAIN				;start hodin
	; *** **** **** ***
	call CEK1s				;čekej 1 sekundu
	goto TlacSmycka

Pls. logickou chybu jsem nenašel. Poraďte. Předem děkuji.

Je treba si dat pozor na to, ze tlacitko pri stisku nevyvola donale sepnuti, ale provede se spousty sepnuti a rozepnuti, dokud se tlacitko neustali. Proto by jsi mel mít nejake kratke casove smicky (cca 20ms) a pak overit zda opravdu doslo ke stisku tlacitka. Tedy asi takto:

ano tacitko jsem stisknul - cekani - potvrzuji, je sepnute a mohu plnit potrebny ukol

Zkusil jsem vytvořit kód - kontrola stisku - prodleva - kontrola - akce, ale asi někde dělám chybu. Výsledek je shodný. Stále se to chová jako oddělené cykly. (Nejdív nic a potom postupný náběh). Netuším, kde mi to “hapruje” :cry:

Možná by bylo lepší spustit nějaký TMRx a v přerušení např. co 20 ms testovat port.

čekací prodlevu na ustálení zákmitu z tlačítka v tomto případě netřeba. Tu supluje na konci call CEK1s . Pošli sem celý program.

Ano to supluje, ale nemuzes to vedet urcite, kdyz nevis, co tam dela dal a jak.

Program jsem základ použil z TestLCD od dovedy (abych se netrápil v začátcích s displayem) a zbytek jsem tam doplácal osobně.
Neměl jsem zapnuté pull-up, ale když jsem je teď zapnul, tak mi to nereaguje vůbec. Program řikládám v příloze.
Hodiny.asm (15.2 KB)

cim pocitas cas ? co ti dela 1s ci co ?
chtelo by to trochu poupravit je to neprehledny , ten main nejakej divnej…

Ten čas se počítá pouze smyčkama. Souhlasím, že jsou nepřehledné, ale tam jsem to pouze upravoval tak, aby to s krystalem 4MHz vycházelo na 1s.
Ale po startu hodin to jede už OK. Pouze nemohu rozběhnout ty tlačítka. (Main zobrazí 1 řádek čas, druhý řádek název hodin a přičte 1s.)

heh, je na case to udelat pres preruseni, zabijes tim 2 mouchy 1 ranou, budes mit presnejci cas a obslouzis tlacitka, pak se muze procesor 950ms dloubat v nose …

ten kod je neprehlednej takze sem to nestudoval jak to bezi vsechno posobe, takze asi takle…
main
zobrazeni aktualniho casu
smycka
je stiskly tlacitko ?
ano,je stiskly ,incf tlacitko1, a je stiskly vic jak 100ms(tlacitko1 > 5 ) minuty +, blabla…,zobrazeni casu
ne,cekej 20ms , clrf tlacitko1
goto smycka ;cca 48x !!
nop
nop ; doladeni casu
minuty + ; 1s
goto main

edit: po zmene casu musis hned taky udelat obnovu na lcd,pak se ti to prave obnovuje jen po 1s a po velkejch skocich…

No je to první můj pokus, kde jsem se snažil pochopit, jak to někdo vytvořil a podle toho zpracovat něco svého, ale je fakt, že jsem mohl nepotřebné části promazat. Pokusím se ještě předělat zobrazení času pouze při stisku tlačítka (teď tam bylo při každém cyklu) snad to pomůže. S přerušením jsem ještě nic nezkoušel, ale určitě v další fázi se pokusím tomu věnovat. Bohužel příklady jsou pro mě přehlednější než datasheet, tak se pokusím něco dohledat.

Tak jsem se to snažil pochopit, ale nic moc.
Pojedeme od začátku. co dělá tenhle kus kódu
TlacSmycka
call CAS_ZOBR ;zobrazí čas na display
movf PORTB,W
xorlw .0
BTFSC STATUS,Z
goto TlacSmycka

vždyť 16f690 nemá vyvedený PORTB,0!!! tady se ti to zacyklí.

Tohle pouze zkontroluje, jestli je některé tlačítko stisknuté (B4 - B6). Ano prakticky se zacykluje, dokud něco není stisknuto.

No a od té doby, co jsem zapnul pull-up mi to nereaguje vůbec.

Velice děkuji všem zúčastněným za snahu. Chápu že kód byl nepřehledný a pokud by ještě někdo měl nápad, kde dělám hloupou začátečnickou chybu, tak jsem ořezal kód na základní otázku (života, vesmíru a vůbec).

list	P=16F690, R=DEC
include p16f690.inc 

__config (_XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_ON & _BOR_ON & _IESO_OFF & _FCMEN_OFF)

RAM			equ	20h		; prvni adresa pameti RAM (PIC16F628, 16F88, 16F876, 16F690)
KLAVESA		equ RAM+1	; Stav tlacitka

TMP0		equ	RAM+12	; cekaci smycka
TMP1		equ	RAM+13	; cekaci smycka
TMP2		equ	RAM+14	; cekaci smycka
TMP3		equ	RAM+15	; cekaci smycka, stisk tlacitka

org	0x0000				; zacatek programu

;**************************************************************************
INIT	
  bcf STATUS,RP0
  bcf STATUS,RP1
  clrf PORTA
  clrf PORTB
  bsf  STATUS,RP0    	;select Register Page 1
  bcf OPTION_REG,7		; PULL-UPy ON
  movlw	0xF0
  movwf TRISB
  movlw 0x00
  bcf  STATUS,RP0    	;back to Register Page 0
  bsf  STATUS,RP1
  movwf ANSEL
  movwf ANSELH
  bcf  STATUS,RP1  
;*************************************************************
;MAIN		
;*************************************************************
TlacSmycka

Tlac1
	movf PORTB,W
	xorlw .16
    BTFSS STATUS,Z
	goto Tlac2
	; *** Akce tl.1 ***
	BCF PORTA,0
	; *** **** **** ***
Tlac2
	movf PORTB,W
	xorlw .32
    BTFSC STATUS,Z
	BSF PORTA,0
	; *** **** **** ***
	call CEK2s
	goto TlacSmycka
;**************************************************************************
CEK2s	movlw	.20		; TMP2 = 20  cekej 2 sekundu
	movwf	TMP3
	goto	SMYCKA2
;-------------------------------
CEK100m	movlw	0CEh	; cas = 100ms
	movwf	TMP0
	movlw	0A0h
	movwf	TMP1
	goto	SMYCKA
;-------------------------------
SMYCKA2	call	CEK100m
	decfsz	TMP3,F		; nejvetsi smycka
	goto	SMYCKA2
	retlw	00h
;-------------------------------
SMYCKA	movf	TMP0,W
	movwf	TMP2
SMYCKA1	decfsz	TMP2,F	; mala smycka
	goto	SMYCKA1

	decfsz	TMP1,F		; velka smycka
	goto	SMYCKA
	retlw	00h

	end

a tohle se ti chova jak?

Bohužel, stejně jako před tím. Na vstup vůbec nereaguje. :frowning:

V INITU nějak nevidím nastavení TRISA

TrisA jsem omylem promazal při ořezávání kódu, ale při doplnění stále stejný výsledek. Výstupy zatím při všech pokusech ok, ale vtup nic, nic a nic. Už jsem zkusil použít i jiné porty (nebyl jsem si jist, jestli jsem to po těch všech pokusech neodpálil), ale bez výsledku.

pokud mas zaply pullapy tak tlacitko spinas k 0 jo ?

[code] list P=16F690, R=DEC
include p16f690.inc
errorlevel -302
__config (_XT_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_ON & _BOR_ON & _IESO_OFF & _FCMEN_OFF)
;********************
CBLOCK 0x30
count1
count2
count3
ENDC
;********************
#define LED PORTA,0
#define Tlacitko_plus PORTB,4
#define Tlacitko_minus PORTB,5
;********************************
org 0x0
goto INIT
INIT

bcf STATUS,RP0
bcf STATUS,RP1
clrf PORTA
clrf PORTB
bcf STATUS,RP0
bsf STATUS,RP1
clrf ANSEL
clrf ANSELH
bsf STATUS,RP0
bcf STATUS,RP1
bcf OPTION_REG,7 ; PULL-UPy ON
movlw 0xF0
movwf TRISB
bcf LED
bcf STATUS,RP0
bcf STATUS,RP1
;*************************************************************
;MAIN
;*************************************************************
MAIN
btfsc Tlacitko_plus
goto $+3
BSF LED
goto $+2
BCF LED
; *** **** **** ***
call PAUSE
; *** **** **** ***
btfsc Tlacitko_minus
goto $+3
BSF LED
goto $+2
BCF LED
; *** **** **** ***
call PAUSE
; *** **** **** ***

goto MAIN
;**************************************************************************
PAUSE ;RETURN ;cca 100ms
movlw 0x01 ;FF-50S / 01-12uS
movwf count3
r3 movlw 0x81 ;FF / 01
movwf count1
r1 movlw 0xFF ;FF / 01
movwf count2
r2 decfsz count2,f
goto r2
decfsz count1,f
goto r1
decfsz count3,f
goto r3

RETURN

;***************************************************
end[/code]