Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bascom - Obsługa rejestrów przesuwnych 595

DjDaniel11 21 Mar 2013 10:00 2733 16
  • #1 21 Mar 2013 10:00
    DjDaniel11
    Poziom 27  

    Witam.
    Ostatnimi czasy wymyśliłem pewien układ który ma za zadanie :
    - Wyprowadzenie 9 bitowej liczny na piny
    - Wyświetlenie tej liczby na wyświetlaczu 3cyfrowym 7segm.
    - Obsługa przycisków +, oraz - do zmiany tej liczby
    - Zapis po zmianie do pamięci eeprom, oraz odczyt z pamięci po uruchomieniu układu

    Jak na złość (lubię wszystko dobrze w życiu optymalizować) wybrałem procesor Attiny13. Wbrew pozorom do tego projektu jest idealny. Posiada wewnętrzne taktowanie 9,6Mhz , jest tani, mały, a posiada wiele możliwości.

    Przejdę jednak do problemu. Otóż kod zamieszczam poniżej. Całą noc siedziałem i kombinowałem co może być nie tak, zmieniając i sprawdzając. Jednak niestety nic nie udało mi się wymyślić. Proszę, może wy pomożecie? Mianowicie aktualnie liczby są wyświetlane :
    123 (w odbiciu lustrzanym i do góry nogami), 456 (jakieś krzaczki podobne do "A").
    Naciśnięcie któregoś przycisku powoduje wywalenie "krzaków" na wyświetlacz i zawieszenie procesora. Tego już w ogóle nie rozumiem, dlaczego tak się dzieje.
    Zamieszczam jeszcze schemat, aby każdy widział jak to fizycznie wygląda. Tylko wyświetlacz jest inny 3 cyfry połączone razem (LTD056ASR).

    Bascom - Obsługa rejestrów przesuwnych 595

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0 16
  • Pomocny post
    #2 21 Mar 2013 12:46
    30402
    Użytkownik usunął konto  
  • #3 23 Mar 2013 19:41
    DjDaniel11
    Poziom 27  

    1) Dopisałem, to pomogło. Właśnie przez to się procesor wieszał.
    2) To akurat jest dobrze, bo temp służy do obliczania dziesiątek i jedności.
    4) Można, jednak nigdy nie korzystałem z SPI, a to jest mój pierwszy samodzielnie pisany program.

    Problem jaki teraz mam to zmienna "Adres". Mianowicie jest ona jako "word" (16bitów). Niestety jednak układ wywala błąd po przekroczeniu adresu 8bitowego, 255. Do tej liczby wszystko działa tak jak powinno.
    I drugi już mniej ważny, ale jednak problem, to zapis do eeprom i odczyt zmiennej "Adres". Nie chce działać, ani odczyt, ani zapis. Nawet ręcznie wpisując do eeprom, nie odczytuje komórki.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #4 23 Mar 2013 23:59
    30402
    Użytkownik usunął konto  
  • #5 24 Mar 2013 02:51
    DjDaniel11
    Poziom 27  

    1) Zmieniłem na komórkę &B1001 i zapis jak i odczyt odbywa się poprawnie. Zarówno do tej komórki jak i następnej. (Zmienna typu word).
    3) Tylko po co dodatkowo tworzyć dwie zmienne? Dodam, że do wyświetlacza podział zmiennej word na bajtowe nie jest używany.
    4) Syf albo optymalizacja. Dając zmienne pomocnicze program działa tak samo.

    Problem nadal tkwi, że nie mogę wyświetlić liczby większej od 255 (mimo zmiennej WORD). Zmienna zapisywana jest do pierwszej pamięci komórki eeprom, aż osiągnie 255, po czym ta komórka przyjmuje wartość zero (i to jest wyświetlane) a druga komórka zawierająca ciąg dalszy zmiennej word przyjmuje wartość jeden. Próbowałem już chyba wszystkiego, jak wyświetlić całą liczbę word ale nie umiem. Proszę o pomoc.

    0
  • #6 24 Mar 2013 12:13
    30402
    Użytkownik usunął konto  
  • #7 24 Mar 2013 20:05
    DjDaniel11
    Poziom 27  

    Witam.
    Nie ma problemu z zapisem i odczytem eepromu. Ładnie składa do liczbę do zmiennej word. Jedyny problem to wyświetlenie tego. Z pomocą kolegi, udało się dojść w czym tkwi problem. Niestety nie da się tego zmienić ( za mało pamięci attiny13).
    Mianowicie należało dodać kolejną zmienną typu word (aby wykonywanie działań było na takich samych typach zmiennych).

    Ale i bez tego, układ działa jak powinien, bo na wyjściach 9bitów, podaje adres poprawnie do 512. Jedyny problem, że po przekroczeniu 255 wyświetlacz zaczyna od 0 pokazywać.

    PS: Kod w C zajął 2x więcej miejsca niż ten z bascoma..

    0
  • #8 24 Mar 2013 20:55
    30402
    Użytkownik usunął konto  
  • #9 24 Mar 2013 21:00
    DjDaniel11
    Poziom 27  

    1) Flash. Zrobiłem ze zmiennymi wyświetlacz tak jak mówiłeś. Że została jednak, i przed każdą cyfrą, podstawiam konkretną wartość za każdym razem do jednej tej samej zmiennej. Rezultat? Nic to nie dało, a jeśli dało, to mniej niż 1%.

    2) W c jeśli dobrze to zoptymalizujesz. Kolega napisał ten program w C i zajął 1016 bajtów. Kod (już z działającym wszystkim) z Bascoma 1105 bajtów.

    0
  • #11 24 Mar 2013 21:13
    DjDaniel11
    Poziom 27  

    Nie do końca rozumiem o czym mówisz. Chodzi Ci o kod z Bacoma czy z C?
    Jeśli z Bascoma to w ustawieniach programu mam wyłączoną optymalizację. Jednak po jej "włączeniu" nic się nie zmienia, nie zyskuję nawet jednego bajtu.

    0
  • #12 24 Mar 2013 21:35
    dondu
    Moderator Mikrokontrolery Projektowanie

    Napisałeś że program w C zajął 2x tyle pamięci co w BASSCOM. Pytam więc o to, jaką optymalizację masz włączoną w kompilatorze C: http://mikrokontrolery.blogspot.com/2011/04/bledy-kompilacji-programu.html

    EDIT:
    Chyb, że pisząc 2x miałeś na myśli kod źródłowy. Jeśli tak, to moje pytanie będzie inne.

    0
  • #13 24 Mar 2013 23:01
    DjDaniel11
    Poziom 27  

    Aktualnie mój kod w Bascomie wygląda tak : (zajmuje 97% pamięci)

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Co do optymalizacji kompilatora, to nie była żadna wybrana.

    0
  • #15 24 Mar 2013 23:18
    DjDaniel11
    Poziom 27  

    642 bajty :D kod w C, po optymalizacji "S" :)
    994 bajty kod w Bascomie :)

    0
  • #17 24 Mar 2013 23:29
    Vampir8
    Poziom 16  

    Witam.

    Poniżej kod w C. Rozbieżności wynikły z bardzo szybkiego pisania kodu, po głębszym przeglądnięciu i zmianie tego co możliwe kod zajmował o połowę mniej ale nie na tyle żeby zmieścić sie w uC (ok 115%). Fakt zmiana optymalizacji na Level 2 lub S daje najlepsze rezultaty czyli około 60% procesora po kompilacji.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Code:
    > "make.exe" all
    

    -------- 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 C: main.c
    avr-gcc -c -mmcu=attiny13 -I. -gstabs -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o

    Linking: main.elf
    avr-gcc -mmcu=attiny13 -I. -gstabs -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -Wundef -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref     -lm

    Creating load file for Flash: main.hex
    avr-objcopy -O ihex -R .eeprom main.elf main.hex

    Creating load file for EEPROM: main.eep
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
       --change-section-lma .eeprom=0 --no-change-warnings -O ihex main.elf main.eep || exit 0

    Creating Extended Listing: main.lss
    avr-objdump -h -S main.elf > main.lss

    Creating Symbol Table: main.sym
    avr-nm -n main.elf > main.sym

    Converting to AVR Extended COFF: main.cof
    avr-objcopy --debugging --change-section-address .data-0x800000 --change-section-address .bss-0x800000 --change-section-address .noinit-0x800000 --change-section-address .eeprom-0x810000 -O coff-ext-avr main.elf main.cof
    Discarding local symbol outside any compilation unit: .do_copy_data_start
    Discarding local symbol outside any compilation unit: .do_copy_data_loop
    Discarding local symbol outside any compilation unit: .do_clear_bss_start
    Discarding local symbol outside any compilation unit: .do_clear_bss_loop
    avr-objcopy: --change-section-vma .noinit+0xff800000 never used
    avr-objcopy: --change-section-lma .noinit+0xff800000 never used

    Size after:
    AVR Memory Usage
    ----------------
    Device: attiny13

    Program:     568 bytes (55.5% Full)
    (.text + .data + .bootloader)

    Data:         18 bytes (28.1% Full)
    (.data + .bss + .noinit)

    EEPROM:        2 bytes (3.1% Full)
    (.eeprom)



    -------- end --------


    > Process Exit Code: 0
    > Time Taken: 00:01


    Jeżeli jeszcze coś dało by się zmienić to z góry dziękuję za rady. C na uC od niedawna się uczę sam, a tak to miałem tylko do czynienia z Delphi na PC.
    Pozdrawiam.

    0