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

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

Lesiomariu 04 Mar 2015 22:45 1242 7
REKLAMA
  • #1 14501302
    Lesiomariu
    Poziom 9  
    Posty: 37
    Ocena: 3
    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 / 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]
  • REKLAMA
  • Pomocny post
    #2 14501430
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    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.
  • REKLAMA
  • #3 14503683
    Lesiomariu
    Poziom 9  
    Posty: 37
    Ocena: 3
    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 / 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.
  • Pomocny post
    #4 14504002
    Wojtek75
    Poziom 25  
    Posty: 531
    Pomógł: 91
    Ocena: 36
    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.
  • REKLAMA
  • #5 14504181
    Lesiomariu
    Poziom 9  
    Posty: 37
    Ocena: 3
    Dostrajanie ma przebiegać już w kodzie, na samym początku zaraz po zaimportowaniu bibliotek ?
  • REKLAMA
  • Pomocny post
    #6 14504378
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    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 / C++
    Zaloguj się, aby zobaczyć kod
  • #7 14504613
    Lesiomariu
    Poziom 9  
    Posty: 37
    Ocena: 3
    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 / C++
    Zaloguj się, aby zobaczyć kod


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


    Przez noc postaram się naczytać o tym jak ustawić rejestr OSCCAL, dzięki za pomoc.
  • #8 14506945
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    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.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukiwał pomocy w przeniesieniu kodu z mikrokontrolera ATmega8 na ATtiny13, zwracając uwagę na problemy z konfiguracją timerów. Otrzymał wskazówki dotyczące zmiany nazw wektorów przerwań oraz rejestrów konfiguracyjnych timerów. Po skompilowaniu kodu napotkał trudności z ustawieniem częstotliwości zegara, ponieważ ATtiny13 domyślnie działa z niższą częstotliwością. Użytkownicy zasugerowali wyłączenie bitu CKDIV8 w fusebitach, co pozwoliłoby na uzyskanie wyższej częstotliwości. Dyskusja obejmowała również ustawienia rejestru OSCCAL oraz różnice w konfiguracji między ATmega8 a ATtiny13.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA