Forum: Mikrocontroller und Digitale Elektronik 5x7 DOT Matrix TC07 mit 74HC595 PROBLEM !!!


von Schmolli (Gast)


Angehängte Dateien:

Lesenswert?

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.

von tastendrücker (Gast)


Lesenswert?

Muss diese Zeile

  for(i=7;i<=0;i--)

nicht

  for(i=7;i>0;i--)

heissen?

von Schmolli (Gast)


Angehängte Dateien:

Lesenswert?

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

von tastendrücker (Gast)


Lesenswert?

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 ;-)

von Schmolli (Gast)


Lesenswert?

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

von Schmolli (Gast)


Lesenswert?

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++);
        {
        }
     }
}

von Axel R. (Gast)


Lesenswert?

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?

von Schmolli (Gast)


Lesenswert?

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

von Schmolli (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.