Hat dir der Compiler das so abgenommen?
data = pgm_read_byte( & Font6x8[0] );
^
|
| Du willst pgm_read_byte
eine Adresse übergeben.
Nicht den Wert von Font6x8[0]
Das ist kein Wunder. Bei
data = pgm_read_byte(Font6x8[0]);
ist der Typ des Makroarguments falsch. Dort gehört eine Adresse. Hier
wäre es eine near (16-Bit d.h. innerhalb des 64 KB Adressraums)
Adresse. Siehe auch
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29
data = pgm_read_byte(&Font6x8[0]);
Der ATmega128 hat ein 128 KB Flash und wenn du nicht garantieren kannst
innerhalb 64 KB zu bleiben, kannst du auch statt pgm_read_byte
pgm_read_byte_far benutzen.
Wie schaffst du das Programm auf den ATmega128, mit einem Bootloader?
Es gibt da per Lockbits Restriktionen bzgl. der (E)LPM
Assemblerbefehle, die vom pgm_read_byte Makro benutzt werden.
Du solltest auch schreiben, mit welcher GCC Version du arbeitest (s.
Problemberichte im oben erwähnten Tutorial).
@ Karl Heinz
Ja der GCC Compiler (hier 3.4.5) nimmt das tatsächlich ohne Warnung.
Wohl weil pgm_read_byte() ein Makro (s. avr/pgmspace.h) ist und auf
inline Assembler expandiert wird.
Mir wäre das als Beispiel zum Entwanzen schon zu kompliziert.
Ich würde mir ein funktionierendes UART-Grundprogramm nehmen z.B. aus
dem AVR GCC Tutorial. Dort dann Code einfügen, um einen "Hello World"
Text oder wenn es sein muss ein Array ins Flash abzulegen. Und mir
diesen Text oder die Arraydaten dann über die serielle Schnittstelle
senden lassen. Damit würde ich sehen, ob das Ablegen und Auslesen
grundsätzlich klappt. Dannach würde ich mich um Fonttabellen und
Displayroutinen kümmern... Keep it simple!
"Da sollte ja was andreses stehen
oder muß man die Daten erts wandeln ???"
Da steht die Ascii-Repräsentation von irgendwelchen Binärdaten. Dass
das nicht sinnvoll aussieht, ist kein Wunder.
Du solltest entweder die Daten in Hex-Zeichen umwandeln (Binärdaten
0x12 => String "0x12") z.B. mit itoa() und dann die einzelnen
Ascii-Zeichen senden - oder ein Terminalprogramm verwenden, das die die
empfangenen Zeichen als Hexcode anzeigt. Das Bray-Terminal wäre so ein
Terminalprogramm oder auch das Programm von Tobi
http://www.mikrocontroller.net/forum/read-8-155472.html#new
Bevor du das machst, teste deine Senderoutine auf dem ATmega128 mit
einer Funktion, die bekannte Daten (z.B. "Hello world") sendet.
void testUART(void)
{
char *testdata = "hello world\r\n";
while (*testdata)
send_UART(*testdata++);
}
Damit stellst du sicher, dass die Datenübertragung seitens Baudrate,
Frameformat, Handshake... funktioniert. Wenn das nicht sicher ist,
suchst du dir beim eigentlichen Problem den Wolf.
Hi MarcusM,
hatte das gleich Problem: Strings für die serielle Schnittstelle (z.B.
zum Debuggen) sollten im Flash gespeichert sein um RAM zu sparen. Da
hat mir jemand aus dem Forum sehr gur geholfen. Ich gebe Dir einfach
den Code weiter:
//Falls der Formatstring in PROGMEM stehen soll
printf_P(PSTR("Hallo aus dem Progmem %d mal.\n"), 73);
//Falls ein String-Parameter im PROGMEM steht
printf_P(" %S %d %S\n", PSTR("Hallo aus dem Progmem\n"), 73,
PSTR("mal"));
//Beachte "%S" statt "%s" im Format!!!
Du musst natürlich <avr/pgmspace.h> includen und zwar das neuste !
möge es helfen !
Otto
mit dem obeigen Code commt nichts sauber raus.
das Hello WOrld geht super.
auch so nicht
char data
for (i=0;i<6;i++)
{
data=Font6x8[i+6];
send_UART(data);
waitms(1000);
}
hier zeigt das Terminal immer 0x00..0x00 6 mal.
bei diesen Code siehts gut aus
Terminal=
00 00 06 5F 06 00 = Zeichen "!"
Code:
send_UART(Font6x8[6]);
waitms(1000);
send_UART(Font6x8[7]);
waitms(1000);
send_UART(Font6x8[8]);
waitms(1000);
send_UART(Font6x8[9]);
waitms(1000);
send_UART(Font6x8[10]);
waitms(1000);
send_UART(Font6x8[11]);
warum dieses????
Habe mal den Tip mit PSTR aus dem Tutorial probiert nun bin ich soweit
das ich nur noch wissen muß wie man die bits auswerten kann.
hier der neue Code
int drawchar(char c)
{
// es wird das Font6x8 Array ab position 6 eingelesen 6 stellen lang
das Zeichen ist "!":
uint8_t myByte;
uint16_t index;
int i;
int u;
for (i=0;i<6;i++)
{ myByte=eeprom_read_byte(&Font6x8[i+6]);
send_UART(myByte);
for (u=0;u<8;u++)
{
//Wie kann ich jetzt hier die bits ermitteln 0 oder 1 von MyByte????
}
}
return 0;
}
Im Terminal kommt folgendes
00 00 06 5F 06 00 ergibt=="!" ist korreckt.
nun muß ich die einzelnen werte bitweise auslesen und prüfen ob =1 oder
=0.
zb
0x00= kein pixel 8x
0x06 =00000110
übersetzt bit 8=kein pixel
übersetzt bit 7=kein pixel
übersetzt bit 6=kein pixel
übersetzt bit 5=kein pixel
übersetzt bit 4=kein pixel
übersetzt bit 3= pixel setzten
übersetzt bit 2= pixel setzten
übersetzt bit 1=kein pixel
dieses muß ich in einer schleife prüfen..
Was du gemacht hast, verstehe ich aus deiner Beschreibung nicht.
Mit
char data
for (i=0;i<6;i++)
{
data=Font6x8[i+6];
...
greifst du auf ein Array im RAM des ATmega128 zu. Und zwar auf das 0+6.
bis 5+6. Element. Die bisher gezeigte Deklaration des Arrays mit
static uint8_t _attribute_ ((progmem)) Font6x8[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // "(space)"
0x00, 0x00, 0x06, 0x5F, 0x06, 0x00, // "!" 0+6. bis 5+6. Element
...
legt KEIN Array im RAM an. Um ein Array im RAM anzulegen müsste das
_attribute_ ((progmem)) weg.
Warum dein Beispiel #1 nicht läuft bzw. #2 und #3 doch, kann ich ohne
lauffähigen Code nicht beurteilen. Allein die einsam, syntaktisch
falsch rumstehende Zeile "char data" macht mich schon skeptisch. Und
wieso du jetzt in Beispiel #3 auf eeprom_read_byte() wechselst,
verstehe ich auch nicht.
Egal - Zu der Bittesterei und Bitschieberei sollte dir dieser
Codeabschnitt bekannt vorkommen ;-)
Hallo
habe es geschaftt nun muß ich den code flexible machen
geht mit fest eingestellten werten für font 6x8 und 12x 16.
Hier der Code
nt drawchar(char c)
{
sendCMD(MEM_ACCESS_CTRL);
memAccessCtrl |= (0x01 << VERT_WRITE);
sendData(memAccessCtrl);
uint16_t index;
uint8_t myByte;
c -= 32;
index = c*24*(8/8);
window(2,17,2,13); /Display Speicher definieren für das Zeichen
char* zahl;
int i;
int u;
for (i=0;i<24;i++)
{ myByte=eeprom_read_byte(&Font12x16[index++]);
for (u=0;u<8;u++)
{
if(myByte & 0x01)
{
sendData(RED);
}
else
{
sendData(WHITE);
}
myByte >>= 1;
}
}
//}
return 0;
}
ich übergeb ein A an die Funktion
Besten Dank für eure Hilfe und eure guten Tips ohne diese hätte ich
graue Haare.