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

[Atmega32] Błąd w asemblerze przy obsłudze TV - jak naprawić?

Janadamis 13 Lut 2013 22:33 3099 21
  • #1 11931596
    Janadamis
    Poziom 14  
    Witam
    Jako że niestety spaliła mi się karta teleVGA postanowiłem wy myśleć inne rozwiązanie na obsługę TV lub monitora.
    Na elektrodzie było sporo tematów jak podłączyć telewizor bądź monitor pod mikroprocesor. Jedne z wykorzystaniem karty graficznej od PC ale niestety nikomu się chyba nie udało
    Ja znalazłem taki właśnie projekt na atmega 168 niestety posiadam tylko atmega32 więc muszę przerobić biblioteki. Niestety błąd jest w wstawce asm. Ja jestem zielony z języka asemblera dlatego proszę was o pomoc.
    Wyskakuje mi taki błąd
    
    **** Build of configuration Release for project 58_obsluga_TV_v1 ****
    
    make all 
    Building file: ../tvtext/driver.s
    Invoking: AVR Assembler
    avr-gcc -x assembler-with-cpp -mmcu=atmega32 -MMD -MP -MF"tvtext/driver.d" -MT"tvtext/driver.d" -c -o"tvtext/driver.o" "../tvtext/driver.s"
    ../tvtext/driver.s: Assembler messages:
    ../tvtext/driver.s:70: Error: constant value required
    ../tvtext/driver.s:70: Error: number must be positive and less than 32
    make: *** [tvtext/driver.o] Error 1
    

    A dotyczy on linijki
    Kod: text
    Zaloguj się, aby zobaczyć kod

    w pliku driver.s
    Załączam częściową zawartość tej biblioteki

    driver.s
    Kod: text
    Zaloguj się, aby zobaczyć kod


    tvtext.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Więcej plików nie jest potrzebne, a jest ich w sumie 28plików. Tylko w tych 2 plikach jak coś jest ustawianie timera ponieważ domyślam sie ze kłopot jest w ustawieniu timera. Sprawdziłem te rejestry ale są dobre dla atmegi 32 w czym jest błąd??
    Źródło projektu: http://benryves.com/products/avrtvgame
    Tam jest możliwość pobrania wszystkich plików.

    A czy ktoś już próbował wykorzystać te biblioteki?
    Bardzo proszę o pomoc w rozwiązaniu tego błędu. Będę bardzo wdzięczny
  • #2 11931689
    2rs232
    Poziom 18  
    Atmega32 ma rejestr TIFR, czyli usuń "1".

    Kod: text
    Zaloguj się, aby zobaczyć kod


    ; TIFR - Timer/Counter Interrupt Flag register
    .equ TOV1 = 2 ; Timer/Counter1 Overflow Flag
    .equ OCF1B = 3 ; Output Compare Flag 1B
    .equ OCF1A = 4 ; Output Compare Flag 1A
    .equ ICF1 = 5 ; Input Capture Flag 1

    edit.
    Jeszcze TIMSK zamiast TIMSK1

    ; TIMSK - Timer/Counter Interrupt Mask Register
    .equ TOIE1 = 2 ; Timer/Counter1 Overflow Interrupt Enable
    .equ OCIE1B = 3 ; Timer/Counter1 Output CompareB Match Interrupt Enable
    .equ OCIE1A = 4 ; Timer/Counter1 Output CompareA Match Interrupt Enable
    .equ TICIE1 = 5 ; Timer/Counter1 Input Capture Interrupt Enable
  • #3 11932592
    Janadamis
    Poziom 14  
    Teraz wyświetla taki błąd
    
    **** Build of configuration Release for project 58_obsluga_TV_v1 ****
    
    make all 
    Building file: ../tvtext/tvtext.c
    Invoking: AVR Compiler
    avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=20000000UL -MMD -MP -MF"tvtext/tvtext.d" -MT"tvtext/tvtext.d" -c -o"tvtext/tvtext.o" "../tvtext/tvtext.c"
    ../tvtext/tvtext.c: In function 'tvtext_init':
    ../tvtext/tvtext.c:35: error: 'OCIE1' undeclared (first use in this function)
    ../tvtext/tvtext.c:35: error: (Each undeclared identifier is reported only once
    ../tvtext/tvtext.c:35: error: for each function it appears in.)
    make: *** [tvtext/tvtext.o] Error 1
    

    A podkreśla mi linijkę
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Naprawdę warto to przerobić na atmega32 bo znalazłem na tamtej stronie opis jak używać poszczególnych funkcji ! tego chyba nigdzie nie opisują.
    Proszę o pomoc
    Sama obsługa wysyłania sygnału zajmuje tylko 4 pliki
  • #4 11932728
    2rs232
    Poziom 18  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 11932856
    Janadamis
    Poziom 14  
    Teraz wyświetla taki błąd
    
     Building file: ../tvtext/driver.s
    Invoking: AVR Assembler
    avr-gcc -x assembler-with-cpp -mmcu=atmega32 -MMD -MP -MF"tvtext/driver.d" -MT"tvtext/driver.d" -c -o"tvtext/driver.o" "../tvtext/driver.s"
    ../tvtext/driver.s: Assembler messages:
    ../tvtext/driver.s:70: Error: number must be positive and less than 32
    make: *** [tvtext/driver.o] Error 1
    


    Przy tej poprzedniej linijce :(
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 15 [minuty]:

    Gdy skomentowałem linie
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    w pliku tvtext.c to błąd zniknął ale gdy spowrotem od komentowałem tą
    linijkę
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    To błąd wyskoczył ale inny
    Building target: 58_obsluga_TV_v1.elf
    Invoking: AVR C Linker
    avr-gcc -Wl,-Map,58_obsluga_TV_v1.map -mmcu=atmega32 -o"58_obsluga_TV_v1.elf"  ./delay.o ./level.o ./main.o ./number.o ./options.o ./rectangle.o ./scroll.o ./snake.o ./tetris.o  ./tvtext/driver.o ./tvtext/tvtext.o   
    ./tvtext/tvtext.o: In function `tvtext_init':
    tvtext.c:(.text+0x74c): undefined reference to `tvtext_driver_init'
    make: *** [58_obsluga_TV_v1.elf] Error 1

    Kurde chyba nic z tego nie będzie :( :(
  • #6 11932982
    2rs232
    Poziom 18  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Masz tu zmienione TIMSK1 na TIMSK?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 11933214
    Janadamis
    Poziom 14  
    Ok podmieniłem. Nie pokazuje żadnych błędów. Po sprawdzałem w innych plikach czy nie ma czegoś jeszcze do przeróbki i nic nie wykryłem. Jednak gdy miałem zamiar wgrywać do uC niestety nie mogłem znaleźć kwarcu 20Mhz :( Jako że aktualnie nie mam możliwości kupienia go muszę odłożyć ten projekt na tydzień. Chyba że by się dało przerobić timer na kwarc 27Mhz bo taki udało mi się znaleźć. A atmega32 spokojnie na nim pójdzie.
    Szkoda ale co poradzić za ponad tydzień dam znak czy udało mi się ożywić TV. Możliwe że kupie atmege 168 i tak jak jest oryginalnie wgram tak jak ma być.
    2rs232- Wielkie dzięki z pomoc

    Dodano po 6 [minuty]:

    Edit:
    Gdy zmieniłem TIMSK na ten twój to wyskoczył błąd
    Building file: ../tvtext/tvtext.c
    Invoking: AVR Compiler
    avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=27000000UL -MMD -MP -MF"tvtext/tvtext.d" -MT"tvtext/tvtext.d" -c -o"tvtext/tvtext.o" "../tvtext/tvtext.c"
    ../tvtext/tvtext.c: In function 'tvtext_init':
    ../tvtext/tvtext.c:35: error: 'OCIE1' undeclared (first use in this function)
    ../tvtext/tvtext.c:35: error: (Each undeclared identifier is reported only once
    ../tvtext/tvtext.c:35: error: for each function it appears in.)
    make: *** [tvtext/tvtext.o] Error 1

    A podkreśla linijkę
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Chyba się nie uda :(
    Trzeba to jednak zrobić oryginalnie na atmega168 :(
  • #8 11933254
    2rs232
    Poziom 18  
    Sorry za błąd, powinno być

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    .
  • #9 11933260
    tmf
    VIP Zasłużony dla elektroda
    Albo zrobić na XMEGA, co nie wymaga kombinowania w asemblerze, można to napisać w czystym C. Masz 32 MHz bez przetaktowywania, czyli pewne działanie, + DMA, dzięki czemu procek praktycznie sprzętowo generuje obraz, więc może albo spać, albo robić inne pożyteczne rzeczy. Cały kod generacji obrazu to jakieś 20 linii.
  • #10 11933367
    Janadamis
    Poziom 14  
    2rs232- ok wielkie dzięki jak tylko zdobędę kwarc to sprawdzę.
    Na xmega hmm a jaki polecasz do tego celu jaki uC?
    I czy go się normalnie programuje jak zwykłe atmegi czy jakoś inaczej?
    Skoro na xmega to tak mało zajmie to dało by się dorobić aby obraz był w RGB?
    Można było by tak zrobić tylko ja niestety tego nie zrobię :(
    Ja miałem zamiar uruchomić ten projekt na atmega 168 i za pomocą uarta przesyłać do niego dane co ma wyświetlić. Ale zastosowanie xmega podoba mi się.
    tmf- a tak w ogóle to skąd wiesz że ok 20 linijek kodu to zajmuje?
  • #11 11933443
    tmf
    VIP Zasłużony dla elektroda
    Od końca - wiem, bo napisałem obsługę TV na XMEGA :)
    Dałoby się zrobić RGB, jedynym problemem jest pamięć - taki obraz zajmuje jej naprawdę dużo (robiłem 320x200/256 kolorów, 64000 bajtów). Wymaga to więc dodania modułu pamięci, a to już się robi powoli skomplikowane elektrycznie - chociaż akurat dodanie do XMEGA zewnętrznego SRAM nie jest trudne, bo można skorzystać z wewnętrznych latchy, więc jest prościej niż na ATMega64/128. Można trochę mniej poszaleć z kolorami i wtedy wystarczy jakaś XMEGA z 16/32 kB SRAM. Robiłem to na XMEGA128A1 (8 kB SRAM obraz mono), na XMEGA256A3BU i na XMEGA 128A1 z zewnętrzną pamięcią SDRAM (8 MB) - niestety SDRAM jest wolny (a raczej wolny jest interfejs EBI XMEGA i trzeba sztuczek i przetaktowywania EBI, na 100 MHz działa ładnie, full color). A programuje się prosto - kupujesz XMEGA z literką U na końcu - ma interfejs USB i wgrany bootloader. Ściągasz darmowy program FLIP ze strony Atmela i żaden programator nie jest potrzebny - po prostu łączysz dwa piny USB i zasilanie z gniazdkiem USB i to wszystko. Wkrótce na stronie http://mikrokontrolery.blogspot.com pokażę jak to zrobić - czekam na moduły XMEGA->DIP do płytki stykowej, które może będę miał w przyszłym tygodniu.
    XMEGA programuje się jak zwykłe ATMegi - to samo środowisko, ten sam toolchain. Wygodniejszy opis rejestrów.
    BTW, taki gość (nick atomiczombie) zrobił na XTMEGA384 generator obrazu TV kolorowego w systemie NTSC - https://www.youtube.com/watch?v=CXFOTpM2Jn4
    Można od niego kupić gotowe zestawy i dostać kod - ponieważ generuje on color bursty dla NTSC więc kod jest trochę zakręcony i wymaga asemblera, ale całe API zbudował tak, aby działało w C.
  • #12 11934994
    Janadamis
    Poziom 14  
    Aha.
    Znalazłem na takiej stronie
    http://www.batsocks.co.uk/products/Other/TellyMate.htm#nogo
    kolejne rozwiązanie tym razem na atmega8 16Mhz a taką akurat posiadam i taki kwarc też.
    Pobrałem ten pliki wgrałem do eclipse i prawie komplikacja przebiegła pomyślnie ale niestety wywalił błąd. wnioskuje ze coś z winavr się stało
    Building target: 59_obsluga_TV_v2.elf
    Invoking: AVR C Linker
    avr-gcc -Wl,-Map,59_obsluga_TV_v2.map -mmcu=atmega8 -o"59_obsluga_TV_v2.elf"  ./font.o ./main.o ./video.o ./video_render.o ./video_serial.o ./video_sync.o   
    c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: section .font [00000e16 -> 00001715] overlaps section .data [00000e16 -> 00000e1d]
    make: *** [59_obsluga_TV_v2.elf] Error 1
    

    Jak myślicie co to może być za przyczyna?
  • #13 11935311
    zumek
    Poziom 39  
    Janadamis napisał:

    Jak myślicie co to może być za przyczyna?

    Przecież w ostrzeżeniu wyraźnie pisze, że linker się "zbiesił" ponieważ:
    section .font [00000e16 -> 00001715] overlaps section .data [00000e16 -> 00000e1d]
  • #14 11935959
    Janadamis
    Poziom 14  
    Aha
    Tylko nie za bardzo rozumiem jak mam to naprawić?
  • #15 11936864
    tmf
    VIP Zasłużony dla elektroda
    Janadamis napisał:
    Aha.
    Znalazłem na takiej stronie
    http://www.batsocks.co.uk/products/Other/TellyMate.htm#nogo
    kolejne rozwiązanie tym razem na atmega8 16Mhz a taką akurat posiadam i taki kwarc też.
    Pobrałem ten pliki wgrałem do eclipse i prawie komplikacja przebiegła pomyślnie ale niestety wywalił błąd. wnioskuje ze coś z winavr się stało
    Building target: 59_obsluga_TV_v2.elf
    Invoking: AVR C Linker
    avr-gcc -Wl,-Map,59_obsluga_TV_v2.map -mmcu=atmega8 -o"59_obsluga_TV_v2.elf"  ./font.o ./main.o ./video.o ./video_render.o ./video_serial.o ./video_sync.o   
    c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: section .font [00000e16 -> 00001715] overlaps section .data [00000e16 -> 00000e1d]
    make: *** [59_obsluga_TV_v2.elf] Error 1
    

    Jak myślicie co to może być za przyczyna?


    To tych paczek masz makefile, więc nie wgrywaj tego do eclipse, tylko skompiluj używając dostarczonego makefile.
  • #16 11960126
    Janadamis
    Poziom 14  
    Mi nie działa. Może coś źle zrobiłem, nie wiem.
    Ale mam takie pytanie szukałem po internecie i nie mogę znaleźć przejrzystego wyjaśnienia i wykresu z czasami jak wygląda taka ramka do VGA. Żeby było opisane z jaką częstotliwością wysyłać te ramki i stany na poszczególnych pinach.
    Bo chciałbym podjąć się tego zrobienia
    tmf- a czy udostępniłeś gdzieś ten projekt na atxmega->VGA?
    Bo chciałbym sobie go przeglądnąć.
  • #17 11961314
    tmf
    VIP Zasłużony dla elektroda
    Czasy zależą częściowo od rozdzielczości, niemniej dla standardowego VGA bez problemu znajdziesz. Co do kodów - będą dodane do książki o XMEGA (też do ściągnięcia za free tak jak przy porzedniej), niemniej przed wydaniem nie mogę ich udostępnić. Ale jeśli masz problem, albo coś konkretnego to pisz, chociażby na PW to pomogę.
  • #18 11972924
    Janadamis
    Poziom 14  
    Właśnie oto chodzi że nie mogę znaleźć przejrzystego opisu co po kolei ma być wysyłane do TV. Te opisy co znalazłem są ogólnie napisane a nie szczególne.
  • #20 11973134
    Janadamis
    Poziom 14  
    Jak to 2 różne sprawy?
    Przecież w TV mam złącze VGA. Więc zamierzam generować sygnał vga który będę oglądał na TV.
  • #21 11973650
    tmf
    VIP Zasłużony dla elektroda
    Chodzi o standardy. VGA ma inny standard wysyłania danych niż TV. Jeśli podłączysz do TV przez wejście VGA to będzie to VGA. Zastanó się jeszcze na jakim MCU chcesz to zrobić? Na ATMega32 co wymaga trochę assemblera i przetaktowania MCU, czy na XMEGA?
    Co do standardu VGA nawet na wiki masz wszystkie potrzebne informacje:
    http://en.wikipedia.org/wiki/Video_Graphics_Array
  • #22 11974916
    Janadamis
    Poziom 14  
    Skoro mówisz że na Atxmega to zajęło 20linijek kodu. No to zrobię to na atxmega jednak niestety nie wiem jak pisze się programy na te xmegi i jak to ma mniej więcej działać.
    Pisałeś że masz to właśnie wydać i za free do ściągnięcia, więc kiedy to nastąpi?
REKLAMA