C-kods problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Är det en AVR du ska ha in det i?
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Japp.

//Emil
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

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:

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
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

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};
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Okej, nu fixade det mest sig. Tackar men en sak kvarstår.

Och det blir för varje "case 'A': data = char_A; break;":
g_lcd.c:310: error: incompatible types in assignment

Sorry för att jag frågar så mycket men har aldrig sätt logiken i pekare. :?

//Emil
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Testa då:

Kod: Markera allt

case 'A': Data = &Char_A; break;
osv osv.
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.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

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.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Fixade det. istellet för data = &char_A ; så skulle det vara data = (unsigned char*) char_A;

Men berätta gärna om karaktärtabell iaf. :)

Och tack för hjälpen!

//Emil
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

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.
Detta låtsas vi finns för 'A' - 'Z' (Tabel_1) och 'a'-'z' (Tabel_2), vi lägger dom i var sin tabell för att spara plats. Sedan gör man en enkel:
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.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Aha! Fler dimentionella arrayer.
Det har jag funderat på men kom inte på något bra sätt att hitta i den.
Men ska nog kolla mer på det. :)

Och tack så mycket för all hjälp!

//Emil

Edit: Kan du förklara lite bättre hur man sätter 'A' som index (0)?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

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.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

Tack ska du ha för infon! :D
Ska nog skriva om det så jag kör med arrayer istellet, mycket enklare.

//Emil
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

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
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Inlägg av Korken »

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.
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:
...............
Ska kolla mer på det. :)

//Emil
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Flash *är* ROM.

ROM = "Read Only Memory".
Flash är en teknik att bygga ROM.

Eller för att vara exakt, Flash = EEPROM (Electricaly Erasable [and] Programmable ROM)...
Skriv svar