Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Sehe Fehler nicht
-schumi-
24.08.2011, 13: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
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, 13:53
@Ceos
Habe den Code gerade vereinfacht (siehe oben), das Problem bleibt aber
zeig bitte auch wie deine arrays deklariert sind, vll. gewinnt man dann mehr überblick ich finds bisher auch seltsam
-schumi-
24.08.2011, 14: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-
LEDTable_text[Pos_1] = pgm_read_byte(&char_A[Pos_2]);
-schumi-
24.08.2011, 14:36
Stefan, ich könnt dich knutschen^^
Vielen vielen vielen Dank!!!
Endlich kanns weitergehen...
Viele herzliche Grüße
-schumi-
-schumi-
24.08.2011, 21: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, 10:09
Coooool!!
Danke für's Zeigen!
Andreas
-schumi-
25.08.2011, 14:46
Hier gibts die Sourcen zu dem ganzen: https://www.roboternetz.de/community/threads/54607-LED-Board-gt-Textanzeige?p=522936#post522936
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.