Schieberegister SN54HC595 mit Atmel atmega 88 ansteuern

Gast #5116231
Lesenswert?

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.
Gast #5116442
Lesenswert?

Du benutzt einen Pull-Up und der Taster legt VCC auf den Pin. Der Pin 
liegt also immer auf High Pegel.

Kontrolliere erst mal, ob dein Programm auf dem AVR überhaupt si durch 
läuft, wie gedacht. Das macht amn am einfachsten mit einem Debugger. Wer 
keinen Debugger hat, sendet Statusmeldungen über den seriellen Port an 
ein Terminal Programm. Wer das auch nicht hat, schließt LED's an, die 
das Erreichen bestimmter Programmpunkte anzeigen.
Gast #5116876
Lesenswert?

Viktor B. schrieb:
> Verdammt, ich verwechsle das immer wieder.

Ja, C ist schon eine super Sprache...
2 Minuten, um den Algorithmus des Programmes zu finden, 5 Minuten, um 
den Quelltext einzugeben und dann 2 Tage, um die syntaktischen Fehler in 
dem Kauderwelsch zu finden.

Einfach und effektiv...
:))

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren