Hallo, habe eine 5x7 DOT Matrix TC07 von Kingbright verwendet, nutze den PIC18F452, habe die 5 Spalten über Vorwiderstände an den Ausgängen des 74HC595 angeschlossen, die 7 Zeilen sind direkt an Port D angeschlossen, siehe include. Die drei Steuerleitungen SHCP, STCP und DS habe ich an dem Port C angeschlossen. Soweit so gut, das angehängte Programm müßte normalerweise einen DOT in Zeile 1 von rechts nach links wandern lassen, jedoch ist die Zeile 1 dauerhaft an. Habe vermutet, es handelt sich hierbei um ein Zeitproblem, habe jedoch schon den Datentyp der Zählvariable auf double umgeändert und es ändert sich rein garnichts. Zum Programmablauf 1) Ich lege die Zeile 1 mit dem zugehörigen Portpin auf 5v+ Potential 2) Ich lasse eine for Schleife von 7 an rückwärts zählen 3) Ich hole mir das letzte Element aus dem Feld per zählvariable 7 4) rufe die Fkt Schiebregister auf, Übergabe letztes Feldelement 5) Schiebe den Wert seriell in den HC595 6) Schalte den Wert auf die Ausgänge des HC595 7) Warteroutine 8) Schritt 1 usw usw Die seriell to parallel Wandlung sollte richtig sein, ich habe keine idee, woran es liegen könnte, dass die Zeile 1 dauerhaft leuchtet Ich hoffe, das jemand meinen bzw meine Fehler im Quellcode oder evtl in der Hardwarebeschreibung findet. Ich habe mich an dem Beispiel http://home.wanadoo.nl/electro1/avr/dotmatrix.htm orientiert.
Muss diese Zeile for(i=7;i<=0;i--) nicht for(i=7;i>0;i--) heissen?
habe die for Schleife umgeändert in for (i=7;i>=0;i--) danke dir, muß natürlich größer gleich Null sein..... das hat allerdings zur Folge, dass nun die Zeile 1 dauerhaft aus ist habe das abgeänderte Prog angehängt .... es scheint ein größerer Fehler zu sein
Ich habe gerade gesehen: Du zählst deine globale Variable 'i' in Deiner Main (while(1)) UND in der Unterroutine 'Schieberegister'... Das solltest Du mal überdenken ;-)
hab es abgeändert mit der Globalvariable j, hat aber leider nichts geändert ... einzelne Zeichen darzustellen ist kein Problem. Das 74HC595 funktioniert einwandfrei, sobald es ums Verschieben des Zeichens, sprich um die Änderung der Spaltenadresse geht, klappt nichts mehr. Momentaner Stand Zeile 1 dauerhaft aus. ziemliche Ratlosigkeit
man findet keinen Fehler: #define Z1 LATDbits.LATD1 #define Z2 LATDbits.LATD2 #define Z3 LATDbits.LATD3 #define Z4 LATDbits.LATD4 #define Z5 LATDbits.LATD5 #define Z6 LATDbits.LATD6 #define Z7 LATDbits.LATD7 #define PULS LATCbits.LATC0 //74HC595 PIN11 SHCP #define OUT LATCbits.LATC1 //74HC595 PIN12 STCP #define IN LATCbits.LATC2 //74HC595 PIN14 DS #include <p18F452.h> //*******Global-Variablen Deklarationen********* int i,j,k; double l,m,n; //**************************Hauptprogramm*********************** void warte(double, double); void schieberegister(unsigned char); void main (void) { //SP1 | SP2 | SP3 | SP4 | SP5 | SP6 | SP7 | SP8 | unsigned char spalten[8] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xCF, 0x7F }; //*****************************Hauptschleife******************** // Ziel des Programms soll sein, dass der Punkt in der ersten Zeile // wandert, da die Spaltenadresse geändert wird (Position des Feldes) // Momentaner Zustand --> Zeile 1 dauerhaft aus while(1) { Z1 = 1; for(j=7;j>=0;j--) { schieberegister(spalten[j]); warte(5000,5000); } } } //****Hauptprogramm ende****/ //*************Unterprogramme************** //*************Schieberegister************* void schieberegister(unsigned char position) { unsigned char maske = 0x80; for(i=0;i<=7;i++) { if( (maske & position) !=0 ) { IN=1; // Lege eine 1 am SR an PULS=1; PULS=0; } else { IN=0; // Lege eine 0 am SR an PULS=1; PULS=0; } maske=maske>>1; } OUT=1; OUT=0; // Gebe Latch aus } //*************WARTE************* void warte(double mul_1, double mul_2) { for(l=0;l<=mul_1;l++) { for(m=0;m<=mul_2;m++); { } } }
Hi, ich hab zwar nicht die Riesenahnung aber mal gelesen, dass solche Zähldelayschleifen rausoptimiert werden, wenn in ihnen nichts gemacht wird. Mit "volatile" war da auch was ;-)) Könnte es daran liegen? AxelR. Nachtrag: muss mul_1 und mul_2 unbedingt vom Wertetyp "double" sein?
was heißt rausoptimiert? double hab ich nur für testzwecke gewählt, falls integer nicht reicht wie gesagt, es geht einfach nur darum, einen punkt in der oberen zeile wandern zu lassen, deshalb die warteschleife nach einer Ausgabe irgendwo is da noch der hund begraben
Fehler behoben, jetzt wandert der DOT von rechts nach links, allerdings wird der DOT in Spalte 5 zweimal ausgeführt.... aber immerhin schon mal etwas Lösung des Problems war: Zählvariable mul_1 und mul_2 auf Datentyp int abgeändert habe den funktionstüchtigen Quelltext angehangen bis dann und danke für die Fehlerbehebungen Schmolli
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.