C-kods problem
Påtal om allt så klagar den på att "unsigned char * data;" måste ha en storlek.
Finns det något enkelt sätt att göra det på? Är inte så hemma på pekare.
//Emil
Edit:
Felmedelande:
Finns det något enkelt sätt att göra det på? Är inte så hemma på pekare.
//Emil
Edit:
Felmedelande:
Kod: Markera allt
g_lcd.c:306: error: array size missing in 'data'
Och det blir såhär för varje "case 'A': data = char_A; break;":
g_lcd.c:310: error: incompatible types in assignment
Och "const unsigned char *char_A[] = {0b01111110, 0b10010000, 0b10010000, 0b10010000, 0b01111110};" ger:
g_lcd.c:42: warning: initialization makes pointer from integer without a cast
Sorry, bör väl vara såhär:
Kod: Markera allt
const char Char_A[] = {0b01111110, 0b10010000, 0b10010000, 0b10010000, 0b01111110};
const char Char_B[] = {0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b01101100};
Testa då:
Men hur många karaktärer är det som INTE ska kunna skrivas?
Det sätt du gör det på är mycket platsödande, en simpel range-check och en gemensam karaktärtabell hade varit snabbare och minst lika kodeffektiv.
Kod: Markera allt
case 'A': Data = &Char_A; break;
osv osv.
Det sätt du gör det på är mycket platsödande, en simpel range-check och en gemensam karaktärtabell hade varit snabbare och minst lika kodeffektiv.
När jag ändrade så fick jag felmedelandet "g_lcd.c:310: warning: assignment from incompatible pointer type" istellet.
Jag har hela amerikanska alfabetet, 0-9, och några vanliga tecken.
Karaktärtabell? Berätta gärna vad det är!
//Emil
Edit: Jag vet inte hur mycket detta tar men jag har 16kB Flash att jobba med.
Jag har hela amerikanska alfabetet, 0-9, och några vanliga tecken.
Karaktärtabell? Berätta gärna vad det är!
//Emil
Edit: Jag vet inte hur mycket detta tar men jag har 16kB Flash att jobba med.
Kod: Markera allt
unsigned char Tabel_1[5][] = {
{0b01111110, 0b10010000, 0b10010000, 0b10010000, 0b01111110}, // Grafik för 'A'
{0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b01101100}, // Grafik för 'B'
osv en hel del.
if((ch >= 'a') && (ch <= 'z')) Data = &Tabel_2[0][ch - 'a'];
else if((ch >= 'A') && (ch <= 'Z')) Data = &Tabel_1[0][ch - 'A'];
Då slås alla från och med 'A' upp i Tabel_1, offsettas med 'A' vilket betyder att 'A' vill bli första index (=0), 'B' - 'A' = 1, 'C' - 'A' = 2 osv osv.
På det vis kan man tillåta "avbrott" i teckentabellen men ändå indexera ganska hyggligt i resten.
Data = &Tabel_1[0][ch - 'A'];
ch är ju tecknet som ska grafas ut, vi låtsas att det är 'E' just nu.
Om ch alltså innehåller värdet som motsvarar 'E' (=0x69) och vi subtraherar 'A' (=0x65) blir resultatet: ('E' - 'A' =) 4.
Om tabellen börjar med koderna för 'A' som index 0 blir det alltså 5'te tecken som är *trompetfanfar o lite raketer* 'E'.
Index 0: 'A'
Index 1: 'B'
Index 2: 'C'
Index 3: 'D'
Index 4: 'E'
osv osv osv
Detta kan såklart börja på valfri index och med lite smart kodning kan man fylla på tabellen som man vill och bara kompilera om, sen är det klart.
#define First_Index_1 'A'
const char Tabel_1[5][] = {
..... en jävla massa bytes....};
#define Last_Index_1 (sizeof(Tabel_1 / 5) + First_Index_1 - 1)
if((ch >= First_Index_1) && (ch <= Last_Index_1)) Data = Tabel_1[0][ch - First_Index_1];
Nu kan du fylla på i Tabel_1 med tecken, dessa ändringar vill ATUOMATISK avspegla sig i Last_Index_1 och First_Index_1 måste du dock ställa manuellt till det första ASCII tecken du beskriver i tabellen.
På det vis har man begränsat felkällorna ordentligt och öppnat för vidareutveckling.
ch är ju tecknet som ska grafas ut, vi låtsas att det är 'E' just nu.
Om ch alltså innehåller värdet som motsvarar 'E' (=0x69) och vi subtraherar 'A' (=0x65) blir resultatet: ('E' - 'A' =) 4.
Om tabellen börjar med koderna för 'A' som index 0 blir det alltså 5'te tecken som är *trompetfanfar o lite raketer* 'E'.
Index 0: 'A'
Index 1: 'B'
Index 2: 'C'
Index 3: 'D'
Index 4: 'E'
osv osv osv
Detta kan såklart börja på valfri index och med lite smart kodning kan man fylla på tabellen som man vill och bara kompilera om, sen är det klart.
#define First_Index_1 'A'
const char Tabel_1[5][] = {
..... en jävla massa bytes....};
#define Last_Index_1 (sizeof(Tabel_1 / 5) + First_Index_1 - 1)
if((ch >= First_Index_1) && (ch <= Last_Index_1)) Data = Tabel_1[0][ch - First_Index_1];
Nu kan du fylla på i Tabel_1 med tecken, dessa ändringar vill ATUOMATISK avspegla sig i Last_Index_1 och First_Index_1 måste du dock ställa manuellt till det första ASCII tecken du beskriver i tabellen.
På det vis har man begränsat felkällorna ordentligt och öppnat för vidareutveckling.
Eftersom det är en µC du använder så vill du absolut ha den stora bokstavsarrayen i programminnet (Flash), och inte i det lilla RAM-minnet.
Du får deklarera arrayen med PROGMEM och använda speciella funktioner för att komma åt arrayen. Se:
http://www.nongnu.org/avr-libc/user-man ... _rom_array
http://www.nongnu.org/avr-libc/user-man ... space.html
Du får deklarera arrayen med PROGMEM och använda speciella funktioner för att komma åt arrayen. Se:
http://www.nongnu.org/avr-libc/user-man ... _rom_array
http://www.nongnu.org/avr-libc/user-man ... space.html
Okej, jag ska inte ljuga nu så, jag förstår absolut inget av det där. Eller, kanske lite men inte så mycket.
Och det står ju att när man kör med PROGMEM att det sparas bara i ROMet då, inte i Flash.

//Emil
Och det står ju att när man kör med PROGMEM att det sparas bara i ROMet då, inte i Flash.
Ska kolla mer på det.How do I put an array of strings completely in ROM?
There are times when you may need an array of strings which will never be modified. In this case, you don't want to waste ram storing the constant strings. The most obvious (and incorrect) thing to do is this:
...............
The result is not what you want though. What you end up with is the array stored in ROM, while the individual strings end up in RAM (in the .data section).
To work around this, you need to do something like this:
...............

//Emil