74HC595 Kaskade mit ATmega8...

Jawaiica

Neues Mitglied
06. Nov. 2011
75
0
0
31
Hannover
Sprachen
Hallo Leute,
ich bin grade dabei ein wenig mit Schieberegistern zu spielen. Nach erfolgreichen Tests mit einem Schieberegister wollte ich mich mal an eine Kaskade von 74HC595ern ranwagen. Ich habe also alles nach diesem Schaltplan aufgebaut und nach dem Text muss man die Schieberegister ansteuern, als wäre dort ein 16 Bit Schieberegister. Hinter den Schieberegistern ist jeweils eine 7-Segmentanzeige. Jetzt dachte ich ich könnte meinen bisherigen Code um eine for-Schleife erweitern, damit ich auf beiden 7-Segmentanzeigen erst einmal die gleiche Zahl bekomme, aber die zweite 7-Segmentanzeige zeigt erst einmal gar nichts an, die erste funktioniert ohne Probleme! Hier ist erst einmal mein Code, vllt. habe ich auch nur einen Denkfehler drin oO

Code:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/delay.h>

#define SIN PB0
#define SCK PB1
#define SCL PB2
#define RCK PB3

const uint8_t iNumbers[] PROGMEM = {0b01111110, 0b00001100, 0b10110110, 0b10011110, 0b11001100, 0b11011010, 0b11111010, 0b00001110, 0b11111110, 0b11011110,};

void Init595() {
	DDRB	 = 0x0F;		
	PORTB	|= (1<<SCL);	
}

void WriteNumber(uint8_t Number, uint8_t Displays) {
	uint8_t Value	= pgm_read_byte(&iNumbers[Number]);			
	
	for(uint8_t Displaycounter = 0; Displaycounter < Displays; Displaycounter++) {
		for(uint8_t Bitcounter = 8; Bitcounter > 0; Bitcounter--) {
			uint8_t newValue = Value & (1<<Bitcounter);				
		
			if(newValue != 0) {										
				PORTB |=  (1<<SIN);									
			} else {												
				PORTB &= ~(1<<SIN);									
			}
			PORTB |=  (1<<SCK);										
			PORTB &= ~(1<<SCK);										
		}
	}
	
	PORTB |=  (1<<RCK);
	PORTB &= ~(1<<RCK);
}

int main(void) {
	
	Init595();
	WriteNumber(5,2);
	
    while(1) {
		
    }
	
	return 0;
}

Der Code sollte also einfach nur die gleiche Zahl auf beiden 7-Segmentanzeigen darstellen und das durch eine Kaskade von zwei 74HC595ern. Vielleicht könnt ihr mir ja helfen.

MfG Jawaiica
 
Hallo,

da ich kein C einsetze hab ich mir das nun nicht angesehen. Nach dem Schaltplan hast du beide Schieberegister hintereinander geschaltet. Du mußt also 16Bit reinschieben. Wobei die ersten 8Bit davon im zweiten (also letzten) schieberegister in der Kette landen. Erst danach darfst du mit dem RegisterClk die Daten in das 8Bit-ParallelLatch übernehmen.

Gruß
Dino
 
Danke für die schnelle Antwort^^ Naja gut dann versuch ich mal aufzulisten was ich da eig. mache in der Funktion vllt. hilft das weiter.

Erst hole ich die Zahl aus meinem "Zahlenfeld" um zu wissen was ich in das Schieberegister schieben muss. Da ich nicht wusste wie ich das C-Flag in C bekomme habe hohle ich mir die Information ob eine 0 oder 1 in das Schieberegister geschoben werden muss durch logisch UND (neuerWert = Wert & (1<<Counter)). Anschließend muss ich nur prüfen ob der neue Wert != 0 ist und falls er das ist, setze ich den SER Pin auf 1 und "speichere" den Wert durch HIGH und LOW setzen von SCK. Das mache ich halt 8 mal, wobei ich mit dem höchstwertigem Bit anfange. Wenn alle überprüft und ins Schieberegister geschoben wurden, gebe ich die Zahl aus durch HIGH und LOW setzen von RCK.

So dies hat ja wunderbar für ein Schieberegister und eine 7-Segmentanzeige funktioniert. Nun zu meiner Idee für zwei Schieberegister:

Da diese erste Funktion so gut geklappt hat, habe ich eine for-Schleife um den ganzen Part (ausgenommen von dem HIGH/LOW setzen von RCK um alles letztlich auszugeben) gemacht um das ganze noch einmal zu wiederholen. Letztlich soll der also zwei mal den Wert den ich angebe in das Schieberegister schieben und anschließend durch HIGH/LOW setzen von RCK alles ausgeben. Also letztlich ist der Ablauf genauso wie du es gesagt hast dino03, 8Bit schieben und dann noch einmal 8bit schieben (zweimal die gleiche Zahl halt).

Ich werde gleich mal das 2. Schieberegister austauschen, da es ein wenig komisch ist wenn die ersten 8Bit in das 2. Schieberegister geschoben werden, dass dann nur die 1. 7-Segmentanzeige am 1. Schieberegister arbeitet. Angenommen ich würde nur 8Bit in die Kaskade schieben, dann würde ich ja nur das 2. Schieberegister(da wo SER zu QH* geht) bedienen oder? Also das 1. Schieberegister(Also da wo SER zum IC geht) würde nichts anzeigen?

MfG Jawaiica

Edit: Naja wie erwartet lag es dann doch am Kaputten Schieberegister :D Trotzdem danke^^
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)