I started out with a 74c922 but that didnt work many problems, so I designed this. it requires the PIC its hooked up to to receive the data after a pulse has been sent to its IRQ pin, then after the data has been received the PIC must send a pulse back to the Controller PIC's IRQ (RB0) to clear the data (which will let the user know data was sent and received by the LED)
Looking for some of you more knoledgeable programmers to tell me if you see a problem, or a better way, etc.... I am using the "On Interrupt's" right now till I get that down then I will learn that other package for IRQ's
Basic layout of code on the External PIC
Code:
ON Interrupt goto handler
handler
read data in on 4 pins your choice and store in a variable
send a high to RB0 on the Controller PIC with a pin of your choice
pause 10
exit handler
resume
now for the Controller PIC's Code
Code:
TRISA = %11110000
TRISB = %00000001
OUT VAR Byte
on Interrupt Goto MYINT ' Define interrupt handler
INTCON = $90 ' Enable INT0 interrupt
OPTION_REG = $7f 'PORTB Pull Up
LOOP:
'************Clear All data**************************
PORTA = 0
out = 16
PORTB.1 = 0
PORTB.2 = 0
'************Data Cleared, Start Data Collection*****
PORTB.4 = 1
if PORTA.4 = 1 then out = 0
if PORTA.5 = 1 then out = 1
if PORTA.6 = 1 then out = 2
if PORTA.7 = 1 then out = 3
PORTB.4 = 0
PORTB.5 = 1
if PORTA.4 = 1 then out = 4
if PORTA.5 = 1 then out = 5
if PORTA.6 = 1 then out = 6
if PORTA.7 = 1 then out = 7
PORTB.5 = 0
PORTB.6 = 1
if PORTA.4 = 1 then out = 8
if PORTA.5 = 1 then out = 9
if PORTA.6 = 1 then out = 10
if PORTA.7 = 1 then out = 11
PORTB.6 = 0
PORTB.7 = 1
if PORTA.4 = 1 then out = 12
if PORTA.5 = 1 then out = 13
if PORTA.6 = 1 then out = 14
if PORTA.7 = 1 then out = 15
PORTB.7 = 0
if out < 16 then goto send
Goto loop 'No Buttons Pressed, Check Again
'Loop will continue to send pulse for data ready till OUT = 16 (see MYINT)
SEND:
PORTA = out 'Will output to PORTA 0 - 3
if out > 15 then goto loop 'Failsafe for Bad Data
PORTB.1 = 1 'Send Data Ready Pulse for External Microprocessor's INT0 (RB0)
pause 5
PORTB.1 = 0 'Clear Pulse & External Microprocessor will run its Interrupt
goto send
' ****** Interrupt handler *******
Disable ' No interrupts past this point
MYINT: 'Should only be triggered during the SEND loop
out = 16 'Sets OUT to default, when returned to SEND loop, returns to LOOP
PORTB.2 = 1 'Signal Received LED ON
pause 1000 ' will be changed to 25 after program tests good.
PORTB.2 = 0 'Signal LED OFF
INTCON.1 = 0 ' Clear interrupt flag
Resume ' Return to main program
Enable
Tell me what you think, ideas, options, etc...
Bookmarks