Sida 2 av 4

Postat: 14 april 2007, 19:07:50
av cykze
Är det en AVR du ska ha in det i?

Postat: 14 april 2007, 19:48:13
av Korken
Japp.

//Emil

Postat: 14 april 2007, 19:54:57
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

Postat: 14 april 2007, 20:00:19
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};

Postat: 14 april 2007, 20:03:26
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

Postat: 14 april 2007, 20:52:36
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.

Postat: 14 april 2007, 21:22:05
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.

Postat: 14 april 2007, 21:30:54
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

Postat: 14 april 2007, 21:53:07
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.

Postat: 14 april 2007, 22:02:52
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)?

Postat: 14 april 2007, 22:19:00
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.

Postat: 14 april 2007, 23:18:32
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

Postat: 15 april 2007, 01:07:18
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

Postat: 15 april 2007, 12:19:47
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

Postat: 15 april 2007, 13:00:05
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)...