PDA

View Full Version : Can anyone help a newcomer?



scopit
- 17th October 2009, 12:37
Hi everyone
I'm new to the forum and on my first PIC project. I have built my own JDM2 programmer and test board. I have tried searching the forum but so far I haven't found an answer to my problem.

I am building a telescope drive and I want to interface a Honeywell HOA2001 optical encoder to a 16F84. I want to drive Rb0/INT from the TTL output of the encoder so I can generate an edge triggered interrupt when the path is clear.

When I connect the two directly RB0 does not rise above 1.6V and the interrupt is neve triggered. If I disconnec the output of the encoder is changing between 0 and 5v

Does anyone have any experience of doing this or a schematic I could look at?

Thanks
Scopit

Jerson
- 17th October 2009, 13:48
Hi scopit

Welcome to the forum. I can suggest you look at your TRISB settings. Have you set RB0 to input direction? If that doesn't work, don't be afraid to post your code here.

Acetronics2
- 17th October 2009, 13:59
Hi, Scopit

a small piece of scheme showing , at least, the optobarrier + Pic input connection + supply could be very useful too.

Alain

scopit
- 17th October 2009, 14:10
Hi scopit

I can suggest you look at your TRISB settings. Have you set RB0 to input direction?

Hi Jerson,
Thanks for the welcome and the suggestion. RB0 is set to an input and I can connect the pin to 5V and trigger the interrupt routine manually. I have also tried enabling the internal pull ups via the option register, but no difference.

Here's my code which is not the complete progam yet. I have been testing step by step to make sure I have configured correctly. Forgive me if it not the best written code, this is my first serious program!


Any help is gratefully appreciated
Scopit



list p=16F84A ; list directive to define processor
#include <p16F84a.inc> ; processor specific variable definitions

; Set up constants

TIMER EQU 0x01 ; TMR0 register address
STATUS EQU 0x03 ; Status register address
PORTA EQU 0x05 ; Bank0 PORTA register address
PORTB EQU 0x06 ; Bank0 PORTB register address
INTREG EQU 0x0B ; INTCON register address
OPTREG EQU 0x81 ; OPTION register address
TRISA EQU 0x85 ; Bank1 PORTA register address
TRISB EQU 0x86 ; Bank1 PORTB register address

; Set up constants

TARGET EQU 0x59 ; Target interval ideal value of 89Dec 59Hex
OLOOP1 EQU 0xE0 ; Initial loop value for fine control 128
ILOOP1 EQU 0xE0 ; Initial loop value for coarse control 27H

; Registers for program varialbles

OUTERL EQU 0x10 ; Fine control delay value register
INNERL EQU 0x11 ; Coarse control delay value register
STORE EQU 0x12 ; Temporary register
OLOOP EQU 0x13 ; Fine control delay count register
ILOOP EQU 0x14 ; Coarse control delay count register
WREG EQU 0x16 ; Stores W reg during interrupt
SREG EQU 0x17 ; Stores STATUS reg during interrupt

; Reset
ORG 0x00 ; Power up and reset code start
GOTO Setup ; Skip over interrupt routine

; Interrupt subroutine
ORG 0x04
; Store STATUS and W Registers in temporary locations
MOVWF WREG
SWAPF STATUS,W ; Does not affect STATUS bits
MOVWF SREG
; Use PORTA bit 1 to signal interrupt
BSF PORTA,1
;Display
MOVF STORE,0 ; Move STORE to W
MOVWF PORTB ; Display TMR0 value on PORTB1-7
; Clear Interrupts and flags
CALL Intclr ; Clear interrupts and reset prescalar values
; Retore STATUS and W Registers from temporary locations
SWAPF SREG,W ; Does not affect STATUS bits
MOVWF STATUS
SWAPF WREG,F
SWAPF WREG,W
RETFIE ; Clears GIE bit in INTCON

Setup
; Set up Ports
BSF STATUS,5 ; Switch to BANK1
MOVLW 0x00 ; Move 00000000 to W
MOVWF TRISA ; Set outputs RA0=PWM RA2=TMR0 RA3=Interrupt
MOVLW 0x01 ; Move 00000001 to W
MOVWF TRISB ; Set RB0 input, RB1--8 as outputs
BSF STATUS,5 ; Switch to Bank1
; Set up option register
; BSF OPTREG,7 ; Enable PORTB pull ups
BSF OPTREG,6 ; Enable INTEDG, trigger RBO/INT on rising edge
BCF OPTREG,3 ; Assign Prescaler to TMR0
BSF OPTREG,2 ; Set prescalar to 1:256
BSF OPTREG,1 ; Set prescalar to 1:256
BSF OPTREG,0 ; Set prescalar to 1:256
BCF STATUS,5 ; Switch to Bank0
; Clear ports and flag register
CLRF PORTA
CLRF PORTB
; CLRF FLAG
; Initialise loop values
MOVLW ILOOP1
MOVWF INNERL ; Initialise inner loop
MOVLW OLOOP1
MOVWF OUTERL ; Initialise outer loop
; Clear interrupts
CALL Intclr
BCF INTREG,5 ; Disable TOIE in INTCON
BSF INTREG,4 ; Enable INTE in INTCON
BSF INTREG,7 ; Enable GIE in INTCON

; Main Program
Main
BSF PORTA,0 ; PWM high clcle
CALL Delay ; PWM high clcle
BCF PORTA,0 ; PWM low cycle
CALL Delay ; PWM low cycle
GOTO Main ; PWM high until interrupt on RB0

; Subroutines

Intclr
; Clear and enable interrupts
; Set bit 4 to enable INTE RB0/INT,
; Clear all other bits
BCF INTREG,0 ; Clear RBO INT flag
BCF INTREG,1 ; Clear RBO INT flag
BCF INTREG,2 ; Clear TOIF flag
;Reset prescalar values in option register
BSF STATUS,5 ; Switch to Bank1
BSF OPTREG,6 ; Enable INTEDG, trigger RBO/INT on rising edge
BCF OPTREG,3 ; Assign Prescaler to TMR0
BSF OPTREG,2 ; Set prescalar to 1:256
BSF OPTREG,1 ; Set prescalar to 1:256
BSF OPTREG,0 ; Set prescalar to 1:256
BCF STATUS,5 ; Switch to Bank0
RETURN

Delay
; Delay subroutine to keep PWM pulse low
; Total number instructions (4+((Outer*5)=1)+(Inner*3)+1))
MOVF OUTERL,0 ; Copy Outer loop value to W
MOVWF OLOOP ; Copy Outer loop value to loop count register
Outer
MOVF INNERL,0 ; Copy Inner loop value to W
MOVWF ILOOP ; Copy Inner loop value to loop count register
Inner
DECFSZ ILOOP,1
GOTO Inner

DECFSZ OLOOP,1
GOTO Outer

RETURN

; End of subroutines

END ; directive 'end of program'

scopit
- 17th October 2009, 14:32
Hi, Scopit

a small piece of scheme showing , at least, the optobarrier + Pic input connection + supply could be very useful too.

Alain

Hi Alain
I don't have a good schematic tool but I hope the attached picture from the HOA2001 datasheet helps. I have added some comments on the connections.
Thanks.
Scopit

Acetronics2
- 17th October 2009, 15:07
I note your Tx diode is rated @ 10 mA If ...

you use 3.4 mA ...

may be a bit weak ... try 330 Ohms.

BTW did you verify the pic input ( out of the board ) with an Ohmmeter ???

Could you describe the supply ??? ( regulator, capacitors value, Pic decoupling ? , Opto decoupling ? - HOA datasheet tells about ...)

any .1µF between Pic supply Pins ???

Alain

scopit
- 17th October 2009, 15:43
Alain
Thanks for the input on the Tx diode. I have checked the output of the opto encoder and the pin is toggling so I am assuming the diode is working.
I am using screw terminals to wire up the opto coupler and I have tested the connection to RB0 and it's good. I can also put a wire between the screw terminal and 5V and I can trigger the interrupt.

The power supply is a regulated DC 6V 300mA plug type. On the board have a 7805 regulator with 10uf + 100nF decoupling capacitors. I have 100nF at the opto encoder supply.

Thanks
Danny

Acetronics2
- 17th October 2009, 15:53
Hi,

Interrupts seem to be Valid ( Why use another name for INTCON reg ???)

... I will try the bread board now ...

Alain

scopit
- 17th October 2009, 16:31
Why use another name for INTCON reg ???

This was because I could not get the interrupts to work at first. I didn't know if there was a problem to use INTCON and so I changed it. I did the same with OPTION....it was just desperation I spent hours on this!
The problem appeared to be that I was using MOVFW to write to INTCON. Once I change to BCF/BSF everything worked!

scopit
- 17th October 2009, 19:39
Alain
I took your advice and increased the TX diode current. At the same time I tried a weak pull up on the output of the optical encoder. This seems to have done the trick and the interrupt is now being triggered.
Thanks very much to you and Jerson for taking the time to help me.
I will stay on the forum, it's a very useful resource.
Danny

scopit
- 17th October 2009, 21:21
I tried a weak pull up on the output of the optical encoder. This seems to have done the trick and the interrupt is now being triggered.


Seems it wasn't a solution :(
It is now in that frustrating state of intermittent

bcd
- 17th October 2009, 23:59
The power supply is a regulated DC 6V 300mA plug type. On the board have a 7805 regulator with 10uf + 100nF decoupling capacitors. I have 100nF at the opto encoder supply.


That 6v adaptor won't give a lot of headroom to the 5v reg if it is a standard 7805 style one - this might cause inconsistencies if it is borderline on the regulation and cannot supply the current for the opto LED. I always design at least 2 and ideally over 3v more input than the output of the reg.
Do you have a 9v DC plug pack you could try ?

Bill.

scopit
- 18th October 2009, 09:28
Do you have a 9v DC plug pack you could try ?
Bill.
Hi Bill
The plug pack is switchable, I'll up it to 7.5 & 9v and see if it makes a difference.
I suspect the problem is between the receiver and the PIC as the input to RB0 is clamped at 1.65V.
But at the moment, I'll try anything!
Thanks for the input and I'll get back to you once I've tested
Danny

scopit
- 18th October 2009, 18:32
Here's the latest!

I have upped the PSU voltage and checked all the connections.With a pull up resistor the optical encoder output switches between 1.3 and 4.4 volts.

It will trigger the interrupt the first time it goes high. No further interrupts occur.
If I reset with encoder output low, then the first low low to high transition triggers the interrupt.
If I reset with encoder output high, then the interrupt is not triggered.

If I replace the encoder output with a switch to 5volts, I can trigger multiple interrupts so the software looks like it's working.

Any ideas anyone?
Thanks
Danny

dhouston
- 18th October 2009, 19:23
Look at Table 4.3 and Table 9.2 of the 16F84A datasheet. When configured as an External Interrupt, RB0 has a Schmitt Trigger input buffer which needs 0.8*Vdd for a logic high and 0.2*Vdd for logic low. Your voltages appear to be marginal.

scopit
- 18th October 2009, 20:31
Look at Table 4.3 and Table 9.2 of the 16F84A datasheet. When configured as an External Interrupt, RB0 has a Schmitt Trigger input buffer which needs 0.8*Vdd for a logic high and 0.2*Vdd for logic low. Your voltages appear to be marginal.

Thanks Dave, I'll check the voltages again but from your post, the problem may be on the logic low.

dhouston
- 18th October 2009, 21:10
Thanks Dave, I'll check the voltages again but from your post, the problem may be on the logic low.I agree - after sensing the first high, it never senses a low, so it cannot sense another low-to-high transition.

dhouston
- 18th October 2009, 21:11
Thanks Dave, I'll check the voltages again but from your post, the problem may be on the logic low.It appears that after sensing the first high, it never senses a low, so it cannot sense another low-to-high transition.

scopit
- 20th October 2009, 09:23
It appears that after sensing the first high, it never senses a low, so it cannot sense another low-to-high transition.

Thanks Dave you were right. I removed the pull up and in the process found a dry joint. This may have been the source of the issue in the first place, but was causing the intermittent behaviour.

Interrupt is working now and I can continue working through the testing.

Thanks everyone for your help.
Danny