/* lauflicht_sr_01.c ATmega88 @ 8MHz */ #include <avr/io.h> #include <util/delay.h> void soft_serial (uint8_t data) // Funktion soft_serial { for (uint8_t i=0; i<=7; i++) { if (data & 1) // Wenn data an Stelle 0 = 1 PORTD |= (1<<PD0); // Data serial = 1 else PORTD &= ~(1<<PD0); // Data serial = 0 PORTD |= (1<<PD1); // PD1 = 1 (CLK = low) PORTD &= ~(1<<PD1); // PD1 = 0 (CLK = high) data = data >> 1; // data um 1 Stelle nach rechts schieben } } void rck (void) { PORTD &= ~(1<<PD2); // PD2 = 0 (Takt = LOW für RCK) PORTD |= (1<<PD2); // PD2 = 1 (Takt = HIGH für RCK -> Ausgabe Schieberegister) } int main(void) { DDRD = 0xFF; // Richtungsregister PORTD = Ausgang PORTD = 0x04; // PD2 (RCK) = High, 0x04 = 0000 0100 uint8_t k, shift, data = 0x01; // data = 0000 0001 while(1) { _delay_ms(100); // 100ms warten soft_serial(data); // Funktionsaufruf und Übergabe von rck(); // Funktionsaufruf rck -> Takt für RCK generieren if (data & 0x80) // Wenn 1000 000, dann nach rechts schieben { shift=1; // Setze das flag shift auf 1 für Rechtslauf k=0; // k zurücksetzen } else if (data & 0x01) // Wenn 0000 0001, dann nach links schieben { shift=0; // Setze das flag shift auf 0 für Linkslauf k=0; // k zurücksetzen } if (k <= 7 && shift == 0) // Wenn Linkslauf { data = data << 1; // nach links schieben k++; } else if (k <= 7 && shift == 1) // Wenn Rechtslauf { data = data >> 1; // nach rechts schieben k++; } } }