Prutsertje
bloep....
Ik ben nu bezig met een nieuw project waarinik de PIC daadwerkelijk ga inzetten. (heb net wat experimenten achter de rug)
en ik heb eigenlijk nog een vraagje. Ik wil bepaalde pennen continu laten bewaken op veranderingen, maar als de PIC bijv. een delay routine aan het uitvoeren is, kan het zijn dat hij de korte verandering mist op die pen, hoe lost men dit op ??
die kan je toch alleen aanroepen bij een overflow op TMR0?
Voor zover ik weet is een PIC net zo real-time als een stoeptegel... oftwel niet 
[Bericht gewijzigd door Bernd op ]
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Microcontrollers kunnen op meerdere manieren een interrupt krijgen. Ligt aan het type, maar er zijn timer interrupts, I/O pin change interrupt, enz.
Nee, je kan ook interrupts laten genereren op externe pinnen.
RB0 is zo'n interrupt pin, instellen en klaar voor gebruik.
Der zijn nog interrupt pinnen, maar die hangen wat samen, en dus moeten er wat extra bewerkingen bij. Maar da laatste weet ik zelf nie goed.
Kzou zeggen, lees is door den datasheet, der staat waarschijnlijk een heel hoofdstuk in over interrupts.
k.p.meinesz
Een schizofreen is nooit alleen!
Ik heb geprobeert om zoiets goed werkend te krijgen met meerdere interupts
nl:trm0 overflow
interupt on change
maar dat liep bij mij niet goewd genoeg dus heb het idee laten varen
kijk eens op www.piclist.com
staan goed uitgewerkte asm files die kun je mooi als voorbeeld gebruiken
maar wat jij wilt heet interupt_on_change
en staat beschreven in datasheet
[Bericht gewijzigd door k.p.meinesz op ]
Prutsertje
bloep....
wat ik wil en dacht dat simpel was is weer heel moeilijk 
ik zal eens kijken of de signalen in de praktijk inderdaad zo kort zijn, anders moet ik er toch aan geloven.
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 5 maart 2003 20:41:34 schreef Prutsertje:
wat ik wil en dacht dat simpel was is weer heel moeilijk
Hoe kom je daarbij? Dat lukt jouw heus wel hoor, om dat te laten werken.
sven
pointers don't kill programs, programmers kill programs
Op 5 maart 2003 20:57:03 schreef Bastiaan:
[...]
Hoe kom je daarbij? Dat lukt jouw heus wel hoor, om dat te laten werken.
je kan natuurlijk ook steeds die pennen bewaken, en de rest afhandelen met interrupts
k.p.meinesz
Een schizofreen is nooit alleen!
Op 5 maart 2003 20:41:34 schreef Prutsertje:
wat ik wil en dacht dat simpel was is weer heel moeilijkik zal eens kijken of de signalen in de praktijk inderdaad zo kort zijn, anders moet ik er toch aan geloven.
Als je alleen een pin wilt bewaken met een interupt is dit vrij simpel hoor
echter als je meerdere pinnen(verschillende functies) wordt het al iets ingewikkelder
dan moet je nl eerst kijken welk van de pinnen het interupt veroorzaakt hebben en daarop reageren
als je ook nog met timers wilt werken(is mij nog niet gelukt)dan wordt het echt pittig omdat als er een interupt geactiveerd word je moet kijken of dit veroorzaakt word door je pinnen of je overflow
en omdat je niet wilt dat een overflow gemist word omdat je met de verwerking van je pinnen bezig bent.
vermoedelijk is dit hiervoor een oplossing:
in geval van interupt
kijken welk het interupt gegenereerd heeft
timer of change on pin
vervolgens dit ergens wegschrijven
en in je normale subroutines weer aanroepen en reseten
zodat je interrupt zo kort mogelijk duurt
PS ergens op het forum staat een artikel van Bastiaan over interupts hoe deze te activeren
Zodra het woord interrupt valt rennen veel mensen meteen weg...Jammer! Het gebruik (zeker bij PIC's) is echt niet zo moeilijk als je denkt. Lees het hoofdstukje 'interrupts' in de datasheet en probeer het gewoon. Grote kans dat je het snel onder de knie krijgt. En vergeet niet dat interrupts voor veel eenvoudigere programma's kunnen leiden.
Toen ik voor het eerst met interrupts ging werken had ik ook een gevoel van 'aaaarrrrgghhh...eng...moeilijk!'.
En na een dagje prutsen had ik het werkend..
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Pas met 'interrupt on change' op dat *iedere* leesactie op poort B die 'changed' status zal resetten. In praktijk is die 'interrupt on chnage' alleen betrouwbaar als de processor in 'sleep' is (zie ook de datasheet).
Zijn die pulsen trouwens echt zo kort? Als je nu eens gewoon in de delay routines voortdurend die inputs checkt?
Prutsertje
bloep....
Op 6 maart 2003 14:46:37 schreef Wouter van Ooijen:
Pas met 'interrupt on change' op dat *iedere* leesactie op poort B die 'changed' status zal resetten. In praktijk is die 'interrupt on chnage' alleen betrouwbaar als de processor in 'sleep' is (zie ook de datasheet).Zijn die pulsen trouwens echt zo kort? Als je nu eens gewoon in de delay routines voortdurend die inputs checkt?
hehe, dat heb ik dus nu net gedaan 
bedankt voor het meedenken.
Prutsertje
bloep....
Heb ik weer iets nieuws 
Als ik de puls eerst op RA0 en dan op RA1 krijg wil ik routine X aanroepen, Als ik de puls eerst op RA1 en dan pas op RA0 krijg wil ik routine Y aanroepen, gebeurt er niks of word de tweede puls niet binnen een bepaalde periode ontvangen gewoon weer terug naar de vorige routine. Ik wil nml de bewegingsrichting van een object bepalen. Kan dat ??
[Bericht gewijzigd door Prutsertje op ]
k.p.meinesz
Een schizofreen is nooit alleen!
Op 6 maart 2003 17:08:57 schreef Prutsertje:
Heb ik weer iets nieuwsAls ik de puls eerst op RA0 en dan op RA1 krijg wil ik routine X aanroepen, Als ik de puls eerst op RA1 en dan pas op RA0 krijg wil ik routine Y aanroepen, gebeurt er niks of word de tweede puls niet binnen een bepaalde periode ontvangen gewoon weer terug naar de vorige routine. Ik wil nml de bewegingsrichting van een object bepalen. Kan dat ??
Ja dat kan
Prutsertje
bloep....
Op 6 maart 2003 17:59:50 schreef k.p.meinesz:
[...]
Ja dat kan
gemenerik
, geef eens een hint, want ik heb er echt geen idee meer van hoe ik dat moet doen.
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 6 maart 2003 19:31:12 schreef Prutsertje:
[...]gemenerik
, geef eens een hint, want ik heb er echt geen idee meer van hoe ik dat moet doen.
Met een state machine 
Prutsertje
bloep....
Op 6 maart 2003 19:36:51 schreef Bastiaan:
[...]
Met een state machine
Staat daar iets over in de datasheet dan ??
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 6 maart 2003 19:46:59 schreef Prutsertje:
[...]
Staat daar iets over in de datasheet dan ??
Nee, dat is een bepaalde programmeertechniek. Ik zit je wat te pesten want aan alleen dat begrip heb je ook niks.
Prutsertje
bloep....
Maar even to the point, is dat te doen voor een beginner, of zijn daar voorbeeldcodes van die ik kan aanpassen of zeg je, begin er niet aan je word gek van alle info die je moet kennen.... ???
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Het begin van wat je wilt is makkelijk te doen. Moet je gewoon testen welke er als 1e komt en dan naar de desbetreffende routine springen. Dat met die tijd wordt ietsje lastiger, je moet dan de timer gebruiken.
Hoe lang is dat "tijdje"?
Prutsertje
bloep....
een paar seconden, zeg 5 fo zo. Ik wil dit doen omdat het twee bewegings sensors die op een handbeweging gaan reageren de schakeling geven, die sensor zijn nogal gevoelig en om foute schakelingen te voorkomen wil ik dus een soort van tijdsraampje inbouwen.
k.p.meinesz
Een schizofreen is nooit alleen!
Op 6 maart 2003 22:18:22 schreef Prutsertje:
een paar seconden, zeg 5 fo zo. Ik wil dit doen omdat het twee bewegings sensors die op een handbeweging gaan reageren de schakeling geven, die sensor zijn nogal gevoelig en om foute schakelingen te voorkomen wil ik dus een soort van tijdsraampje inbouwen.
Okee was een beetje flauw van me
zal je opweg proberen te helpen
monitor beide pinnen die je wilt gebruiken
met bv:
pintest btfsc portb,1
goto pin1 (pin1 is dan geactiveerd
btfsc portb,2
goto pin2 (pin2 is geactveerd)
goto pintest (geen pin terug naar begin)
pin1 movlw 0ffh
movwf pauzetijd
pin1a btfsc portb,2
goto ab (pin2 is ook actief)
goto pauze1 (pin2 nog niet actief)
pin2 movlw 0ffh
movwf pauzetijd
pin2a btfsc portb,1
goto ba
goto pauze2
pauze1 decfsz pauzetijd
goto pin1a
goto nopin
Pauze2 decfsz pauzetijd
goto pin2a
goto nopin
ab (wat je maar wilt)
ba (wat je maar wilt)
nopin (wat je maar wilt)
deze code bevat geen debounce routine(grote kans op fouten)
en zal doorgaan totdat de juiste pin volgorde binnen de aangegeven(pauzetijd)is gedaan .
je kunt ook de interupt_on_change
gebruiken
dan moet je na de ISR(datasheet)
meteen kijken welk interupt geactiveerd is
TRM0 of INT ON CHANGE
indien TRM0 dan niets indien INT ON CHange dan pin
controleren en ergens opslaan
dan elke TRM0 ergens tellen totdat er weer een INT ON CHange is of TRM0 xMaal is voor gekomen
indien TRM0 xMaal dan reset pin opslag
indien INT ON CHange pin controleren zelfde pin reset
andere pin doorgaan met subroutine x
het beste kun je alleen de basis controles in de ISR uitvoeren dus:
int on change of trm0
en indien port change de poort naar een adres wegschrijven
indien trm0,trm0 waarde wegschrijven(optellen,aftrekken)
vervolgens meteen de ISR afsluiten en de waarden dan pas
controleren in je normale subroutines anders heb je de kans dat je dingen mist
ehh en denk er ff om dat je een debounce inbouwt voor je pinnen
Ik hoop dat ik je zo een zet in de juist richting heb gegeven
Prutsertje
bloep....
bedankt, ik ga het stukje code eens uitpluizen, als het daarmee niet lukt zal ik toch maar op de interupts moeten storten 
Prutsertje
bloep....
OK ik ben er uit 
;----------------------------- .ASM file voor het richtingdetectie project -------------------------
;
; PIC16F84A ASM file
; Gemaakt door Martin Lion
;
; Bewegingsrichtingdetectie
; Build 1.0c
;
;-----------------------------------------------------------------------------------------
porta EQU 05h
portb EQU 06h
teller EQU 40h
teller2 EQU 41h
teller3 EQU 42h
teller4 EQU 43h
pauzetijd EQU 44h
teller5 EQU 45h
teller6 EQU 46h
teller7 EQU 48h
teller8 EQU 49h
instelportb EQU 86h
ORG 00h ;beginadres kiezen
BSF 03,5 ;kies bank 1
CLRF instelportb ;alles pinnen poort A uitgang maken
MOVLW b'00000011'
BCF 03,5 ;kies bank 0
ledloop MOVLW 01h ;laad 01h in W
MOVWF portb ;zet ledje aan
CALL tijdjewachten ;roep de subroutine voor de delay aan
MOVLW 02h ;laad 02h in W etc. etc.
MOVWF portb
CALL tijdjewachten
MOVLW 04h
MOVWF portb
CALL tijdjewachten
GOTO ledloop
ledflash MOVLW 07h ;laad 07h in W
MOVWF portb ;zet ledje aan
CALL tijdjewachten2 ;roep de subroutine voor de 2e delay aan
MOVLW 00h ;laad 00h in W
MOVWF portb ;zet ledje aan
CALL tijdjewachten2 ;roep de subroutine voor de 2e delay aan
GOTO ledflash
;---------SUB ROUTINES------------------
tijdjewachten MOVLW 0FFh ;laad 082h in W
MOVWF teller2
verder GOTO pintest
pintest btfsc porta,0
goto pin1 ;(pin1 is dan geactiveerd
btfsc porta,1
goto pin2 ;(pin2 is geactveerd)
goto nopin ;(geen pin terug naar begin)
pin1 call pauzeloop1
pin1a btfsc porta,1
goto ab ;(pin2 is ook actief)
goto pauze1 ;(pin2 nog niet actief)
pin2 call pauzeloop2
pin2a btfsc porta,0
goto ba
goto pauze2
pauzeloop1 movlw 0ffh
movwf pauzetijd
pauze1 movlw 0ffh
movwf teller5
pauze1a decfsz teller5, 1
goto pauze1a
decfsz pauzetijd, 1
goto pin1a
goto nopin
pauzeloop2 movlw 0ffh
movwf pauzetijd
pauze2 movlw 0ffh
movwf teller5
pauze2a decfsz teller5, 1
goto pauze2a
decfsz pauzetijd, 1
goto pin2a
goto nopin
ab goto ledflash
ba goto ledloop
nopin MOVLW 0FFh
MOVWF teller
opnieuw DECFSZ teller, 1
GOTO opnieuw
DECFSZ teller2, 1
GOTO verder
RETURN ; spring weer terug van waar je vandaan kwam
tijdjewachten2 MOVLW 0FFh ;laad 082h in W
MOVWF teller4
verder2 GOTO pintestx
pintestx btfsc porta,0
goto pin1x ;(pin1 is dan geactiveerd
btfsc porta,1
goto pin2x ;(pin2 is geactveerd)
goto nopinx ;(geen pin terug naar begin)
pin1x call pauzeloop1x
pin1ax btfsc porta,1
goto abx ;(pin2 is ook actief)
goto pauze1x ;(pin2 nog niet actief)
pin2x call pauzeloop2x
pin2ax btfsc porta,0
goto bax
goto pauze2x
pauzeloop1x movlw 0ffh
movwf pauzetijd
pauze1x movlw 0ffh
movwf teller5
pauze1ax decfsz teller5, 1
goto pauze1ax
decfsz pauzetijd, 1
goto pin1ax
goto nopinx
pauzeloop2x movlw 0ffh
movwf pauzetijd
pauze2x movlw 0ffh
movwf teller5
pauze2ax decfsz teller5, 1
goto pauze2ax
decfsz pauzetijd, 1
goto pin2ax
goto nopinx
abx goto ledflash
bax goto ledloop
nopinx MOVLW 0FFh
MOVWF teller3
opnieuw2 DECFSZ teller3, 1
GOTO opnieuw2
DECFSZ teller4, 1
GOTO verder
RETURN ; spring weer terug van waar je vandaan kwam
END
Nu weet ik dat er een verwijzing in de subroutines zit naar de routine waar ze net uitkwamen en dat dat weinig zin heeft, maar het is de bedoeling dat straks andere routines worden aangeroepen. dit is maar een voorbeeldje zodat ik met ledjse en schakelaars e.e.a. kan testen op m'n oefenprintje.
p.s. Bestaan er sites waar voor de PIC16F84 veel projecten met .asm files bij elkaar staan zodat ik hier e.e.a. kan rippen en gebruiken ?? Graag wat links..