[AVR GCC] Wyświetlacz z telefonu Siemens S65

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
robson
Użytkownik
Posty: 226
Rejestracja: 22 sty 2006, 19:51
Lokalizacja: S.M.
Kontakt:

[AVR GCC] Wyświetlacz z telefonu Siemens S65

Post autor: robson » 31 mar 2010, 12:24

Witam
Nie tak dawno znalazłem w swojej szufladzie telefon Siemens S65. Wpadłem na pomysł, żeby wykorzystać zastosowany w nim wyświetlacz (jest sprawny, ponieważ po włączeniu telefonu działa). Zebrałem dostępne mi materiały, poczytałem trochę na jego temat i postanowiłem wziąć się do roboty.

Wzorowałem się na opisie i kodzie źródłowym ze strony http://www.superkranz.de/christian/S65_ ... Index.html Posiadając wszystkie niezbędne mi części, zabrałem się za software. Wykonywałem wszystko tak, jak w pliku install ściągniętym z podstrony razem z kodami źródłowymi, bibliotekami etc. - http://www.superkranz.de/christian/S65_ ... tware.html i tak:

- w makefile zmieniłem dane w polach MCU_TARGET i -DXTAL=16000000 na własne, czyli procesor MEGA8 i częstotliwość 8MHz
- skopiowałem odpowiednie pliki do folderów instalacynych WinAVR
- pierwsza kompilacja w folderze glcd przebiegła pomyślnie
- zmieniłem zawartość pliku makefile w folderze test
- przy drugiej kompilacji wyświetla mi błąd:

Linking: test.elf
avr-gcc -mmcu=atmega8 -I. -D GCC_MEGA_AVR -I. -g -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wextra -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wunused -std=gnu99 test.o --output test.elf -Wl,-Map=test.map,--cref -lm -L../glcd/. -lglcd
C:\WinAVR\BIN\..\lib\gcc\avr\3.4.3\..\..\..\..\avr\bin\ld.exe: region text is full (test.elf section .text)
make.exe: *** [test.elf] Error 1

Proszę o jakąkolwiek wskazówkę i z góry dziękuję
Pozdr. Robert

alaris
Użytkownik
Posty: 531
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 31 mar 2010, 13:17

robson pisze:przy drugiej kompilacji wyświetla mi błąd:
C:\WinAVR\BIN\..\lib\gcc\avr\3.4.3\..\..\..\..\avr\bin\ld.exe: region text is full (test.elf section .text)
make.exe: *** [test.elf] Error 1
Sugeruje to, że masz za mało pamięci procku, skompiluj program dla większego i zobacz czy będzie OK.

Awatar użytkownika
Aro
Użytkownik
Posty: 677
Rejestracja: 30 paź 2006, 18:49
Lokalizacja: Świerczyniec | Wrocław
Kontakt:

Post autor: Aro » 31 mar 2010, 14:38

Diabeł tkwi w szczegółach : avr-gcc -mmcu=atmega8 -I. -D GCC_MEGA_AVR -I. -g -O0 -funsigned-char -fu... . Masz wyłączoną optymalizację. Ustaw na s. Wtedy program na pewno się zmieści.

Awatar użytkownika
robson
Użytkownik
Posty: 226
Rejestracja: 22 sty 2006, 19:51
Lokalizacja: S.M.
Kontakt:

Post autor: robson » 01 kwie 2010, 8:50

hehe no tak...po włączeniu optymalizacji zmieścił się w MEGA8 :D Jednak wcześniej zacząłem kombinować z MEGA162 i chyba docelowo tak już zostanie. Mam nadzieję, że dzisiaj już odpalę.

P.S. Mam też nadzieję, nikt nie zauważy zniknięcia "awaryjnego" telefonu ;P

[ Dodano: 2010-04-08, 15:10 ]
Hmm...I mam problem. Wyświetlacz mimo zaprogramowanego mikrokontrolera nie chce działać. Czy to możliwe, że linia 1.8V wyświetlacza LCD nie pobiera w ogóle prądu? Wszystkie inne przy podłączeniu pobierają prąd. Może w tym tkwi problem. Jak jest u Was? Czy po wpięciu miliamperomierza pomiędzy zasilacz 2.9V a przewód doprowadzony do punktu 1.8V płynie prąd?

czaras87
-
Posty: 3
Rejestracja: 01 kwie 2013, 12:57
Lokalizacja: Toruń

Post autor: czaras87 » 01 kwie 2013, 13:35

Witam i przepraszam, że odkopuje tak stary temat...

Mam podobny problem jak kolega robson. A więc tak:

- korzystam z Eclipse
- Atmega8
- programator usbasp
- korzystam z tej samej biblioteki do obsługi wyświetlacza LS020 z telefonu S65 http://www.superkranz.de/christian/S65_ ... tware.html
http://www.superkranz.de/christian/S65_ ... cd_V01.zip
- wypakowałem archiwum s65_glcd_V01.zip do katalogu c:\s65_glcd_V01
- w makefile GLCD zmieniłem dane w polach MCU_TARGET i -DXTAL=16000000 na własne, czyli procesor ATMEGA8 i częstotliwość 8MHz, optymalizacje na s.
- kompilacja w folderze glcd przebiegła pomyślnie (poprzez cmd i dalej w folderze glcd wydałem komendę make clean, a następnie make all)
- skopiowałem odpowiednie pliki do folderów instalacyjnych WinAVR (winavr przeinstalowałem bo wcześniej katalog instalacyjny nazywał się WinAVR-20100110, a teraz winavr - c:\winavr)
- zmieniłem zawartość pliku makefile w folderze test (MCU = atmega8, optymalizacje na s)

---------------------------------------------------------------------------------------------------------
- przy kompilacji w folderze test wyświetla mi błąd:


c:\s65_glcd_V01\V01\test>make clean
makefile:335: test.d: No such file or directory
set -e; avr-gcc -MM -mmcu=atmega8 -I. -D GCC_MEGA_AVR -I. -g -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wextra -Wshadow -Wpoint
er-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Waggregate-return -Wst
rict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wunused -std=gnu99
test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d

-------- begin --------

Cleaning project:
rm -f test.hex
rm -f test.eep
rm -f test.obj
rm -f test.cof
rm -f test.elf
rm -f test.map
rm -f test.obj
rm -f test.a90
rm -f test.sym
rm -f test.lnk
rm -f test.lss
rm -f test.o
rm -f test.lst
rm -f test.s
rm -f test.d
Errors: none
-------- end --------


c:\s65_glcd_V01\V01\test>make all
makefile:335: test.d: No such file or directory
set -e; avr-gcc -MM -mmcu=atmega8 -I. -D GCC_MEGA_AVR -I. -g -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wextra -Wshadow -Wpoint
er-arith -Wbad-function-cast -Wcast-align -Wsign-compare -Waggregate-return -Wst
rict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wunused -std=gnu99
test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling: test.c
avr-gcc -c -mmcu=atmega8 -I. -D GCC_MEGA_AVR -I. -g -Os -funsigned-char -funsign
ed-bitfields -fpack-struct -fshort-enums -Wall -Wextra -Wshadow -Wpointer-arith
-Wbad-function-cast -Wcast-align -Wsign-compare -Waggregate-return -Wstrict-prot
otypes -Wmissing-prototypes -Wmissing-declarations -Wunused -std=gnu99 test.c -
o test.o
test.c:10: warning: no previous prototype for 'testLines'
test.c:33: warning: no previous prototype for 'testLines2'
test.c:45: warning: no previous prototype for 'testEllipses'
test.c:87: warning: no previous prototype for 'testEllipses2'
test.c:99: warning: no previous prototype for 'testRects'
test.c:120: warning: no previous prototype for 'glcdRotateRect'
test.c:190: warning: no previous prototype for 'glcdNewOrientation'
test.c:197: warning: no previous prototype for 'testSymbols'
test.c:223: warning: no previous prototype for 'glcdPrintCenter'
test.c:233: warning: no previous prototype for 'myRead'
test.c:238: warning: no previous prototype for 'demoScreen'
test.c:339: warning: no previous prototype for 'testOrientation'
test.c:390: warning: no previous prototype for 'testBitmaps'
test.c:411: warning: no previous prototype for 'glcdRandomClipRect'
test.c: In function 'main':
test.c:429: warning: unused variable 'o'

Linking: test.elf
avr-gcc -mmcu=atmega8 -I. -D GCC_MEGA_AVR -I. -g -Os -funsigned-char -funsigned-
bitfields -fpack-struct -fshort-enums -Wall -Wextra -Wshadow -Wpointer-arith -Wb
ad-function-cast -Wcast-align -Wsign-compare -Waggregate-return -Wstrict-prototy
pes -Wmissing-prototypes -Wmissing-declarations -Wunused -std=gnu99 test.o --
output test.elf -Wl,-Map=test.map,--cref -lm -L../glcd/. -lglcd
c:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: test.elf section
.text will not fit in region text
c:/winavr/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: region text overf
lowed by 2790 bytes
make: *** [test.elf] Error 1
---------------------------------------------------------------------------------------------------------

Czy byłby ktoś w stanie pomóc mi rozwiązać ten problem?
Jak uruchomić test.c?
Jak stworzyć z tego test.c nowy projekt w Eclipse, jak to wszystko poukładać?

Chciałem zaznaczyć, że wszystkie komendy make clean, make all w folderze glcd i test aktualnie robię z poziomu wiersza poleceń.


Proszę o pomoc :roll:

Ps. Korzystając z innej biblioteki - http://chomikuj.pl/mlody8585/S65+LCD/S6 ... 886430.zip lcd działa dobrze, wszystko wyświetla, program uruchomił się za pierwszym razem (tzn skopiowałem tylko zawartość tego archiwum do Eclipse (zmieniając rodzaj mcu i xtal), kliknąłem Build i wszystko zaczęło hulać :razz: )

Awatar użytkownika
Artyliusz
Użytkownik
Posty: 306
Rejestracja: 06 sty 2013, 14:10
Lokalizacja: Z Polski
Kontakt:

Post autor: Artyliusz » 01 kwie 2013, 14:30

czaras87 pisze:zmieniłem zawartość pliku makefile w folderze test (MCU = atmega8, optymalizacje na s)
A zmieniłeś nazwę pliku docelowego? Target file name. Jest tam domyślnie TARGET=main
Powinieneś zmienić na nazwę swojego pliku bez rozszerzenia. Jak u Ciebie nosi nazwę test.c to powinno być TARGET=test

czaras87
-
Posty: 3
Rejestracja: 01 kwie 2013, 12:57
Lokalizacja: Toruń

Post autor: czaras87 » 01 kwie 2013, 14:47

Ehh nie jestem teraz blisko komputera, na którym mam wszystkie te pliki ale pobrałem przed chwilką bibliotekę i jest tam coś takiego:

# MCU name
MCU = atmega128

# Output format. (can be srec, ihex, binary)
FORMAT = ihex

# Target file name (without extension).
TARGET = test

# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
# s seems to be size optimized
OPT = 0


SRC = test.c

To jest oryginalny urywek pliku makefile z folderu test. Czy może się zdarzyć tak, że gdy ja zmieniłem MCU na atmega8 to po komendach make clean i make all Target ulegnie zmianie? Teraz to ja mogę gdybać bo nie mam moich plików pod ręką. Jutro przed południem sprawdzę to i dam znać jak to wygląda bo faktycznie Targetu nie zmieniałem..

Dziękuję za tak szybki odzew :wink:

Awatar użytkownika
Artyliusz
Użytkownik
Posty: 306
Rejestracja: 06 sty 2013, 14:10
Lokalizacja: Z Polski
Kontakt:

Post autor: Artyliusz » 01 kwie 2013, 15:31

Teraz dopiero ściągnąłem tę bibliotekę i się niej przyglądam.

W ogóle ona jest stara, bo 2005, a teraz jest najnowszy WinAvr z 2010 chyba. W makefile nie ma takich opcji jak prędkość taktowania i, bo używasz USBasp, wyboru rodzaju programatora, albo ja nie widziałem. Chodzi mi o makefile w folderze test do test.c
czaras87 pisze:w makefile GLCD zmieniłem dane w polach MCU_TARGET i -DXTAL=16000000 na własne, czyli procesor ATMEGA8 i częstotliwość 8MHz, optymalizacje na s.
:grin:
A czy DXTAL nie chodzi przypadkiem o zewnętrzny kwarc?

Sam spróbowałem to skompilować, ale te same błędy u Ciebie, chociaż nie zrobiłem niektórych kroków z instrukcji, bo po prostu nie było takich plików jak \lib\compile.bat lub run \lib\test\compile.bat to compile DEMO

Ciekawe czy nie można te makefile przepisać jeszcze raz.

A czemu nie możesz używać tamtej drugiej biblioteki?

Edycja:
Rozwiązanie jest już na początku tematu.
ATmega8 nie zmieści pliku wynikowego.
Co widzimy

Kod: Zaznacz cały

avr/bin/ld.exe: test.elf section .text will not fit in region text
avr/bin/ld.exe: region text overflowed by 3876 bytes
Jak i mamy

Kod: Zaznacz cały

makefile:335: test.d: No such file or directory
Ale to z oryginalnymi ustawieniami.
Po włączeniu w makefile w folderze test optymalizacji s i glcd zmniejsza się kod o 1k, ale nadal brakuje miejsca.
Co ciekawe jak się weźmie jeszcze raz "make all" to znikają warningi. Znów "make clean" i "make all" i pojawiają się. Nie wiem dlaczego tak.

Po zmianie na oryginalnie ustawioną ATmega128 kompilacja przebiega bez erroru na końcu.

czaras87
-
Posty: 3
Rejestracja: 01 kwie 2013, 12:57
Lokalizacja: Toruń

Post autor: czaras87 » 02 kwie 2013, 10:46

No tak, masz racje. Już wcześniej zauważyłem, że nawet po ustawieniu optymalizacji program nie mieści się na mega8 :/ Zmyliło mnie jednak to, że robsonowi zmieścił się ten program po włączeniu optymalizacji, może zrobił coś inaczej.. Jednak tak czy inaczej odpuszczę sobie tę bibliotekę..

Z tej drugiej korzystam ale chciałem zobaczyć jak ta działa ponieważ dużo osób jej używa/używało, czy jest jakaś różnica w działaniu. No i w tej bibliotece jest sporo różnych czcionek, a w tej drugiej tylko jedna - 5x8, a jeszcze nie doszedłem jak zmienić/dodać nową czcionkę :???: Orientujesz się może gdzie, co i jak zrobić?

I jeszcze sprawa szybkości rysowania: Atmega8, 8Mhz czyści/zapełnia ekran kolorem ok 0.5s :neutral: Czy odpalenie na 16Mhz da spore przyspieszenie? (domyślam się, że coś ok x2 :wink: ) Czy to może właśnie wina biblioteki? Na youtube widziałem jak Atmega8 całkiem szybko działała z tym Lcd czyli jest to możliwe do wykonania (wydaje mi się, że tak ..tylko jak? :wink: )

Tak więc aktualnie mam 2 problemy:
- zmiana/dodanie czcionek
- szybkość rysowania na ekranie

Masz jakieś pomysły?

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 02 kwie 2013, 19:22

Może trochę nie na temat, ale mi na AT89S8253 w trybie X2 przy kwarcu 22.1184MHz (czyli około 3.69MHz na rdzeniu) udało się wyczyścić ten wyświetlacz w czasie poniżej 0.1s, z tym, że ja napisałem wszystko w asemblerze. Dlatego winy szukałbym właśnie w kodzie (biblioteki), a nie na siłę przyspieszał zegar mikrokontrolera.

Awatar użytkownika
kayron
Użytkownik
Posty: 2077
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 03 kwie 2013, 16:57

Jak się chce szybko rysować na ekranie to stosuje się różne sztuczki.
Po pierwsze ekranu się nie czyści tylko nadpisuje z bufora RAM.
Po drugie używa się w miarę możliwości sprzętowego interfejsu SPI i przerwań, wtedy można podczas przesyłania bufora obrazu na ekran, obliczać w tle już następny, oczywiście z pewnymi ograniczeniami.
Należy unikać wszelkich operacji typu SIN i COS obliczeniowych dynamicznie, przy rysowaniu obrazów wektorowych, zamiast tego w EEPROM lub w FLASH robi się tablice SIN i COS, i z nich podstawia do obliczeń, przyspieszenie może wynieść ok 5x.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 04 kwie 2013, 18:41

Z jakiego bufora RAM? Chyba nic nie pobije tej sztuczki:

Kod: Zaznacz cały

FILL_COLOR_LCD:
  mov R7, #XRES
_loopX:
  mov R6, #YRES
_loopY:
  mov SPDR, #COLOR_H     ;MSB koloru
  mov SPDR, #COLOR_L     ;LSB koloru
  djnz R6, _loopY
  djnz R7, _loopX
  ret
Oczywiście, aby to tak zadziałało, koniecznie trzeba pracować z buforowanym trybem SPI oraz z najwyższą prędkością, w przeciwnym razie kolejne dane będą szły zbyt szybko, a SPI nie zdąży ich wysłać. No i oczywiście przed użyciem tej pętli trzeba do wyświetlacza wysłać komendę, która mówi, że kolejne dane będą traktowane jak dane pikseli (ale to temat na inny wątek).

Oczywiście zamiast stałych można użyć zmiennych.

ODPOWIEDZ