Forum: Mikrocontroller und Digitale Elektronik Schieberegister SN54HC595 mit Atmel atmega 88 ansteuern


von Lucstl (Gast)



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.

von pitschu (Gast)


Lesenswert?

Du initialisierst PORTB aber nutzt PORTC. Weiter habe ich mal noch nicht 
geschaut.

von Gerhard (Gast)


Lesenswert?

Wenn Du den internen PullUp von PB0 benutzt, muss der Taster gegen GND 
schalten!

von Stefan F. (Gast)


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.

von Lucstl (Gast)


Lesenswert?

pitschu schrieb:
> Du initialisierst PORTB aber nutzt PORTC

Wie meinst du das?

Danke für den Tipp mit dem Taster.
Werde es mal mit den LEDs ausprobieren.

von S. Landolt (Gast)


Lesenswert?

1
  if(!(pin_lesen(PORTB,PB0)))
2
  {
3
          _delay_ms(50);
4
      if(!(pin_lesen(PORTB,PB0)))

PORTB ist auch falsch: PINB.

von Viktor B. (coldlogic)


Lesenswert?

Die nächste Zeile nach der // Definition der Ausgänge...
Hast du da normales oder (|) oder bitweise oder (||) gemeint? Ich glaube 
da müssten || hin.

von Stefan F. (Gast)


Lesenswert?

| ist bitweises Oder.

> Ich glaube da müssten || hin.
Das hat er schon richtig gemacht.

von jürgen (Gast)


Lesenswert?

Viktor B. schrieb:
> Die nächste Zeile nach der // Definition der Ausgänge...
> Hast du da normales oder (|) oder bitweise oder (||) gemeint? Ich glaube
> da müssten || hin.

Warum?

von Viktor B. (coldlogic)


Lesenswert?

Stefan U. schrieb:
> | ist bitweises Oder.

Verdammt, ich verwechsle das immer wieder.

von Schapp Schabaduwapp (Gast)


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...
:))

von H-G S. (haenschen)


Lesenswert?

Ich habe schon aufgegeben, hier gezeigte C-Programme zu lesen.

Doch wenn man häufig in C programmiert geht das sicher flüssig. Man muss 
sich halt den Syntax und die Sonderzeichen merken.

Und irgendwelche Klammern darf man nirgends vergessen :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.