/*
* Program to use interrupts to send data over 6821 parallel port.
*
*/
#include <hc11.h>
#include "pia.h"
unsigned char s[] = "AARDVARK";
int i;
main()
{
/* Set up 6821 Port B for output with handshaking
*/
PIA_CRB = 0x00; /* Select DDRB */
PIA_DDRB = 0xff; /* Make Port B output */
/*
* Set up Port B for handshaking:
* CRB = X X 1 0 0 1 0 1
* | | | | | | | |
* | | | | | | IRQB1 set on falling edge of CB1,
* | | | | | | interrupt generated
* | | | | | |
* | | | | | Select Port B Data
* | | | | |
* | | CB2 is output, interlock handshaking
* | |
* Read-only flag bits
*/
PIA_CRB = 0x25;
/* Set up interrupt vector */
IRQ_JMP = JMP_OP_CODE;
IRQ_VEC = irq_isr;
/* Clear IRQB1 by reading Port B */
PIA_B;
enable();
i = 0;
PIA_B = s[i++];
while (TRUE)
{
}
}
#pragma interrupt_handler irq_isr;
void irq_isr(void)
{
PIA_B; /* Read PIA_B to clear interupt flag */
PIA_B = s[i++]; /* Put data on PIA_B output */
if (s[i] == '\0')
PIA_CRB = 0x24; /* Done with string; disable interrupts */
}
/*
* Program to receive string on PIA Port A and display it
* on PIA Port B using interrupts
*
*/
#include <hc11.h>
#include "pia.h"
main()
{
/* Set up 6821 Port A for input with handshaking
*/
PIA_CRA = 0x00; /* Select DDRA */
PIA_DDRA = 0x00; /* Make Port A input */
/*
* Set up Port A for handshaking:
* CRA = X X 1 0 0 1 0 1
* | | | | | | | |
* | | | | | | | Interrupt generated on falling edge of CA1.
* | | | | | | |
* | | | | | | IRQA1 set on falling edge of CA1,
* | | | | | |
* | | | | | Select Port A Data
* | | | | |
* | | CA2 interlock handshaking
* | |
* Read-only flag bits
*/
PIA_CRA = 0x25;
/* Set up 6821 Port B for output
*/
PIA_CRB = 0x00; /* Select DDRB */
PIA_DDRB = 0xff; /* Make Port B output */
/*
* Set up Port B for no handshaking:
* CRB = X X 0 0 0 1 0 0
* | | | | | | | |
* | | | | | | | no interrupt generated
* | | | | | | |
* | | | | | | IRQB1 set on falling edge of CB1,
* | | | | | |
* | | | | | Select Port B Data
* | | | | |
* | | CB2 is input, no interrupts
* | |
* Read-only flag bits
*/
PIA_CRB = 0x04;
/* Set up interrupt vector */
IRQ_JMP = JMP_OP_CODE;
IRQ_VEQ = irq_isr;
/* Clear IRQA1 flag by reading A */
PIA_A;
enable();
while (TRUE)
{
}
}
#pragma interrupt_handler irq_isr;
void irq_isr(void)
{
PIA_B = PIA_A; /* Put data on PIA_B output; clear interrupt flag */
}