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.
Du initialisierst PORTB aber nutzt PORTC. Weiter habe ich mal noch nicht geschaut.
Wenn Du den internen PullUp von PB0 benutzt, muss der Taster gegen GND schalten!
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.
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.
1 | if(!(pin_lesen(PORTB,PB0))) |
2 | {
|
3 | _delay_ms(50); |
4 | if(!(pin_lesen(PORTB,PB0))) |
PORTB ist auch falsch: PINB.
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.
| ist bitweises Oder.
> Ich glaube da müssten || hin.
Das hat er schon richtig gemacht.
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?
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... :))
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.