#include <PiaVia.h>
Inherits PiaVia.
Inherited by RB8506_Via.
A VIA has the following registers:
Registers Offset Rd/Wr Description ------------------------------------------------------------------------------ PDRB 0 rd/wr Port B Peripheral Data Register PDRA 1 rd/wr Port A Peripheral Data Register DDRB 2 rd/wr Port B Data Direction Register DDRA 3 rd/wr Port A Data Direction Register T1CL 4 rd/wr Timer 1 counter LSB T1CH 5 rd/wr Timer 1 counter MSB T1LL 6 rd/wr Timer 1 latch LSB T1LH 7 rd/wr Timer 1 latch MSB T2L 8 rd/wr Timer 2 LSB, write latch, read counter T2H 9 rd/wr Timer 2 MSB, write latch, read counter SR 10 rd/wr Shift Register ACR 11 rd/wr Auxiliary Control Register PCR 12 rd/wr Peripheral Control Register IFR 13 rd/wr Interrupt Flag Register IER 14 rd/wr Interrupt Enable Register PDRA 15 rd/wr Port A Peripheral Data Register, no handshake
Each of the peripheral data lines (PA0..PA7, PB0..PB7) can be programmed to act as input or output. This is accomplished by setting a "1" in the corresponding Data Direction Register bit for those lines which are to be outputs. A "0" in a bit of the Data Direction Register causes the corresponding peripheral data line to act as an input.
Peripheral Data Register:
76543210 : data bits 0..7, 0 for low, 1 for high output.
Data Direction Register:
76543210 : data direction bits, 0 for input, 1 for output.
Peripheral Control Register (PCR):
76543210 765 : CB2 control; see CA2 control (bits 321) 4 : CB2 interrupt control; see CA2 interrupt control (bit 0) 321 : CA2 control 321 : CA2 input 3 : 0 : CA2 input 2 : CA2 active transition for setting IRQA2 flag 0 : IRQA2 set by high-to-low transition on CA2 1 : IRQA2 set by low-to-high transition on CA2 1 : independent interrupt 0 : CA1 dependent interrupt 1 : independent interrupt; see *), IFR 321 : CA2 output 3 : 1 : CA2 output 21 : CA2 output control 0x: strobed CA2 output 1x: programmed CA2 output with level of bit 3 00: CA2 Handshake output 01: CA2 Pulse output 10: CA2 low 11: CA2 high 0: CA1 active transition for setting IRQA1 0 : IRQA1 set by high-to-low transition on CA1 1 : IRQA1 set by low-to-high transition on CA1
Auxiliary Control Register (ACR):
76543210 : timer control (not used)
Interrupt Flag Register (IFR):
76543210 : what set cleared 7 : CA2 CA2 active edge read or write PDRA *) 6 : CA1 CA1 active edge read or write PDRA *) 5 : SR complete 8 shifts read or write SR 4 : CB2 CB2 active edge read or write PDRB *) 3 : CB1 CB1 active edge read or write PDRB 2 : T2 time out of T2 read T2L or write T2H 1 : T1 time out of T1 read T1L or write T1H 0 : IRQ any enabled interrupt clear all interrupts *): if the CA2/CB2 control in the PCR is selected as "independent" interrupt input, then reading or writing the output register PDRA/PDRB will NOT clear the flag bit. Instead, the bit must be cleared by writing a one into the appropriate bit of the IFR.
Interrupt Enable Register (IER):
76543210 7 : set/clear (reads as "1") 0 : disable interrupts corresponding to bits set 1 : enable interrupts corresponding to bits set 6 : T1 5 : T2 4 : CB1 3 : CB2 2 : SR 1 : CA1 0 : CA2
Public Member Functions | |
Construction | |
Via (NameCref aName, Addr aAddr=DEF_ADDR, Rack aRack=DEF_RACK) | |
constructor; may throw RulbusOpenError | |
virtual | ~Via () |
destructor (no-op) | |
Accessors -- port A | |
int | getIrqCA1 () |
CA1 input: interrupt request pending. | |
char | getEdgeCA1 () |
CA1 input: get active edge ['p','n']. | |
int | getIntrCA1 () |
CA1 input: get interrupt enable state. | |
char | getDirCA2 () |
CA2 i/o: get data direction ['i','o']. | |
int | getLevelCA2 () |
CA2 i/o: get level [0,1]. | |
Accessors -- port B | |
int | getIrqCB1 () |
CB1 input: interrupt request pending. | |
char | getEdgeCB1 () |
CB1 input: get active edge ['p','n']. | |
int | getIntrCB1 () |
CB1 input: get interrupt enable state. | |
char | getDirCB2 () |
CB2 i/o: get data direction ['i','o']. | |
int | getLevelCB2 () |
CB2 i/o: get level [0,1]. | |
Mutators -- port A | |
void | setEdgeCA1 (char edge) |
CA1 input: set active edge ['p','n']; may throw RulbusRangeError. | |
int | setIntrCA1 (int enable) |
CA1 input: enable/disable interrupt. | |
void | setDirCA2 (char dir) |
CA2 i/o: set data direction ['i','o']; may throw RulbusRangeError. | |
void | setLevelCA2 (int lvl) |
CA2 i/o: set level [0,!0]; may throw RulbusContextError. | |
Mutators -- port B | |
void | setEdgeCB1 (char edge) |
CB1 input: set active edge ['p','n']; may throw RulbusRangeError. | |
int | setIntrCB1 (int enable) |
CB1 input: enable/disable interrupt. | |
void | setDirCB2 (char dir) |
CB2 i/o: set data direction ['i','o']; may throw RulbusRangeError. | |
void | setLevelCB2 (int lvl) |
CB2 i/o: set level [0,!0]; may throw RulbusContextError. | |
Static Public Attributes | |
Defaults | |
const int | DEF_ADDR = 0x90 |
default rulbus address | |
const int | DEF_RACK = 0 |
default rack | |
Protected Member Functions | |
Accessors -- port A, B | |
int | getDDRA () |
Port A: get data direction register. | |
int | getPDRA () |
Port A: get peripheral data register. | |
int | getDDRB () |
Port B: get data direction register. | |
int | getPDRB () |
Port B: get peripheral data register. | |
Mutators -- port A, B | |
void | setDDRA (int dir) |
Port A: set data direction register. | |
void | setPDRA (int dat) |
Port A: set peripheral data register. | |
void | setDDRB (int dir) |
Port B: set data direction register. | |
void | setPDRB (int dat) |
Port B: set peripheral data register. | |
Private Member Functions | |
Mutators -- port A, B | |
int | getIrqC1 (int mask) |
C[AB]1: test for interrupt request pending. | |
char | getEdgeC1 (int shift) |
C[AB]1: get active edge ['p','n']. | |
void | setEdgeC1 (int shift, char edge, char port) |
C[AB]1: set active edge ['p','n']; may throw RulbusRangeError. | |
int | getIntrC1 (int mask) |
C[AB]1: get interrupt enable state. | |
int | setIntrC1 (int mask, int enable) |
C[AB]1: enable/disable interrupt. | |
Mutators -- port A, B | |
char | getDirC2 (int shift) |
C[AB]2: get data direction. | |
void | setDirC2 (int shift, char dir, char port) |
C[AB]2: set data direction; may throw RulbusRangeError. | |
int | getLevelC2 (int shift, char port) |
C[AB]2: get line level. | |
void | setLevelC2 (int shift, int lvl, char port) |
C[AB]2: set line level; may throw RulbusContextError. | |
Static Private Attributes | |
Register offsets | |
const int | OFF_PDRB = 0 |
peripheral data register B | |
const int | OFF_PDRA = 1 |
peripheral data register A | |
const int | OFF_DDRB = 2 |
data direction register B | |
const int | OFF_DDRA = 3 |
data direction register A | |
const int | OFF_T1CL = 4 |
timer 1 counter low order byte | |
const int | OFF_T1CH = 5 |
timer 1 counter high order byte | |
const int | OFF_T1LL = 6 |
timer 1 latch low order byte | |
const int | OFF_T1LH = 7 |
timer 1 latch high order byte | |
const int | OFF_T2CL = 8 |
timer 1 latch high order byte | |
const int | OFF_T2CH = 9 |
timer 1 counter low order byte | |
const int | OFF_SR = 10 |
shift register | |
const int | OFF_ACR = 11 |
auxiliary control register | |
const int | OFF_PCR = 12 |
peripheral control register | |
const int | OFF_IFR = 13 |
interrupt flag register | |
const int | OFF_IER = 14 |
interrupt enable register | |
const int | OFF_PDRA_NH = 15 |
peripheral data register A, no handshake | |
const int | ADR_WIDTH = OFF_PDRA_NH + 1 |
address with | |
Shift control bits left for CA/CB | |
const int | SHL_CA = 0 |
zero bit shift left for CA | |
const int | SHL_CB = 4 |
four bit shift left for CB | |
Bit masks for CA1/CB1 | |
const int | MSK_ATC1 = 0x01 |
active transition CA1/CB1 (0:neg, 1:pos) | |
Bit masks for CA2/CB2: NOTE: Read/Write strobe not supported | |
const int | MSK_DIRC2 = 0x08 |
C2 i/o direction. | |
const int | MSK_POC2 = 0x04 |
C2 programmed output. | |
const int | MSK_OLC2 = 0x02 |
C2 output level. | |
IFR -- interrupt flag register | |
const int | MSK_IFCA2 = 0x01 |
CA2. | |
const int | MSK_IFCA1 = 0x02 |
CA1. | |
const int | MSK_IFSR = 0x04 |
Shift Register. | |
const int | MSK_IFCB2 = 0x08 |
CB2. | |
const int | MSK_IFCB1 = 0x10 |
CB1. | |
const int | MSK_IFCT2 = 0x20 |
Timer 2. | |
const int | MSK_IFCT1 = 0x40 |
Timer 1. | |
const int | MSK_IFIRQ = 0x80 |
any interrupt request | |
IER -- interrupt enable register | |
const int | MSK_IECA2 = 0x01 |
CA2. | |
const int | MSK_IECA1 = 0x02 |
CA1. | |
const int | MSK_IESR = 0x04 |
Shift Register. | |
const int | MSK_IECB2 = 0x08 |
CB2. | |
const int | MSK_IECB1 = 0x10 |
CB1. | |
const int | MSK_IECT2 = 0x20 |
Timer 2. | |
const int | MSK_IECT1 = 0x40 |
Timer 1. | |
const int | MSK_IESC = 0x80 |
Set/Clear. |