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.
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.