hjälp med Ultraljudssensor och PIC

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Texpie
Inlägg: 2
Blev medlem: 13 februari 2009, 09:51:41

hjälp med Ultraljudssensor och PIC

Inlägg av Texpie »

Hej!
Jag håller på att (försöka) bygga en liten robot som ska gå frammåt tills den känner att den är på väg in i ngt, då ska den svänga. Jag använder mig av en Ultraljudssensor, SRF05 (http://www.robot-electronics.co.uk/htm/srf05tech.htm), och en PIC16F690. Nu har jag försökt göra ett program som ska få PICen att reagera (släcka en lampa) när något är närmare än ca en dm (som motsvaras av ca 384 uS). Problemet är bara att den inte gör det.

Nedanstående program har jag:

Kod: Markera allt

#include<C:\Program Files\Microchip\MPASM Suite\p16F690.inc>

	__config(_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF &_CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

	cblock 0x20
delay1
delay2
	endc
	
	cblock 0x70
W_save
STATUS_save
	endc
	
	org 0
	goto Start
	nop
	nop
	nop

ISR: 
	movwf	W_save
	movf	STATUS,w
	movwf	STATUS_save
	
	bcf		PORTC,0 ; släck LED
	
	movf	STATUS_save,w
	movwf	STATUS
	swapf	W_save,f
	swapf	W_save,w
	retfie

Start:
	bsf		STATUS, RP0
	movlw	b'0000100'
	movwf	TRISA
	clrf	TRISC
	
	BSF 	STATUS,RP1 ;Bank 2
	CLRF 	ANSEL ;digital I/O
	bcf		STATUS, RP0
	bcf		STATUS, RP1raktfram:	
	
delayloop:
	decfsz	delay1, f	;väntar 2/10 s, för att man ska se om lampan blinkar.
	goto 	delayloop
	decfsz	delay2, f
	goto	delayloop

	bsf		PORTC, 0 ; sätt på LED
	
	bsf		PORTA,1 ;sänd trigger
	
	nop	; vänta 10 uS
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	
	bcf		PORTA, 1 ; slut på trigger
	
	movlw	B'1001000'
	movwf	INTCON		; globala interrupt och external interrupts är tillåtna
	bcf		OPTION_REG, 6  ;interrupta när RA2 faller
	
delay:     				; vänta 768 uS
    decfsz  delay1,f
    goto    delay
	
    movlw	b'00000000'
    movwf	INTCON
    
    goto raktfram
    
    end
enda resultatet jag får är att LEDen (PORTC,0) tänder sig och förblir tänd och att den lilla lampan bak på sensorn blinkar oregelbundet.

Är det någon som vet vad som är fel?
sodjan
EF Sponsor
Inlägg: 43288
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: hjälp med Ultraljudssensor och PIC

Inlägg av sodjan »

> #include<C:\Program Files\Microchip\MPASM Suite\p16F690.inc>

Det borde räcka med : #include "p16f690.inc"

> bsf/bcf STATUS, RP0/RP1

Använd BANKSEL istället, det är ett litet hel--et att följa dina bcf/bsf av RP0/RP1...

Sen så behöver du kommentera bättre så att framgår hur du har *tänkte* när du skrev
koden. Jag tror inte att den gör det du tror att den gör. För det som du beskriver i texten
innan koden, så ser det ut att vara misstänkt lite kod...
Texpie
Inlägg: 2
Blev medlem: 13 februari 2009, 09:51:41

Re: hjälp med Ultraljudssensor och PIC

Inlägg av Texpie »

Hej och tack för svaret!

Här är en mer kommenterad och lite omgjord verision av programmet.
Tanken är att programmet ska sätta igång sensorn (skicka en trigger på portA, 1). När det är gjort kommer sensorn att skicka ut en etta på sin utgång (som är kopplad till port A, 2) denna kommer att sänkas om Sensorn känner av något. Tanken är då att programmet ska "interruptas" om detta händer inom ca 770 uS (ca en dm) och då släcka LEDen, så att jag ser att sensorn har kännt av något. Därefter ska programmet återgå till huvudprogrammet, vänta lite, tända LEDen igen och sedan skicka ut en ny signal till Sensorn.

Det som händer nu är att LEDen på PORTC, 1 tänds och att den lilla lampan bak på sensorn blinkar oregelbundet.

Kod: Markera allt

#include "p16F690.inc"

	__config(_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF &_CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

	cblock 0x20
delay1
delay2
	endc
	
	cblock 0x70
W_save
STATUS_save
	endc
	
	org 0
	goto Start
	nop
	nop
	nop

ISR:						; Hoppa hit vi Interrupt 
	movwf	W_save			; Spara innehållet i w och STATUS registret.
	movf	STATUS,w		;
	movwf	STATUS_save		;
	
	bcf		PORTC,0			; släck LEDen
	
	movf	STATUS_save,w	;flytta tillbaka innehållet i w och STATUSregistret
	movwf	STATUS
	swapf	W_save,f
	swapf	W_save,w
	retfie					;gå tillbaka till huvudfunktionen

Start:
	BANKSEL	TRISA
	movlw	b'11111101'	;
	movwf	TRISA		;gör pin 1 på port A till utgång (för att sända trigger till sensorn) och de andra till ingångar
	clrf	TRISC		; gör alla pins i PORTC till utgångar (för att tända LEDen)
	
	BANKSEL 0x00
	

raktfram:	
	
delayloop:
	decfsz	delay1, f	;väntar 2/10 s, för att man ska se om LEDen blinkar.
	goto 	delayloop
	decfsz	delay2, f
	goto	delayloop

	bsf		PORTC, 0 ; tänd LEDen
	
	bsf		PORTA,1 ;sänd trigger till Sensorn
	
	nop	; vänta 10 uS
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	
	bcf		PORTA, 1 ; slut på trigger
	
	movlw	B'1001000'
	movwf	INTCON		; globala interrupt och external interrupts är tillåtna
	bcf		OPTION_REG, 6  ;interrupta när pin nr 2 på port A faller, där sensorn är inkopplad
							; dvs när sensorn registrerar något
	
delay:     				; vänta 768 uS ~=1 dm
    decfsz  delay1,f	;Så, under de första ca 770 uS efter att man har skickat en trigger till sensorn
    goto    delay		;kommer interrupt från portA,2 (externa interrupt-pin) vara tillåtna.
		
    movlw	b'00000000'	; förbjud interrupt efter den tiden för att den inte ska reagera på hinder för långt bort
    movwf	INTCON
    
    goto raktfram
    
    end
Användarvisningsbild
AntiZ
Inlägg: 321
Blev medlem: 22 februari 2007, 13:34:14
Ort: V. Husby
Kontakt:

Re: hjälp med Ultraljudssensor och PIC

Inlägg av AntiZ »

Hej!

Nu var det länge sedan jag pysslade med PIC, men denna kodsnutt (och den andra delay):
delayloop:
decfsz delay1, f ;väntar 2/10 s, för att man ska se om LEDen blinkar.
goto delayloop
decfsz delay2, f
goto delayloop
delay: ; vänta 768 uS ~=1 dm
decfsz delay1,f ;Så, under de första ca 770 uS efter att man har skickat en trigger till sensorn
goto delay ;kommer interrupt från portA,2 (externa interrupt-pin) vara tillåtna.
Hur är det tänkt att de fungerar? Decrease f, skipp if zero, men vad är delay1 o 2 satt till, är de 0, 0xFF?!? Kan det vara så att dessa loopar (både denna och den med bara en delay i princip hoppas över och du märker aldrig att LED tänds/släcks. (med ett oscilloskop kan man kolla sånt lätt... :tumupp: ).

Det andra ser hyggligt rätt ut, utan att jag har stenkoll. Men jag skulle börja med att kolla dessa delay-loopar, efter det du nog be någon med färskare koll på PIC (sodjan) snällt om tips.

Kolla även om INTCON ska aktiveras innan OPTION_REG sätts. Kan vara så att det blir nått skit där (men borde bara bli första "varvet").
Skriv svar