PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Steuerprogramm für 104x7 Pixel LED-Anzeige



Seby
12.02.2007, 11:20
Hallo zusammen , das ist mein erster Post hier.

Zu meine Problem ich hab hier Zuhaus eine LED-Anzeige liegen für die ich ein Steuerprogramm geschrieben habe.
Wenn ich Zeilen einzeln anspreche funktioniert das auch so wie es soll , nur sobald ich alle Zeilen anspreche "flackert" jede zweite Zeile.
Vieleicht sehr ihr da in meinem Programmcode ihrgend etwas was man anders machen sollte.


main.c


int main(void)
{
init_display();

printf("Programm gestartet !\n");


uint8_t text[7][56] =
{{0,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1, 1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, 1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0}
,{0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0} };


while(1)
{
uint8_t i;
for(i=0;i<7;i++)
{
anzeigen(text[i],i);
}
}

return 0;
}


led.c



/*
7 Zeilen
8 Spalten


14 Segmente:

0| x x x x x x x x
Z 1| x x x x x x x x
e 2| x x x x x x x x
i 3| x x x x x x x x
l 4| x x x x x x x x
e 5| x x x x x x x x
n 6| x x x x x x x x
-------------------
| 0 1 2 3 4 5 6 7 . . .
Spalten


PORTA

PA0 Clock
PA1 Daten

PA2 Enable Zeilen

PA3-PA5 Binär Zeile 1-7

*/
#include <io.h>
#include <stdlib.h>
#include <stdio.h>
#include <util/delay.h>


#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define TOGGLEBIT(ADDRESS, BIT) ((ADDRESS) ^= (1 << (BIT)))


#define MAX_ZEICHEN 56

#define CLOCK PA0
#define DATEN PA1
#define ENABLE PA2
#define ZEILE2_0 PA3
#define ZEILE2_1 PA4
#define ZEILE2_2 PA5


void init_display()
{
// Pin 0 bis 5 als Ausgangdefinieren
DDRA = (1<<DDA0) | (1<<DDA1) | (1<<DDA2) | (1<<DDA3) | (1<<DDA4) | (1<<DDA5);

CLEARBIT(PORTA,ENABLE);// Enable auf 0 setzen -> Zeilen deaktiviert.
CLEARBIT(PORTA,CLOCK); // Clock auf 0
CLEARBIT(PORTA,DATEN); // Daten auf 0

SETBIT(PORTA,ZEILE2_0); //1
CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 0 ausgewählt
CLEARBIT(PORTA,ZEILE2_2); //0

}

void select_zeile(uint8_t zeile)
{
if(zeile == 0)
{
SETBIT(PORTA,ZEILE2_0); //1
CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 0 ausgewählt
CLEARBIT(PORTA,ZEILE2_2); //0
}

if(zeile == 1)
{
CLEARBIT(PORTA,ZEILE2_0); //0
SETBIT(PORTA,ZEILE2_1); //1 Zeile 1 ausgewählt
CLEARBIT(PORTA,ZEILE2_2); //0
}

if(zeile == 2)
{
SETBIT(PORTA,ZEILE2_0); //1
SETBIT(PORTA,ZEILE2_1); //1 Zeile 2 ausgewählt
CLEARBIT(PORTA,ZEILE2_2); //0
}

if(zeile == 3)
{
CLEARBIT(PORTA,ZEILE2_0); //0
CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 3 ausgewählt
SETBIT(PORTA,ZEILE2_2); //1
}

if(zeile == 4)
{
SETBIT(PORTA,ZEILE2_0); //1
CLEARBIT(PORTA,ZEILE2_1); //0 Zeile 4 ausgewählt
SETBIT(PORTA,ZEILE2_2); //1
}

if(zeile == 5)
{
CLEARBIT(PORTA,ZEILE2_0);//0
SETBIT(PORTA,ZEILE2_1); //1 Zeile 5 ausgewählt
SETBIT(PORTA,ZEILE2_2); //1
}

if(zeile == 6)
{
SETBIT(PORTA,ZEILE2_0); //1
SETBIT(PORTA,ZEILE2_1); //1 Zeile 5 ausgewählt
SETBIT(PORTA,ZEILE2_2); //1
}

}



void anzeigen(uint8_t data[], uint8_t zeile)
{
uint8_t k;

//Daten in Register laden
for (k = MAX_ZEICHEN; k!=0; k--)
{

if (data[k] !=0) //Welchen Status hat das nächste Bit
{
SETBIT(PORTA,DATEN); //PORT high, falls Bit == 1;
}
else
{
CLEARBIT(PORTA,DATEN); //PORT low, sonst
}

SETBIT(PORTA,CLOCK); //CLOCK AN, Pegel übernehmen
_delay_us(20);
CLEARBIT(PORTA,CLOCK); //CLOCK AUS
}


//Zeile wählen und anzeigen

select_zeile(zeile); //Zeile wählen
_delay_ms (20);
SETBIT(PORTA,ENABLE); //Gewählte Zeile einschalten
_delay_ms (20);
CLEARBIT(PORTA,ENABLE); //Gewählte Zeile ausschalten
}



Es funktioniert alles soweit, es geht halt nur um "logischefehler" die ich so nicht sehe.

Wäre nett wenn sich das mal jemand mit mehr ahnung als ich ansehen könnte.

bL1nK
12.02.2007, 22:46
flacker.. kann gut sein das es vom Mikrocontroller her kommt, vielleicht wenn du die daten schneller raustaktest?

Seby
12.02.2007, 22:55
Das hab ich schon probiert , naja flackern is vieleicht etwas blöd beschrieben , es ist mehr so das jede zweite zeile immer um 2-3 pixel nach links oder rechts springt.

bL1nK
13.02.2007, 07:36
der einfachste fehler wäre, es stimmt z.b. ein nuller nicht in deiner textmatrix?
dass du dich da vielleicht vertan hast?