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.
Sparrow/ATtiny13a Porterweiterung mit 74HC595
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: