PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Sehe Fehler nicht



-schumi-
24.08.2011, 12:27
Hallo zusammen,

ich werd noch doof hier... Hier ein Auszug aus dem Quellcode:



void putaintoled (void)
{
unsigned char Pos_2;
unsigned char Pos_1;


Pos_1 = 0;
Pos_2 = 0;
while(Pos_1 <=4)
{
LEDTable_text[Pos_2] = char_A[Pos_2];
Pos_1 = Pos_1 +1;
Pos_2 = Pos_1;
}

LEDTable_text[5] = 0b10000000;
}


Wenn ich den jetz so ändere:


void putaintoled (void)
{
unsigned char Pos_2;
unsigned char Pos_1;


Pos_1 = 0;
Pos_2 = 0;
while(Pos_1 <=4)
{
LEDTable_text[Pos_2] = char_A[Pos_2];
Pos_1 = Pos_1 +1;
Pos_2 = Pos_2 +1;
}

LEDTable_text[5] = 0b10000000;
}

(es wird nur der rote Teil geändert)

Dann funktioniert nichts mehr! Bzw. in das Array LEDTable_text wird Anstatt


0b00111111
0b01001000
0b01001000
0b01001000
0b00111111

das hier reinkopiert:


0b00000011
0b00000000
0b00000000
0b00000000
0b00100000


Ich checks einfach nicht... Pos_1 wird doch genauso behandelt wie Pos_2?!?

Ich hab erst schon gedacht, das kommt von einem Ram-Überlauf oder sowas (Das Programm ist schon relativ groß), aber wohl eher nicht:


$ avr-size --mcu=atmega32 -C main.elf
AVR Memory Usage
----------------
Device: atmega32


Program: 2262 bytes (6.9% Full)
(.text + .data + .bootloader)


Data: 296 bytes (14.5% Full)
(.data + .bss + .noinit)


EEPROM: 250 bytes (24.4% Full)
(.eeprom)


Weis jemand Rat?

Viele Grüße
-schumi-

PS: Das ganze ist für eine LED-Board mit 336 LEDs, um dann einen Text anzuzeigen. Leider habe ich derzeit keine guten Debugmöglichkeiten, da der FTDI-Chip noch nicht so will... Aber der Fehler äußerst sich dadurch, dass bei Code 1 ein "A" angezeigt wird (siehe Array) und bei Code 2 eben nur diese 3 LEDs leuchten...

[EDIT] Codebeispiele übersichtlicher gemacht

Ceos
24.08.2011, 12:51
hast du es eventuell mal mit +=1 statt ++ versucht!? klingt gerade ein wenig verwirrden für mich, lässt sich das nicht eventuell anders lösen ? einfach das inkrement des ungeprüften wertes am ende der schleife manuell inkremetieren ?!

-schumi-
24.08.2011, 12:53
@Ceos

Habe den Code gerade vereinfacht (siehe oben), das Problem bleibt aber

Ceos
24.08.2011, 13:09
zeig bitte auch wie deine arrays deklariert sind, vll. gewinnt man dann mehr überblick ich finds bisher auch seltsam

-schumi-
24.08.2011, 13:19
Ich hab das ganze Projekt jetzt mal kopiert und alles rausgeschmissen, was ich nicht brauche. Hier die LED-Board.c:


#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <util/delay.h>
#include "ledboard.h"




const prog_char char_A[6] = { 0b00111111,
0b01001000,
0b01001000,
0b01001000,
0b00111111};

const prog_char char_B[6] = { 0b01111111,
0b01001001,
0b01001001,
0b01001001,
0b00110110};

const prog_char char_C[6] = { 0b00111110,
0b01000001,
0b01000001,
0b01000001,
0b00100010};


unsigned char LEDTable_text[30];


void putaintoled (void)
{
unsigned char Pos_2;
unsigned char Pos_1;


Pos_1 = 0;
Pos_2 = 0;
while(Pos_2 <=4)
{
LEDTable_text[Pos_1] = char_A[Pos_2];
Pos_1 = Pos_1 +1;
Pos_2 = Pos_2 +1;
}

LEDTable_text[5] = 0b10000000;
}

// ------------------------------- Ab hier nur noch Funktionen um den Text mit den LEDs auszugeben -----------------------


void PrintByte2LEDs (unsigned char data, unsigned char posonboard) // Spalte der LED-Matrix ansteuern
{
unsigned char Data_for_Block_dez = 0;
if(1)
{
BOARDHORIZ_PORT = BOARDHORIZ_PORT & ~BOARDHORIZ1 & ~BOARDHORIZ2 & ~BOARDHORIZ3 & ~BOARDHORIZ4 & ~BOARDHORIZ5 & ~BOARDHORIZ6 & ~BOARDHORIZ7;
if(data & 0b00000001)
BOARDHORIZ_PORT = BOARDHORIZ_PORT | BOARDHORIZ1;
if(data & 0b00000010)
BOARDHORIZ_PORT = BOARDHORIZ_PORT | BOARDHORIZ2;
if(data & 0b00000100)
BOARDHORIZ_PORT = BOARDHORIZ_PORT | BOARDHORIZ3;
if(data & 0b00001000)
BOARDHORIZ_PORT = BOARDHORIZ_PORT | BOARDHORIZ4;
if(data & 0b00010000)
BOARDHORIZ_PORT = BOARDHORIZ_PORT | BOARDHORIZ5;
if(data & 0b00100000)
BOARDHORIZ_PORT = BOARDHORIZ_PORT | BOARDHORIZ6;
if(data & 0b01000000)
BOARDHORIZ_PORT = BOARDHORIZ_PORT | BOARDHORIZ7;

if(posonboard<=8)
{
BLOCKENABLE_PORT = BLOCKENABLE_PORT &~BLOCKENABLE1;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE2;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE3;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE4;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE5;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE6;
Data_for_Block_dez = posonboard;
}
if((posonboard>8) && (posonboard<=16))
{
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE1;
BLOCKENABLE_PORT = BLOCKENABLE_PORT &~BLOCKENABLE2;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE3;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE4;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE5;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE6;
Data_for_Block_dez = posonboard - 8;
}
if((posonboard>16) && (posonboard<=24))
{
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE1;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE2;
BLOCKENABLE_PORT = BLOCKENABLE_PORT &~BLOCKENABLE3;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE4;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE5;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE6;
Data_for_Block_dez = posonboard - 16;
}
if((posonboard>24) && (posonboard<=32))
{
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE1;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE2;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE3;
BLOCKENABLE_PORT = BLOCKENABLE_PORT &~BLOCKENABLE4;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE5;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE6;
Data_for_Block_dez = posonboard - 24;
}
if((posonboard>32) && (posonboard<=40))
{
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE1;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE2;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE3;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE4;
BLOCKENABLE_PORT = BLOCKENABLE_PORT &~BLOCKENABLE5;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE6;
Data_for_Block_dez = posonboard - 32;
}
if((posonboard>40) && (posonboard<=48))
{
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE1;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE2;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE3;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE4;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE5;
BLOCKENABLE_PORT = BLOCKENABLE_PORT &~BLOCKENABLE6;
Data_for_Block_dez = posonboard - 40;
}
unsigned char Data_for_Block_bin = 1<<(Data_for_Block_dez-1);

BLOCKDATA_PORT = BLOCKDATA_PORT & ~BLOCKDATA1 & ~BLOCKDATA2 & ~BLOCKDATA3 & ~BLOCKDATA4 & ~BLOCKDATA5 & ~BLOCKDATA6 & ~BLOCKDATA7 & ~BLOCKDATA8;
if(Data_for_Block_bin & 0b00000001)
BLOCKDATA_PORT = BLOCKDATA_PORT | BLOCKDATA1;
if(Data_for_Block_bin & 0b00000010)
BLOCKDATA_PORT = BLOCKDATA_PORT | BLOCKDATA2;
if(Data_for_Block_bin & 0b00000100)
BLOCKDATA_PORT = BLOCKDATA_PORT | BLOCKDATA3;
if(Data_for_Block_bin & 0b00001000)
BLOCKDATA_PORT = BLOCKDATA_PORT | BLOCKDATA4;
if(Data_for_Block_bin & 0b00010000)
BLOCKDATA_PORT = BLOCKDATA_PORT | BLOCKDATA5;
if(Data_for_Block_bin & 0b00100000)
BLOCKDATA_PORT = BLOCKDATA_PORT | BLOCKDATA6;
if(Data_for_Block_bin & 0b01000000)
BLOCKDATA_PORT = BLOCKDATA_PORT | BLOCKDATA7;
if(Data_for_Block_bin & 0b10000000)
BLOCKDATA_PORT = BLOCKDATA_PORT | BLOCKDATA8;
}
}


void PrintText2LEDs (void) //LEDTable_text auf die LED-Matrix ausgeben (muss periodisch aufgerufen werden)
{
unsigned char Pos_in_LEDTable_text;
for(Pos_in_LEDTable_text = 0; LEDTable_text[Pos_in_LEDTable_text]!=0b10000000; Pos_in_LEDTable_text++)
{
PrintByte2LEDs(0, Pos_in_LEDTable_text+1);
_delay_us(1);
PrintByte2LEDs(LEDTable_text[Pos_in_LEDTable_text], Pos_in_LEDTable_text+1);
_delay_us(2);

}
}


void LEDInitIO (void)
{
BLOCKENABLE_DDR = BLOCKENABLE_DDR | BLOCKENABLE1 | BLOCKENABLE2 | BLOCKENABLE3 | BLOCKENABLE4 | BLOCKENABLE5 | BLOCKENABLE6;
BLOCKENABLE_PORT = BLOCKENABLE_PORT | BLOCKENABLE1 | BLOCKENABLE2 | BLOCKENABLE3 | BLOCKENABLE4 | BLOCKENABLE5 | BLOCKENABLE6;

BLOCKDATA_DDR = BLOCKDATA_DDR | BLOCKDATA1 | BLOCKDATA2 | BLOCKDATA3 | BLOCKDATA4 | BLOCKDATA5 | BLOCKDATA6 | BLOCKDATA7 | BLOCKDATA8;
BLOCKDATA_PORT = BLOCKDATA_PORT & ~BLOCKDATA1 & ~BLOCKDATA2 & ~BLOCKDATA3 & ~BLOCKDATA4 & ~BLOCKDATA5 & ~BLOCKDATA6 & ~BLOCKDATA7 & ~BLOCKDATA8;

BOARDHORIZ_DDR = BOARDHORIZ_DDR | BOARDHORIZ1 | BOARDHORIZ2 | BOARDHORIZ3 | BOARDHORIZ4 | BOARDHORIZ5 | BOARDHORIZ6 | BOARDHORIZ7;
BOARDHORIZ_PORT = BOARDHORIZ_PORT & ~BOARDHORIZ1 & ~BOARDHORIZ2 & ~BOARDHORIZ3 & ~BOARDHORIZ4 & ~BOARDHORIZ5 & ~BOARDHORIZ6 & ~BOARDHORIZ7;


}




Wie man sehen kann: Die Buchstaben A, B, und C liegen und bleiben im Flash, der LEDTable_text liegt im Ram (muss ja verändert werden)

Vielen Dank schonmal :-D
-schumi-

sternst
24.08.2011, 13:27
LEDTable_text[Pos_1] = pgm_read_byte(&char_A[Pos_2]);

-schumi-
24.08.2011, 13:36
Stefan, ich könnt dich knutschen^^

Vielen vielen vielen Dank!!!

Endlich kanns weitergehen...

Viele herzliche Grüße
-schumi-

-schumi-
24.08.2011, 20:38
So, inzwischen läuft die Sache schon ganz passabel...

http://dl.dropbox.com/u/19005544/ledboard.MP4

Noch mal vielen vielen Dank euch beiden :-D

Viele Grüße
-schumi-

danimath
25.08.2011, 09:09
Coooool!!

Danke für's Zeigen!
Andreas

-schumi-
25.08.2011, 13:46
Hier gibts die Sourcen zu dem ganzen: https://www.roboternetz.de/community/threads/54607-LED-Board-gt-Textanzeige?p=522936#post522936