mikrocontroller.net

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


Autor: Schmolli (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss diese Zeile

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

nicht

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

heissen?

Autor: Schmolli (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Schmolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schmolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++);
        {
        }
     }
}

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Schmolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schmolli (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.