Moin Achim, ich konnte Dir nur auf Deine ursprüngliche Frage antworten..
Du müsstest Dir schon selber mal die Sourcen der nibolib anschauen.
Z.B. steht in der spi.c
void spi_init(void) {
deactivate_output_bit(IO_ISP_SS);
clear_output_bit(IO_ISP_SS);
activate_output_bit(IO_ISP_MISO);
set_output_bit(IO_ISP_MISO);
spi_restart_transmission(0);
}
dann die iodefs.h
/* helper macro */
#define _PPCAT(a,b) a##b
/* Macro-functions for IO-bits */
#define set_output_bit(NAME) _PPCAT(NAME,_PORT)|=_BV(_PPCAT(NAME,_BIT))
#define clear_output_bit(NAME) _PPCAT(NAME,_PORT)&=~(unsigned char)_BV(_PPCAT(NAME,_BIT))
#define set_output_bitval(NAME, VAL) _PPCAT(NAME,_PORT)=(_PPCAT(NAME,_PORT)&~(unsigned char)_BV(_PPCAT(NAME,_BIT)))|((VAL)?_BV(_PPCAT(NAME,_BIT)):0)
#define activate_output_bit(NAME) _PPCAT(NAME,_DDR)|=_BV(_PPCAT(NAME,_BIT))
#define deactivate_output_bit(NAME) _PPCAT(NAME,_DDR)&=~(unsigned char)_BV(_PPCAT(NAME,_BIT))
#define get_input_bit(NAME) (_PPCAT(NAME,_PIN)&_BV(_PPCAT(NAME,_BIT)))
#define get_output_bit(NAME) (_PPCAT(NAME,_PORT)&_BV(_PPCAT(NAME,_BIT)))
und die iodefs_nibo2.h
/*! Display reset and SS */
#define IO_DISPLAY_RST IO_DISPLAY_RST
#define IO_DISPLAY_RST_PIN PINB
#define IO_DISPLAY_RST_PORT PORTB
#define IO_DISPLAY_RST_BIT 0
#define IO_DISPLAY_RST_DDR DDRB
/*! ISP MISO */
#define IO_ISP_MISO_PORT PORTB
#define IO_ISP_MISO_PIN PINB
#define IO_ISP_MISO_BIT 3
#define IO_ISP_MISO_DDR DDRB
/*! ISP SS shared with display reset */
#define IO_ISP_SS IO_DISPLAY_RST
und jetzt kannste nachvollziehen (und kommentieren) was passiert
void spi_init(void) {
// Ansprache über Makro // Ansprache normal
deactivate_output_bit(IO_ISP_SS); // -> DDRB &=~(unsigned char)(1<<0); // DDRB0 auf 0 setzen Eingang
clear_output_bit(IO_ISP_SS); // -> PORTB &=~(unsigned char)(1<<0); // Da jetzt Eingang - Pullup aus
activate_output_bit(IO_ISP_MISO); // -> DDRB |= (1<<3) // DDRB3 als Ausgang
set_output_bit(IO_ISP_MISO); // -> PORTB |= (1<<3) // PORTB3 auf High
spi_restart_transmission(0);
}