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

Atmega8>attiny13 - Potrzebne wsparcie z przeniesieniem kodu między uC.

Lesiomariu 04 Mar 2015 22:45 906 7
  • #1 04 Mar 2015 22:45
    Lesiomariu
    Poziom 9  

    Witam.
    Potrzebuję pomocy z dostosowaniem kodu napisanego na atmegę8 na attiny13. Domyślam się że największym problemem będą tutaj timery, ale jestem w ich temacie puki co zielony, a potrzebuję koniecznie(i niestety pilnie) odbiornika IR który zmieści się i będzie działał na attiny13. Jak całość kodu działa rozumiem(jest świetnie opisana komentarzami) i nieco już zmodyfikowałem bawiąc się nim nieco na atmedze8, lecz tutaj wkleję oryginalny kod.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zaznaczę jeszcze że:
    -Wiem że należy zmodyfikować plik makefile i to zrobiłem.
    -Zdaję sobie sprawę że główna pętla tego kodu jest niewykonalna na attiny13 z powodu zbyt małej ilości wyprowadzeń, ale proszę się nią nie przejmować, gdyż w docelowym kodzie zamiast wyświetlania na 7 diodach wyniku, będzie przy pomocy switch case zrobione podawanie odpowiednich stanów na 4 nóżki uC. W skrócie główną funkcją proszę się nie przejmować.
    -Zdaję sobie sprawę że muszę zmienić częstotliwość attiny13 z oryginalnych 16MHz na 8MHz, lub odpowiednio zmodyfikować przerwania.
    -Tak wygląda błąd podczas kompilacji w Programmer's Notepad:
    Spoiler:

    Compiling C: main.c
    avr-gcc -c -mmcu=attiny13 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o
    main.c:34: warning: function declaration isn't a prototype
    main.c: In function 'init_rc5':
    main.c:36: error: 'TCCR0' undeclared (first use in this function)
    main.c:36: error: (Each undeclared identifier is reported only once
    main.c:36: error: for each function it appears in.)
    main.c:37: error: 'TIMSK' undeclared (first use in this function)
    main.c: At top level:
    main.c:51: warning: 'TIMER0_OVF_vect' appears to be a misspelled signal handler
    main.c:67: warning: function declaration isn't a prototype
    make.exe: *** [main.o] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:00


    Z góry dziękuję za pomoc, ale i proszę o nie pisanie "naucz się jak się obsługuje timery, a potem kombinuj". Wiem że mam to zrobić i obiecuję że gdy tylko będę mógł nadrobię tę zaległość by w przyszłości nie prosić o pomoc, a móc jej nawet udzielić.[/code]

    1 7
  • Zasilacze Ups
  • Pomocny post
    #2 04 Mar 2015 23:27
    gaskoin
    Poziom 38  

    Wg http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html musisz zmienić nazwę wektora przerwań na TIM0_OVF_vect

    Porównaj sobie datasheet attiny13 z datasheetem atmegi8 żeby skonfigurować timery. Do skonfigurowania timera w attiny służą rejestry TCCR0A i TCCR0B, w atmedze8 jest tylko TCCR0
    http://www.atmel.com/images/doc2535.pdf
    http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf

    Co do timsk - jak wyżej. W attiny jest TIMSK0 a w atmedze TIMSK, również zobacz szczegóły w datasheecie.

    2
  • Zasilacze Ups
  • #3 05 Mar 2015 20:01
    Lesiomariu
    Poziom 9  

    Dziękuję @gaskoin. Udało mi się skompilować kod.

    Jednak wystąpił kolejny problem, którego się całkowicie nie spodziewałem. W atmedze8 przy pomocy AVR Burn-o-mat'u, mogłem w ostatniej zakładce fusebitów (oscillator/clockoptions) bez problemu wybrać częstotliwość od 1 do 8MHz. W attiny13 w tej zakładce wyświetla się jedynie "not supported for selected MCU". I piękny plan zmiany taktowania aby nie zmieniać dalej kodu legł w gruzach.

    Czy jest jakiś w miarę prosty sposób by ustalić taktowanie Attiny13 na 8MHz, czy już lepiej dopasować kod do 16MHz ?

    Dodam jeszcze że coś jest nie tak chyba z moim układem. Jako że pierwszy raz używam tiny13, napisałem szczątkowy kod który miałby migać diodą, tak żeby zobaczyć czy układ "żyje".

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Możliwie najprostszy kod, który miał zmieniać stan diody led co 1sekundę. Stan diody zmienia się jednak co ponad 10 sekund. Zarówno w kodzie jak i makefile ustawiłem że taktowanie to 16 000 000 Hz. Domyślam się że jest ono jednak wielokrotnie mniejsze.

    EDIT:
    Zajrzałem do datasheetu i wyczytałem że domyślnie zintegrowany oscylator generuje 128kHz. Problem więc już znam, nie do końca rozumiem jak go rozwiązać, tj jak ustawić preskaler, tak by układ pracował mnie w interesującej mnie częstotliwości 8MHz, jeśli to w ogóle możliwe.

    0
  • Pomocny post
    #4 05 Mar 2015 20:59
    Wojtek75
    Poziom 23  

    Domyślnie fabrycznie nowy tiny13 pracuje z zegarem coś około ~1,2 MHz. Jak w fuse wyłączysz bit CKDIV8 (podział przez osiem) to uzyskasz coś około 9,6MHz. Modyfikując wartość rejestru OSCCAL możesz tą wartość jeszcze dokładniej dostroić. Szczegóły w datasheet.

    1
  • #5 05 Mar 2015 21:34
    Lesiomariu
    Poziom 9  

    Dostrajanie ma przebiegać już w kodzie, na samym początku zaraz po zaimportowaniu bibliotek ?

    0
  • Pomocny post
    #6 05 Mar 2015 22:10
    BlueDraco
    Specjalista - Mikrokontrolery

    W kodzie nie "importuje się bibliotek", więc nie bardzo rozumiem, o czym piszesz.
    Ja np. ustawiam (tzn. ustawiałem 5 lat temu, kiedy jeszcze używałem AVR) konfigurację ATtiny13 tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 05 Mar 2015 22:57
    Lesiomariu
    Poziom 9  

    BlueDraco napisał:
    W kodzie nie "importuje się bibliotek", więc nie bardzo rozumiem, o czym piszesz.
    Ja np. ustawiam (tzn. ustawiałem 5 lat temu, kiedy jeszcze używałem AVR) konfigurację ATtiny13 tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Poprzez importowanie bibliotek rozumiałem to:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przez noc postaram się naczytać o tym jak ustawić rejestr OSCCAL, dzięki za pomoc.

    0
  • #8 06 Mar 2015 20:40
    BlueDraco
    Specjalista - Mikrokontrolery

    To jest włączenie plików nagłówkowych, które nie "importuje" żadnych "bibliotek". Rejestru OSCCAL nie musisz ustawiać - powinien on być fabrycznie zaprogramowany tak, żeby dać właściwą częstotliwość zegara.

    0