Hoe komt het dat de ingangen van mijn pic nogal traag reageren ?

Ik heb de on chip pullups geactiveerd en ik heb via een schakelaartje de ingang naar massa gelegd.

Dus als de pic een "0" ontvangt op zijn ingang moet de pic hier iets mee doen.

Het werkt wel maar het probleem is dat de pic nogal traag reageert. Soms moet ik een seconde of twee blijven duwen voor een ledje begint te branden ofzo.

Heeft iemand hier een verklaring voor ?

Laat even een stukje van je programmacode zien, want waarschijnlijk zit daar de fout.

Hoe ziet je programma eruit?
Denk gewoon dat je programma meeste van de tijd in een delay lus hangt, of dat de schakelaars niet goed ontdenderd worden.

DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF

SYMBOL poort1 = PORTB.0
SYMBOL poort2 = PORTB.1
DIM teller AS BYTE

PORTB_PULLUPS ON
DELAYMS 500
CLEAR
CLS

WHILE 1 = 1
IF poort1 = 0 THEN INC teller
DELAYMS 50
IF poort2 = 0 THEN DEC teller
PRINT AT 1,1, "Parking A:", DEC3 teller
DELAYMS 50
WEND

Dit is men volledige voorlopig code, er moet nog veel bijgedaan worden maar voorlopig is dit het voor te testen. Het werkt wel maar de ingangen reageren traag.

[Bericht gewijzigd door Mathieuke op ]

Op 4 maart 2006 22:18:19 schreef Mathieuke:

DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF

SYMBOL poort1 = PORTB.0
SYMBOL poort2 = PORTB.1
DIM teller AS BYTE

PORTB_PULLUPS ON
DELAYMS 500
CLEAR
CLS

WHILE 1 = 1
IF poort1 = 0 THEN INC teller
DELAYMS 50
IF poort2 = 0 THEN DEC teller
PRINT AT 1,1, "Parking A:", DEC3 teller
DELAYMS 50
WEND

Dit is men volledige voorlopig code, er moet nog veel bijgedaan worden maar voorlopig is dit het voor te testen. Het werkt wel maar de ingangen reageren traag.

Zit het probleem niet in die DELAY? in totaal wordt er 0,1 seconde gewacht ... en ik zie het nut er ook niet van in!!

Ma wordt het niet aangeraden van een delay te steken om eventuele dender te voorkomen ?

ja dat wel maar dat heeft op deze manier geeen zin. Je moet kijken of de knop ingedrukt is, wachten, en dan kijken of de knop NOG STEEDS ingedrukt is. indien ja -> actie :) wat je nu doet is in principe alleen maar tijd verspilling..

Mathieuke:
Je moet goed kijken wat je programma doet.
Echt goed na gaan wat hier gebeurt want dit gaat niet goed werken.

Je maakt een oneindige lus met WHILE 1 = 1
Dat is ok.

Ik neem aan dat het de bedoeling is dat als je op poort1 drukt dat de teller op het display verhoogt en met poort2 verlaagt.

Maar wat gebeurt er als je bijvoorbeeld op poort1 drukt?
-De teller wordt verhoogt (het programma loopt meteen verder)
-Wacht 50mSec (nutteloos op deze manier)
-Negeert poort2 (want niet ingedrukt)
-Plaatst op het display de tellerstand
-Wacht weer 50mSec (nutteloos)
-Met WEND weer naar WHILE en alles begint opnieuw

Als je de toets ingedrukt houdt dan zal de teller elke 100mSec (50 + 50) verhoogt worden.
Je zult dus ook moeten bekijken wanneer de toets weer wordt losgelaten.

Beter is:


DEVICE 16F628A                ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF

SYMBOL poort1 = PORTB.0
SYMBOL poort2 = PORTB.1
DIM teller AS BYTE

PORTB_PULLUPS ON
DELAYMS 500
CLEAR
CLS

WHILE 1 = 1
 WHILE PORTB & 3 = 3 : WEND    ;Wacht op een toets
 DELAYMS 5

 IF poort1 = 0 THEN INC teller
 IF poort2 = 0 THEN DEC teller

 PRINT AT 1,1, "Parking A:", DEC3 teller

 WHILE PORTB & 3 < 3 : WEND    ;Wacht tot toets los is gelaten
 DELAYMS 5
WEND

Helemaal volledig is dit nog niet maar dit zal wel werken.

Ik blijk het te snappen maar frits ik snap niet wat dat getal "3" daar doet ?

Heeft dat een speciale betekenis ?

3 is hetzelfde als %00000011
De laatste 2 bits zijn 1, de rest is 0.

Je werkt met PORTB.0 en B.1 (oftewel 00000011).

Hierdoor wordt alleen naar deze 2 poorten gekeken en hebben de andere 6 poorten geen invloed op de test.

(Ik had ook beter %00000011 in de code kunnen zetten, dat werkt namelijk ook (vergeet de % niet)).

Als je bijvoorbeeld ook PORTB.7 erbij wil testen dan moet je hier invullen:


WHILE PORTB & %10000011 = %10000011 : WEND    ;Wacht op toets

Aha, nu ben ik mee, bedankt voor verduidelijking !