PIC .ASM vraagje

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 ??

bloep....

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 woensdag 5 maart 2003 18:16:58

Microcontrollers kunnen op meerdere manieren een interrupt krijgen. Ligt aan het type, maar er zijn timer interrupts, I/O pin change interrupt, enz.

Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer

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.

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 woensdag 5 maart 2003 19:37:45

Een schizofreen is nooit alleen!

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.

bloep....

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.

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: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

pointers don't kill programs, programmers kill programs

Op 5 maart 2003 20:41:34 schreef Prutsertje:
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.

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

Een schizofreen is nooit alleen!

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..

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?

Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog

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 :P

bedankt voor het meedenken.

bloep....

Heb ik weer iets nieuws :P

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 donderdag 6 maart 2003 17:12:37

bloep....

Op 6 maart 2003 17:08:57 schreef Prutsertje:
Heb ik weer iets nieuws :P

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 ??

Ja dat kan

Een schizofreen is nooit alleen!

Op 6 maart 2003 17:59:50 schreef k.p.meinesz:

[...]

Ja dat kan

:D gemenerik ;) , geef eens een hint, want ik heb er echt geen idee meer van hoe ik dat moet doen.

bloep....

Op 6 maart 2003 19:31:12 schreef Prutsertje:
[...]
:D gemenerik ;) , geef eens een hint, want ik heb er echt geen idee meer van hoe ik dat moet doen.

Met een state machine :D

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:36:51 schreef Bastiaan:

[...]

Met een state machine :D

Staat daar iets over in de datasheet dan ??

bloep....

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.

Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer

:) 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.... ???

bloep....

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"?

Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer

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.

bloep....

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:

code:


 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

Een schizofreen is nooit alleen!

bedankt, ik ga het stukje code eens uitpluizen, als het daarmee niet lukt zal ik toch maar op de interupts moeten storten :)

bloep....

OK ik ben er uit :)

code:


;----------------------------- .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..

bloep....