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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Lucstl (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


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

von Gerhard (Gast)


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

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
| ist bitweises Oder.

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

von jürgen (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Stefan U. schrieb:
> | ist bitweises Oder.

Verdammt, ich verwechsle das immer wieder.

von Schapp Schabaduwapp (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.