Forum: Mikrocontroller und Digitale Elektronik Atmega16 + 75HC595 Problem


von Philipp L. (philipp_l89)


Lesenswert?

Servus zusammen,

ich versuche momentan mit einem Atmega 16 (16MHz ext. Quarz, 5.3V auf 
STK500) an 3 Pins einen 75HC505 zum laufen zu bringen. (Vorher mit 
Atmega32 und Atmega85xx verzweifelt probiert). Output ist PORT C, wenn 
ich mit dem Oszi messe sehe ich auch die Clock (PC1), den Serial Data 
Input (PC2) und das Latchsignal (PC3). Timer/Counter 0 Register 
Einstellungen passen exakt mit den Zeiten auf dem Oszi zusammen (Clock 
für den 75HC595 läuft auf ca. 2KHz, habs auch schon mit mehr und weniger 
probiert). Master Reset vom 75HC595 liegt auf HIGH , Enable Output auf 
LOW. Das Problem: an keinem der Ausgänge vom 75HC595 kommt was an. Meine 
erste Vermutung war dass die I/O Pins vom Atmega nicht genug Strom 
liefern also hab ich damit einen Transistor (BD-131) geschaltet der dann 
jeweils die 5V Vcc durchgeschaltet hat. Mit dem Oszi gemessen was am 
Transistor rauskommt, war wunderbar, 75HC595 hat jedoch immernoch nicht 
durgeschaltet. Das Merkwürdige ist, wenn ich das Kabel vom Serial Input 
abziehe bekomme ich Zufallswerte an den Ausgängen, wenn ich es auf HIGH 
lege durchgehend HIGH und auf LOW durchgehend LOW.

Hat einer von euch eine Idee was da los sein könnte? Den 75HC595 hab ich 
schon ausgetauscht und den ganzen Spaß diverse Male auf dem Breadboard 
neu zusammen gesteckt. Ich scheine irgendwo einen kapitalen Denkfehler 
zu haben nur wo, nur wo?

EDIT: Ende erster Absatz bearbeitet...

von Wolfgang (Gast)


Lesenswert?

Ich kann mir das überhaupt nicht vorstellen, dass es nicht funktionieren 
soll ???!!!..
- Du machst gewiss einen ganz einfachen Fehler ---
-- Schlaf mal darüber,- Schau dir das Datenblat der HC595 nochmal genau 
an, Das Timing des ATmege sollte dem HC-Baustein "nicht in die Nähe 
kommen"
- Prüf dein Programm...
- Meine langjährige Erfahrung:-- immer den Fehler bei sich selber suchen 
-
- ich bin dabei immerhin 74 Jahre alt geworden !!!

W.

von Falk B. (falk)


Lesenswert?

@  Philipp L. (philipp_l89)

>ich versuche momentan mit einem Atmega 16 (16MHz ext. Quarz, 5.3V auf
>STK500) an 3 Pins einen 75HC505 zum laufen zu bringen.

Soll das 74HC595 heißen? Wenn du so arbeitest wie du schreibst, wird es 
eher schwierig.

>ich mit dem Oszi messe sehe ich auch die Clock (PC1), den Serial Data
>Input (PC2) und das Latchsignal (PC3).

Gut.

> Timer/Counter 0 Register
>Einstellungen passen exakt mit den Zeiten auf dem Oszi zusammen (Clock
>für den 75HC595 läuft auf ca. 2KHz,

Was hat der Timer damit zu tun? Entweder nutz man das SPI-Modul oder 
macht Soft-SPI. Und 2 kHz sind da eher sehr niedrig.

>LOW. Das Problem: an keinem der Ausgänge vom 75HC595 kommt was an.

Hmm.

> Meine
>erste Vermutung war dass die I/O Pins vom Atmega nicht genug Strom
>liefern

Nö. Das reicht locker.

>also hab ich damit einen Transistor (BD-131) geschaltet der dann
>jeweils die 5V Vcc durchgeschaltet hat. Mit dem Oszi gemessen was am
>Transistor rauskommt, war wunderbar, 75HC595 hat jedoch immernoch nicht
>durgeschaltet. Das Merkwürdige ist, wenn ich das Kabel vom Serial Input
>abziehe bekomme ich Zufallswerte an den Ausgängen, wenn ich es auf HIGH
>lege durchgehend HIGH und auf LOW durchgehend LOW.

Schon mal was.

>Hat einer von euch eine Idee was da los sein könnte? Den 75HC595 hab ich
>schon ausgetauscht und den ganzen Spaß diverse Male auf dem Breadboard
>neu zusammen gesteckt. Ich scheine irgendwo einen kapitalen Denkfehler
>zu haben nur wo, nur wo?

Einfach mal alles ganz solide aufbauen und messen. Die drei Signal e 
sollte man in den Griff kriegen. Denk dran, das Latch am Ende der 
Übertragung eine LOW->High Flanke ausführen muss.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister


EDIT: Ende erster Absatz bearbeitet...

von helfersyndrom (Gast)


Lesenswert?

probier mal den code von tuxgraphics
1
#ifdef USE_74595
2
// SER pin 14:
3
#define S74595_0 PORTC&=~(1<<PORTC5)
4
#define S74595_1 PORTC|=(1<<PORTC5)
5
// RCLK pin 12:
6
#define S74595_RCLKDOWN PORTC&=~(1<<PORTC4)
7
#define S74595_RCLKUP PORTC|=(1<<PORTC4)
8
// SRCLK pin 11:
9
#define S74595_CLOCKDOWN PORTC&=~(1<<PORTC3)
10
#define S74595_CLOCKUP PORTC|=(1<<PORTC3)
11
// Inline assembly, nop = do nothing for a clock cycle.
12
//#define nop()  asm volatile("nop\n\t" "nop\n\t"::)
13
#define nop()  asm volatile("nop\n\t"::)
14
void set74595(uint8_t val)
15
{
16
      uint8_t i=8;
17
      while(i){
18
              i--;
19
              S74595_CLOCKDOWN;
20
              if (val & (1<<i)){
21
                      S74595_1;
22
              }else{
23
                      S74595_0;
24
              }
25
              S74595_CLOCKUP;
26
              nop();
27
      }
28
      S74595_CLOCKDOWN;
29
      S74595_RCLKUP;
30
      nop();
31
      S74595_RCLKDOWN;
32
      e74595val=val;
33
}
34
void init74595(void)
35
{
36
        DDRC|= (1<<DDC4); // enable as output line
37
        S74595_RCLKDOWN;
38
        DDRC|= (1<<DDC5); // enable as output line
39
        S74595_0;
40
        DDRC|= (1<<DDC3); // enable as output line
41
        S74595_CLOCKDOWN;
42
        e74595val=0; // variable where we keep the current state
43
        set74595(0);
44
}

hier ein schaltplan dazu:
http://tuxgraphics.org/common/src2/article10081/output-connections.pdf

von Bernd T. (bastelmensch)


Lesenswert?

JTAG schon ausgeschalten? Das ist beim Atmega 16/32 auf Port C.

von Pascal G. (Firma: http://www.pgollor.de) (mc-kalle)


Lesenswert?

Moin,

schau dir mal die Verschalltung hier an.
http://www.pgollor.de/cms/?page_id=294

Die Sofware habe ich dazu einfach aus dem Forumarikel 
Porterweiterungen übernommen. Damit funktioniert es auch ohne 
ausschalten des JTAG.

Hast du ansonsten mal versucht einfach einen anderen Port oder ein paar 
andere PINS des PORTC zu verwenden?


LG
Kalle

von Philipp L. (philipp_l89)


Lesenswert?

Servus zusammen,

die Woche war ein bisschen stressig und ich kam jetzt erst dazu weiter 
zu machen. (Die Sache mit der Anzahl der Projekte und der im Vergleich 
gegen Null divergierenden Zeit)
Danke erstmal für die Tips.

@Falk Brunner (falk):
Warum sollte das schwierig werden? Ist das nicht genau die Art und Weise 
wie man den IC bedient? Clock, serieller Datenstrom und dann Latch? Ist 
ja im grundegenommen nichts anderes als ein Software SPI.

@Bernd T. (bastelmensch):
Da ich im Keller keinen JTAGGER habe ja, direkt ausgeschaltet. Wie 
gesagt, auf dem Oszi sah alles wunderbar aus.

@Pascal G. (Firma: http://www.pgollor.de) (mc-kalle):
Jipp, Ports hab ich durch, inklusice µC wechsel und ähnliches.

Und die finale Antwort auf das Problem habe ich soeben gefunden: Zu 
schneller Flankenwechsel an der Clock, Wert am serial Eingang wurde 
nicht übernommen und somit alles Null.

Danke also nochmal für die Hilfestellungen!

von Peter D. (peda)


Lesenswert?

Philipp L. schrieb:
> Und die finale Antwort auf das Problem habe ich soeben gefunden: Zu
> schneller Flankenwechsel an der Clock

Zu schnell geht mit dem AVR nicht. Jeder 74HCxx Logik-IC gähnt nur über 
das langsame Bitwackeln. Und bei 2kHz langweilt der sich tierisch.

Entweder Dein Fehler war im Code oder in der Verdrahtung, die wir ja 
nicht kennen.
Warscheinlich ist er sogar immer noch vorhanden und ein bischen Wackeln 
oder Temperaturänderung bringt ihn wieder zum Vorschein.


Peter

von Philipp L. (philipp_l89)


Lesenswert?

Peter Dannegger schrieb:
> Entweder Dein Fehler war im Code oder in der Verdrahtung, die wir ja
> nicht kennen.
> Warscheinlich ist er sogar immer noch vorhanden und ein bischen Wackeln
> oder Temperaturänderung bringt ihn wieder zum Vorschein.

Jaein, der Fehler war im Code, ein bisschen warten und dann das serielle 
Bitsignal frei geben hat es behoben, funktioniert einwandfrei der 
Datenstrom wird bereits über 3 x 74HC595 durchgeschoben. Verdrahtung ist 
nach wie vor auf dem Breadboard die gleiche =)

Wie Wolfgang schon gesagt hat:

Wolfgang schrieb:
> - Du machst gewiss einen ganz einfachen Fehler ---


:D

von Karl H. (kbuchegg)


Lesenswert?

Philipp L. schrieb:

> nach wie vor auf dem Breadboard die gleiche =)

Ah Breadboard.
Ja, das kann einiges erklären.


> der Fehler war im Code
Wie schon gesagt. Eher nicht. Der 595 ist schnell genug, dass ihn der 
Mega16 nicht überfahren kann. Selbst wenn der volle Pulle raustaktet ist 
das für den 595 immer noch langsam genug.
Wenn natürlich die Flanken nur gut genug verschliffen sind, dann wirds 
allerdings wirklich eng.

von Peter D. (peda)


Lesenswert?

Philipp L. schrieb:
> Jaein, der Fehler war im Code, ein bisschen warten und dann das serielle
> Bitsignal frei geben hat es behoben

Dann mußt Du aber wirklich in einem OUT-Befehl beide Pins gleichzeitig 
gesetzt haben. Und zusätzlich die Daten auf der falschen Flanke setzen.

Der 74HC595 übernimmt mit der 0-1 Flanke, d.h. man ändert die Daten 
demzufolge mit der 1-0 Flanke von SCK, damit sie bei 0-1 stabil 
übernommen werden können.


Peter

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.