1 // Martin Thomas 4/2008
\r
5 #include <util/delay.h>
\r
6 #include "port_ext.h"
\r
8 // #include "mystdio.h"
\r
10 static uint8_t virtports[PORT_EXT_OUTPORTS] = {
\r
16 static inline void strobe_delay(void)
\r
19 // delay ca. 100ns @ 2V for 74x595, 1us for tests
\r
22 // 1 cycle ca 130ns at 7,3MHz
\r
23 asm volatile("nop"::);
\r
27 static inline void output_disable(void)
\r
29 PORT_EXT_PORT |= ( 1 << PORT_EXT_PIN_OE );
\r
32 static inline void output_enable(void)
\r
34 PORT_EXT_PORT &= ~( 1 << PORT_EXT_PIN_OE );
\r
37 static inline void pulse_latch(void)
\r
39 PORT_EXT_PORT |= ( 1 << PORT_EXT_PIN_LATCH );
\r
41 PORT_EXT_PORT &= ~( 1 << PORT_EXT_PIN_LATCH );
\r
45 static inline void pulse_clock(void)
\r
47 PORT_EXT_PORT |= ( 1 << PORT_EXT_PIN_CLK );
\r
49 PORT_EXT_PORT &= ~( 1 << PORT_EXT_PIN_CLK );
\r
53 static void shift_out(void)
\r
57 // first bit shifted out is bit7 in virtports[PORT_EXT_OUTPORTS-1]
\r
58 // - on BC100 this is for U205 Q7
\r
59 // last bit shifted out is bit 0 in virtports[0]
\r
60 // - on BC100 this is for U202 Q0
\r
61 for ( i = PORT_EXT_OUTPORTS; i > 0; i-- ) {
\r
62 // myprintf_P("Port %d = %d\n", i-1, virtports[i-1] );
\r
63 for ( bit = 8; bit > 0; bit-- ) {
\r
64 if ( virtports[i-1] & ( 1 << (bit-1) ) ) {
\r
65 PORT_EXT_PORT |= ( 1 << PORT_EXT_PIN_DIN );
\r
68 PORT_EXT_PORT &= ~( 1 << PORT_EXT_PIN_DIN );
\r
76 void port_ext_init(void)
\r
78 PORT_EXT_PORT &= ~(
\r
79 ( 1 << PORT_EXT_PIN_CLK ) |
\r
80 ( 1 << PORT_EXT_PIN_DIN) |
\r
81 ( 1 << PORT_EXT_PIN_LATCH ) );
\r
82 PORT_EXT_PORT |= ( 1 << PORT_EXT_PIN_OE );
\r
84 ( 1 << PORT_EXT_PIN_OE) |
\r
85 ( 1 << PORT_EXT_PIN_CLK ) |
\r
86 ( 1 << PORT_EXT_PIN_DIN) |
\r
87 ( 1 << PORT_EXT_PIN_LATCH ) );
\r
88 // set inititial values before enabling outputs
\r
89 // - on BC100 this is just for U202 since it's
\r
90 // the only 74x595 with switchable /OE
\r
93 // since Q7' is low while output is disabled (low)
\r
94 // (Philips 74HC(T)595 datasheet) another shift-
\r
95 // out has to be done to set the cascaded outputs
\r
96 // - on BC100 this will set U201, U202 and U205 outputs
\r
100 void port_ext_update(void)
\r
105 void port_ext_bit_clear( uint8_t port, uint8_t bit )
\r
107 if ( ( port < PORT_EXT_OUTPORTS ) && ( bit < 8 ) ) {
\r
108 virtports[port] &= ~( 1 << bit );
\r
112 void port_ext_bit_set( uint8_t port, uint8_t bit )
\r
114 if ( ( port < PORT_EXT_OUTPORTS ) && ( bit < 8 ) ) {
\r
115 virtports[port] |= ( 1 << bit );
\r
119 void port_ext_set( uint8_t port, uint8_t val )
\r
121 if ( port < PORT_EXT_OUTPORTS ) {
\r
122 virtports[port] = val;
\r