Gast
#5116231
Hallo Zusammen, seit längerem versuche ich nun schon das Schieberegister SN54HC595 mit einem atmega88 anzusteuern. Die zugehörigen Datenblätter findet Ihr im Anhang. Problem: Auch wenn der Taster betätigt wird, brennt die LED nicht. Details: Schaltplan s. Anhang Beschreibung: Ein atmega88 steuert über 5 Pins ein Schieberegister an dessen Ausgängen Vorwiderstände und LEDs angeschlossen sind. Programm: //Vordefinitionen: #include <avr/io.h> #include <avr/delay.h> #define F_CPU = 1000000 #define pin_ein(PORTx,pin) ((PORTx) |= (1<<pin)) #define pin_aus(PORTx,pin) ((PORTx) &= ~(1<<pin)) #define pin_toggeln(PORTx,pin) ((PORTx) ^= (1<<pin)) #define pin_lesen(PINx,pin) ((PINx) & (1<<pin)) int main(void) { //Defintion der Ausgänge: DDRC |= (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4) | (1<<PC5); /*Definierte Ausgänge: PC1 = Reset /SRCLR PC2 = Schiebetakt SRCLK PC3 = Speichertakt RCLK PC4 = Ausgangssteuerung /OE PC5 = Serieller Eingang SER Anmerkung zur Ansteuerung: - /OE bleibt Null - SER bleibt EINS - RESET bleibt EINS */ //Definition der Eingänge: DDRB &= ~(1<<PB0); //Pull-ups aktivieren: PORTB |= (1<<PB0); /*Definierte Eingänge: PB0 = Taster T */ //Parameterliste: unsigned int zaehler_taster =0; pin_aus(PORTC,PC4);// Ausgangssteuerung bleibt aktiv. pin_ein(PORTC,PC5);// Seriellen Eingang = 1. pin_ein(PORTC,PC1);// SChiftregister nicht reseten. while (1) { /* Ziel1: LED soll entsprechend der Tasterbetätigung brennen.. Vorgehen: 1. Abfrage ob Taster betätigt. Wenn Tasterbetätigt weiter mit 2. 2. Schiebtakt einschalten, d.h. PC2 pin ein. 3. Speichertakt einschalten, d.h. PC3 pin ein */ if(!(pin_lesen(PORTB,PB0))) { _delay_ms(50); if(!(pin_lesen(PORTB,PB0))) { zaehler_taster++; if(zaehler_taster==1) { pin_ein(PORTC,PC2);//um 1 bit schieben. pin_aus(PORTC,PC2);//schieben beenden. pin_ein(PORTC,PC3);//speichern beginnen. pin_aus(PORTC,PC3);//speichern beenden. } } } else { pin_aus(PORTC,PC2); pin_aus(PORTC,PC3); } } } Die Spannungen an den Pins am atmega88 entsprechen dem Programm , z.B. /OE = ca. 0V, SER = ca. 3 V. Die Fuse-Bytes im atmega88 haben folgende Status: Low Fuse: 01100010 High Fuse: 11011111 Bisherige Schritte: -Polung aller Bauteile überprüft. -> i.O. -Überprüfung auf Kurzschlüsse. -> i.O. -Software überarbeitet -> bisher ohne Erfolg/Ergebnis Vielen Dank im Voraus für eure Hilfe.

