Porterweiterung mit 74HC595
von Max5V
Erweitert den Sparrow/ATtiny13a pro Ic um jeweils 8 Ausgänge.
Jeder weitere IC wird wie IC2 im Schaltplan angeschlossen,
wobei jeder QH* (Pin9) des vorherigen IC's an den nächsten
SER (Pin14) angeschlossen wird.
Für das Codebeispiel wurden LED's mit jeweils 2mA gegen GND geschaltet.
Code:
Die Anzahl der verwendeten IC's ist in der _74HC595.h unter #define anzahl_74HC595 n anzupassen.
Ebenso muß die Pinbelegung (SCK, RCK, SIN) angepasst werden. Wenn PB0 des Sparrow's verwendet werden soll,
muss an diesem RCK anliegen da die Programmierung sonst nicht funktioniert.
/* * Sparrow_Schieberegister_74HC595.c Für diesen Code wurden zwei kaskadierte 74HC595 verwendet. Die Pinbelegung am Mµ ist frei wählbar, einzustellen in _74HC595.h. Die Anzahl der Schieberegister ( #define anzahl_Schieberegister x) werden ebenfalls in der _74HC595.h eingestellt. Pinbelegung Sparrow : Pin 11 SCK > PB3 2 Pin 12 RCK > PB4 3 Pin 14 SER > PB1 6 Kaskade // Pin 9 QH > Pin 14 SER An den Ausgängen wurden zum Testen LED's (2mA) angeschlossen. ( maximal 70mA pro Schieberegister! ) Lektüre zum Thema Schieberegister : http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister */ #ifndef F_CPU #define F_CPU 1200000UL #endif #include <avr/io.h> #include <util/delay.h> #include "_74HC595.h" int main(void) { init_74HC595(); int test = 3; _delay_ms(1000); while(1) { // Taster 1 und Taster 2 // Lauflicht bis Taster 1 und Taster 2 erneut betätigt wird if ( (!( PINB & (1 << PB0))) && (!( PINB & (1 << PB2))) ) { do { //Lauflicht zwei Schieberegister for ( int regeins = 0; regeins < 8; regeins++) { shift_Data_74HC595(HC595_Data[1]); shift_Data_74HC595(HC595_Data[0] = (1 << regeins)); assume_Data_74HC595(); _delay_ms(100); if (regeins == 7) { HC595_Data[0] = 0x00; for ( int regzwei = 0; regzwei < 8; regzwei++) { shift_Data_74HC595(HC595_Data[1] = (1 << regzwei)); shift_Data_74HC595(HC595_Data[0]); assume_Data_74HC595(); _delay_ms(100); } HC595_Data[1] = 0x00; } } } while ( ( PINB & (1 << PB0)) && ( PINB & (1 << PB2)) ); } //Taster 1 //SchiebeRegister 0 Pin von 0 -7 setzen //SchiebeRegister 1 Pinausgabe Binär if ( !( PINB & (1 << PB0) ) ) { set_Pin_74HC595(0,test); // einzelnen Pin setzen set_Pins_74HC595(1,test+1); // mehrere Pins setzen _delay_ms(500); test++; } //Taster 2 //SchiebeRegister 0 Pin von 0 -7 löschen //SchiebeRegister 1 Pinausgabe Binär if ( !( PINB & (1 << PB2) ) ) { test--; clear_Pin_74HC595(0,test); // einzelnen Pin setzen clear_Pins_74HC595(1,test); // mehrere Pins setzen _delay_ms(500); } } }
Links und Referenzen: