logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega32][C]Wyświetlacz LCD S1D15705 - uruchomienie

lone_wolf816 10 Sie 2011 15:08 4268 22
REKLAMA
  • #1 9810998
    lone_wolf816
    Poziom 9  
    Witam.
    Niedawno kupiłem wyświetlacz graficzny lcd na sterowniku s1d15705 i próbowałem sprawdzić czy on działa wsadem z tematu: https://www.elektroda.pl/rtvforum/topic1722827.html użytkownika SQ3BKL. Dopiero zaczynam naukę C dlatego jedynie pozmieniałem porty w pliku S1D15705.h, żeby wszystko się zgadzało ze schematem i wrzuciłem skompilowany od nowa do procka plik main_S1D15705. Wyświetlacz nie reaguje. Po zdjęciu folii zabezpieczającej z wyświetlacza zauważyłem w jednym miejscu jakby ubytek pikseli dlatego myślę, że jest on uszkodzony.
    Mam również problem z podświetleniem – nie mogę zapalić danego koloru (po zwarciu wspólnej anody z zasilaniem układu i próbą podania stanu wysokiego na daną katodę, załączają się 2 kolory jednocześnie).

    Przede wszystkim mam prośbę o sprawdzenie kodu ze zmianami i ewentualne poprawienie błędów.




    Schemat:
    [ATmega32][C]Wyświetlacz LCD S1D15705 - uruchomienie
  • REKLAMA
  • REKLAMA
  • #3 9811191
    lone_wolf816
    Poziom 9  
    Fusy próbowałem ustawić na zewnętrzny kwarc 12Mhz ale nie mogłem znaleźć w tym kalkulatorze http://www.engbedded.com/fusecalc/ odpowiedniej konfiguracji dlatego ustawiłem na 8Mhz. W pliku Makefile nie zauważyłem ustawienia oscylatora (skopiowałem gotowy plik w którym pozmieniałem tylko rodzaj procka programatora i portu), ale poprawiłem na 8Mhz i dalej nic :/
    zdjęcie ustawionych fusów: [ATmega32][C]Wyświetlacz LCD S1D15705 - uruchomienie
  • REKLAMA
  • Pomocny post
    #4 9811343
    dondu
    Moderator na urlopie...
    1. Lekceważysz podłączanie niezbędnych pinów oraz filtrację zasilania:
    http://mikrokontrolery.blogspot.com/2011/04/minimalne-podlaczanie-pinow.html
    http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html

    2.
    lone_wolf816 napisał:
    Przede wszystkim mam prośbę o sprawdzenie kodu ze zmianami i ewentualne poprawienie błędów.

    Wrzuć tutaj program w znacznikach SYNTAX.
  • #5 9811625
    lone_wolf816
    Poziom 9  
    Dzięki za odpowiedź i linki, na pewno przydadzą się przy dalszych projektach,

    Kod ze zmianami z pliku S1D15705.h, który zawiera ustawienia portów i tablice znaków: (oryginał w komentarzach, koniec zmian wyraźnie odróżniony)

    Kod: text
    Zaloguj się, aby zobaczyć kod



    Kod, który prawdopodobnie wyświetla tekst "LCD demo".(nie jestem pewien, ponieważ dopiero zaczynam programowanie w C)

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 9813516
    lone_wolf816
    Poziom 9  
    Przeniosłem definicję zegara nad delay.h, skompilowałem bez żadnych błędów ale wyświetlacz nadal nie odpowiada.
  • Pomocny post
    #8 9813804
    LordBlick
    VIP Zasłużony dla elektroda
    Odznacz wszystkie CKSEL, zaznacz CKOPT, zaprogramuj i podłącz zewnętrzny rezonator kwarcowy 12MHz z kondensatorami 20pF.
    A F_CPU to definiuj w Makefile, a nie w źródłach:
    CFLAGS = $(COMMON)
    CFLAGS += -Wall -gdwarf-2 -std=gnu99
    CFLAGS += -DF_CPU=$(F_CPU)UL
    CFLAGS += -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
    CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d 
    
  • #9 9813994
    lone_wolf816
    Poziom 9  
    Zaprogramowałem fusebity, wywaliłem z programu definicję zegara, w makefile ustawiłem 12MHz i nadal nic :/
    Fusebity: [ATmega32][C]Wyświetlacz LCD S1D15705 - uruchomienie
  • #10 9814035
    LordBlick
    VIP Zasłużony dla elektroda
    No dobrze, a czy wrzucenie jakiegoś kodu testowego mrugającego LED z rezystorem 470Ω daje zakładany rezultat jeśli chodzi o częstotliwość migania ?
  • #11 9814637
    lone_wolf816
    Poziom 9  
    Wygląda na to, że uC padł. Po wrzuceniu programu testowego dioda nawet się nie zapala.
  • #12 9814712
    dondu
    Moderator na urlopie...
    lone_wolf816 napisał:
    Wygląda na to, że uC padł. Po wrzuceniu programu testowego dioda nawet się nie zapala.

    A może przełączyłeś nieprawidłowo fusbity. Ale wtedy wystarczy je odblokować:
    http://mikrokontrolery.blogspot.com/2011/04/zablokowany-mikrokontroler-atmel.html

    Po za tym pokaż ten program testowy, bo może ma błędy.
  • #13 9814832
    lone_wolf816
    Poziom 9  
    Kod napisałem w bascomie, anodę diody przez rezystor 300R podłączyłem do wyprowadzenia PA2 a katodę do GND. Fuse bity ustawiłem na 1Mhz (takie jakie były od nowości). Jeżeli chodzi o ten pierwszy kod w C z moimi poprawkami, czy zgadza się wszystko ze schematem ?


    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #14 9817615
    LordBlick
    VIP Zasłużony dla elektroda
    lone_wolf816 napisał:
    Wygląda na to, że uC padł. Po wrzuceniu programu testowego dioda nawet się nie zapala.
    Czyli można kod testowy wrzucić i programator nie protestuje ? W takim razie mało prawdopodobne, aby µC był niesprawny....
    Proponuję taki kodzik na 3 LED-y i RS-a:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    - LED0 (od Vcc do PB0) sygnalizuje transmisję wciągu ostatnich 100 ms na porcie szeregowym - to co zostało przysłane do µC na RXD, jest odsyłane na TXD (echo).
    - LED1 (od Vcc do PB1) miga 1Hz.
    - LED2 (od Vcc do PB2) miga 2,5Hz.
  • #16 9817757
    lone_wolf816
    Poziom 9  
    Niestety przy połączeniu anody z danym pinem i katody z GND nie ma żadnego efektu, próbowałem również diody podłączyć katodą do pinu wyjściowego a anodę do vcc i wtedy świecą się wszystkie. Przy kompilacji programu miałem błąd "No rule to make target `main.elf', needed by `elf'", który rozwiązałem kopiując do tego samego folderu już utworzony z poprzedniego programu plik.
  • #17 9818667
    LordBlick
    VIP Zasłużony dla elektroda
    Ja tu widzę problem z ogarnięciem środowiska, a nie procesora... Ładujesz inny program...
    Moje makefile, musisz sobie dopasować do ATmega32 i swojego zegara:
    ###############################################################################
    # Makefile for the project LED_Blink
    ###############################################################################
    
    ## General Flags
    PROJECT = LED_Blink
    
    #### MCU DEPENDEND ####
    # *** FUSES : 0->Programmed; 1->Unprogrammed ***
    
    # Clock Options (Crystal>8MHz):
    
    SPIEN=0
    EESAVE=0
    BOOTSZ=11
    BOOTRST=1
    
    F_CPU=11059200
    MCU = atmega8515
    S8515C=1
    WDTON=1
    CKOPT=0
    FUSE_H=0b${S8515C}${WDTON}${SPIEN}${CKOPT}${EESAVE}${BOOTSZ}${BOOTRST}
    CKSEL=1111
    
    # F_CPU=8000000
    # MCU = atmega16
    # OCDEN=1
    # JTAGEN=1
    # CKOPT=1
    # FUSE_H=0b${OCDEN}${JTAGEN}${SPIEN}${CKOPT}${EESAVE}${BOOTSZ}${BOOTRST}
    # CKSEL=0100
    
    # BODLEVEL(1->2.7V; 0->4.0V)
    BODLEVEL=1
    BODEN=0
    SUT=10
    FUSE_L=0b${BODLEVEL}${BODEN}${SUT}${CKSEL}
    #######################
    
    TARGET = $(PROJECT).elf
    CC = avr-gcc
    
    ## Options common to compile, link and assembly rules
    COMMON = -mmcu=$(MCU)
    
    ## Compile options common for all C compilation units.
    CFLAGS = $(COMMON)
    CFLAGS += -Wall -gdwarf-2 -std=gnu99
    CFLAGS += -DF_CPU=$(F_CPU)UL
    CFLAGS += -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
    CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d 
    
    ## Assembly specific flags
    ASMFLAGS = $(COMMON)
    ASMFLAGS += $(CFLAGS)
    ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2
    
    ## Linker flags
    LDFLAGS = $(COMMON)
    LDFLAGS +=  -Wl,-Map=$(PROJECT).map
    
    
    ## Intel Hex file production flags
    HEX_FLASH_FLAGS = -R .eeprom
    
    HEX_EEPROM_FLAGS = -j .eeprom
    HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
    HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings
    
    
    ## Include Directories
    INCLUDES = -I"." 
    
    ## Objects that must be built in order to link
    OBJECTS = $(PROJECT).o 
    
    ## Objects explicitly added by the user
    LINKONLYOBJECTS = 
    
    ## Programming
    # PROGRAMMER=bsd      PORT=/dev/parport0
    # PROGRAMMER=ponyser  PORT=/dev/ttyS1
    # PROGRAMMER=stk500   PORT=/dev/ttyS1
    # PROGRAMMER=usbasp   PORT=/dev/usb/ttyUSB0
    # PROGRAMMER=stk500v2 PORT=/dev/ttyUSB0
    PROGRAMMER=usbasp
    PORT=/dev/usbasp
    
    AVRD_FLAGS	= -c ${PROGRAMMER}
    AVRD_FLAGS	+= -p ${MCU}
    AVRD_FLAGS	+= -P ${PORT}
    AVRD_FLAGS	+= -v
    
    ## Build
    all: $(TARGET) $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss size
    
    ## Compile
    $(PROJECT).o: $(PROJECT).c
    	$(CC) $(INCLUDES) $(CFLAGS) -c  $<
    
    ##Link
    $(TARGET): $(OBJECTS)
    	 $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)
    
    %.hex: $(TARGET)
    	avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@
    
    %.eep: $(TARGET)
    	-avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0
    
    .PHONY: fuses
    fuses:
    	avrdude $(AVRD_FLAGS) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m
    
    .PHONY: showfuses
    showfuses:
    	avrdude $(AVRD_FLAGS) -U lfuse:r:-:b -U hfuse:r:-:b
    
    .PHONY: flash
    flash:  $(TARGET) $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss size
    	avrdude $(AVRD_FLAGS) -U flash:w:${PROJECT}.hex
    
    %.lss: $(TARGET)
    	avr-objdump -h -S $< > $@
    
    size: ${TARGET}
    	@echo
    	@avr-size -C --mcu=${MCU} ${TARGET}
    
    ## Clean target
    .PHONY: clean
    clean:
    	-rm -rf $(OBJECTS) $(PROJECT).elf dep $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss $(PROJECT).map *~
    
    
    ## Other dependencies
    -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
    

    BTW. oczywiście rezystor 470Ω z każdą LED w szeregu ?
  • #19 9819730
    LordBlick
    VIP Zasłużony dla elektroda
    Przecież nie musi używać tego LED-a do oświetlania pomieszczenia w którym przebywa, a i µC będzie mniej obciążony... ;)
  • #20 9820863
    lone_wolf816
    Poziom 9  
    Program testowy skompilowałem od nowa, wgrałem do uC jednak nie ma oczekiwanego efektu. Następnie próbowałem zmienić fuse bity na kwarc zewnętrzny 12MHz i zablokowałem procka albo już zupełnie przestał działać (spróbuję go jeszcze odblokować fusebit doktorem, którego muszę dopiero zmontować). Program testowy, który napisałem w bascomie wrzuciłem do atmegi8 i wszystko działa.
  • #21 9821202
    LordBlick
    VIP Zasłużony dla elektroda
    Zajrzałem do not katalogowych i ATmega32 ma tak samo fusebity jak ATmega16. Jak widać, wcześniejsze testy robiłem na ATmega8515/11,0592MHz. Teraz udało mi się dotrzeć do odpowiedniej szufladki i odpalić to samo pod ATmega32/11,0592MHz, w związku z czym gotowy Makefile, zawierający także ustawianie fusebitów pod USBasp i avrdude - polecenie make fuses :
    ###############################################################################
    # Makefile for the project LED_Blink
    ###############################################################################
    
    ## General Flags
    PROJECT = LED_Blink
    
    #### MCU DEPENDEND ####
    # *** FUSES : 0->Programmed; 1->Unprogrammed ***
    
    # Clock Options (Crystal>8MHz):
    
    SPIEN=0
    EESAVE=0
    BOOTSZ=11
    BOOTRST=1
    
    F_CPU=11059200
    # F_CPU=12000000
    
    # MCU = atmega8515
    # S8515C=1
    # WDTON=1
    # CKOPT=0
    # FUSE_H=0b${S8515C}${WDTON}${SPIEN}${CKOPT}${EESAVE}${BOOTSZ}${BOOTRST}
    CKSEL=1111
    
    # MCU = atmega16
    MCU = atmega32
    OCDEN=1
    JTAGEN=1
    CKOPT=1
    FUSE_H=0b${OCDEN}${JTAGEN}${SPIEN}${CKOPT}${EESAVE}${BOOTSZ}${BOOTRST}
    
    # BODLEVEL(1->2.7V; 0->4.0V)
    BODLEVEL=1
    BODEN=0
    SUT=10
    FUSE_L=0b${BODLEVEL}${BODEN}${SUT}${CKSEL}
    #######################
    
    TARGET = $(PROJECT).elf
    CC = avr-gcc
    
    ## Options common to compile, link and assembly rules
    COMMON = -mmcu=$(MCU)
    
    ## Compile options common for all C compilation units.
    CFLAGS = $(COMMON)
    CFLAGS += -Wall -gdwarf-2 -std=gnu99
    CFLAGS += -DF_CPU=$(F_CPU)UL
    CFLAGS += -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
    CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d 
    
    ## Assembly specific flags
    ASMFLAGS = $(COMMON)
    ASMFLAGS += $(CFLAGS)
    ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2
    
    ## Linker flags
    LDFLAGS = $(COMMON)
    LDFLAGS +=  -Wl,-Map=$(PROJECT).map
    
    
    ## Intel Hex file production flags
    HEX_FLASH_FLAGS = -R .eeprom
    
    HEX_EEPROM_FLAGS = -j .eeprom
    HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
    HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings
    
    
    ## Include Directories
    INCLUDES = -I"." 
    
    ## Objects that must be built in order to link
    OBJECTS = $(PROJECT).o 
    
    ## Objects explicitly added by the user
    LINKONLYOBJECTS = 
    
    ## Programming
    # PROGRAMMER=bsd      PORT=/dev/parport0
    # PROGRAMMER=ponyser  PORT=/dev/ttyS1
    # PROGRAMMER=stk500   PORT=/dev/ttyS1
    # PROGRAMMER=usbasp   PORT=/dev/usb/ttyUSB0
    # PROGRAMMER=stk500v2 PORT=/dev/ttyUSB0
    PROGRAMMER=usbasp
    PORT=/dev/usbasp
    
    AVRD_FLAGS	= -c ${PROGRAMMER}
    AVRD_FLAGS	+= -p ${MCU}
    AVRD_FLAGS	+= -P ${PORT}
    AVRD_FLAGS	+= -v
    
    ## Build
    all: $(TARGET) $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss size
    
    ## Compile
    $(PROJECT).o: $(PROJECT).c
    	$(CC) $(INCLUDES) $(CFLAGS) -c  $<
    
    ##Link
    $(TARGET): $(OBJECTS)
    	 $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET)
    
    %.hex: $(TARGET)
    	avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@
    
    %.eep: $(TARGET)
    	-avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0
    
    .PHONY: fuses
    fuses:
    	avrdude $(AVRD_FLAGS) -U hfuse:w:$(FUSE_H):m -U lfuse:w:$(FUSE_L):m
    
    .PHONY: showfuses
    showfuses:
    	avrdude $(AVRD_FLAGS) -U lfuse:r:-:b -U hfuse:r:-:b
    
    .PHONY: flash
    flash:  $(TARGET) $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss size
    	avrdude $(AVRD_FLAGS) -U flash:w:${PROJECT}.hex
    
    %.lss: $(TARGET)
    	avr-objdump -h -S $< > $@
    
    size: ${TARGET}
    	@echo
    	@avr-size -C --mcu=${MCU} ${TARGET}
    
    ## Clean target
    .PHONY: clean
    clean:
    	-rm -rf $(OBJECTS) $(PROJECT).elf dep $(PROJECT).hex $(PROJECT).eep $(PROJECT).lss $(PROJECT).map *~
    
    
    ## Other dependencies
    -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
    Na kwarcu do masy po 22pF, bo to nie dla każdego może się wydawać oczywiste. Jak nie zależy Tobie na sprawdzaniu USART na maksymalnej predkości, jaką wyciągam na mojej przejściówce USB-RS232 (PL2303), to możesz dać kwarc 12MHz (edycja Makefile) i zmniejszyć UART_BAUD (edycja w pliku ze źródłami).
    BTW. JTAG jest jak w w/w Makefile wyłączany (make fuses).
  • Pomocny post
    #22 9833032
    pancio
    Poziom 16  
    lone_wolf816 napisał:
    Witam.
    (...) Po zdjęciu folii zabezpieczającej z wyświetlacza zauważyłem w jednym miejscu jakby ubytek pikseli dlatego myślę, że jest on uszkodzony.


    Mam dwa takie wyświetlacze i oba mają podobny "defekt", nie przeszkadza to jednak w ich prawidłowym działaniu (w normalnych warunkach ten "defekt" przykryty jest ramką)

    lone_wolf816 napisał:

    Mam również problem z podświetleniem – nie mogę zapalić danego koloru (po zwarciu wspólnej anody z zasilaniem układu i próbą podania stanu wysokiego na daną katodę, załączają się 2 kolory jednocześnie).


    o ile pamiętam, to są tam zworki do zapalania poszczególnych (dwóch) kolorów. Nie radzę natomiast zasilać anody bezpośrednio z pinu uC (zbyt mały prąd)

    załączam przykładowy kod korzystający z biblioteki ze wskazanego przez Ciebie wątku.

    Pozdrawiam,
    Pancio
  • #23 9885010
    lone_wolf816
    Poziom 9  
    Problem wkońcu udało się rozwiązać. Wymieniłem uC i wrzuciłem program bez zmian. Wszystko idealnie działa. Dzięki wszystkim za pomoc.
REKLAMA