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.

ATmega8 (C) generator 1 KHz

Andrzej Ł 12 Mar 2018 15:55 510 6
  • #1 12 Mar 2018 15:55
    Andrzej Ł
    Poziom 21  

    potrzebuję zrobić generator na Timer 1 w ATmega 8 1kHz prostokąt.

    Proszę o sprawdzenie kodu czy może to działać .

    Siedzę nad pdf atmegi ,przeglądam konfigurację i opisy i nie bardzo rozumiem.

    Taktowanie wewnętrzne 1Mhz /preskaler =8/ 125 = powinno wyjść 1kHz
    ,pożniej jeszcze modyfikacja aby można było przełaczyc na 500 i 250 Hz.

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Kod: c
    Zaloguj się, aby zobaczyć kod


    I jeszcze jedno:
    wykonuję ćwiczenia z książki P.Mirka Kardasia , ale przy kompilacji wywala zawsze takie błędy w konsoli,nawet jak wytnę i wkleję gotowca do programu:
    Code:

    15:44:27 **** Incremental Build of configuration Release for project Tester Wtryskiwaczy ****
    make all
    'Building file: ../main.c'
    'Invoking: AVR Compiler'
    avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=1000UL -MMD -MP -MF"main.d" -MT"main.o" -c -o "main.o" "../main.c"
    ../main.c:16:2: error: expected identifier or '(' before 'volatile'
    ../main.c:16:2: error: expected ')' before '(' token
    ../main.c:18:2: error: expected identifier or '(' before 'volatile'
    ../main.c:18:2: error: expected ')' before '(' token
    ../main.c:19:2: error: expected identifier or '(' before 'volatile'
    ../main.c:19:2: error: expected ')' before '(' token
    ../main.c:20:2: error: expected identifier or '(' before 'volatile'
    ../main.c:20:2: error: expected ')' before '(' token
    ../main.c:21:2: error: expected identifier or '(' before 'volatile'
    ../main.c:21:2: error: expected ')' before '(' token
    ../main.c:22:2: error: expected identifier or '(' before 'volatile'
    ../main.c:22:2: error: expected ')' before '(' token
    ../main.c: In function 'main':
    ../main.c:28:9: error: expected declaration specifiers or '...' before '*' token
    make: *** [main.o] Error 1
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 6
  • #2 12 Mar 2018 16:43
    excray
    Poziom 39  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nie musisz uruchamiać przerwania bo licznik sam będzie machać nogą z częstotliwością 1kHz

    0
  • #3 12 Mar 2018 16:45
    pawel1029384756
    Poziom 20  

    W języku c wszystkie instrukcje poza deklaracjami i definicjami muszą się znajdować w jakiejś funkcji, a u Ciebie są tak luzem, i pewnie dla tego te błędy. Kolejny błąd pojawia się z powodu braku średnika na końcu pierwszej linii w funkcji main().
    Mając taktowanie o wartości 1MHz musimy je podzielić przez 1000 aby uzyskać 1 kHz, jak ustawisz preskaler na 8 a następnie będziesz (do przepełnienia licznika) zliczać 125 impulsów to taki podział uzyskasz. Więc do OCR1A musisz załadować wartość 256-125 = 131 jako wartość początkową. W tedy gdy zliczy 125 impulsów to się przepełni i nastąpi przerwanie.

    0
  • #4 12 Mar 2018 20:50
    Artyliusz
    Poziom 11  

    Tak jak kolega wyżej wspomniał najpierw umieść wszystko co w obecnym kodzie masz między "#define", a "mainem" właśnie w funkcji main(void) tak jak w przykładzie @excray. Później musisz jeszcze zagnieździć w funkcji main główną pętlę progamu while(1), w której właśnie będzie zmieniał się stan diody - w innym wypadku stan zmieni się tylko raz. Potem dopiero po takim uporządkowaniu można zobaczyć co jest nie tak z Twoim kodem w sensie merytorycznym.

    0
  • #5 13 Mar 2018 11:18
    Andrzej Ł
    Poziom 21  

    ok,dziękuję sprawdzę

    tak teraz wpisałem, to co zalecił excray, rozumiem że tutaj zalecił preskaler =1 (ze wzoru 1mhz/2/1-preskaler/500=1 khz)
    A czemu kolega używa TCCR1B ,czy nie można używać opcji z TCCR1A (wedle pdf CS00=1 dla preskaler =1),tzn czy :
    TCCR1B |= (1<<WGM12) | (1<<CS10) nie mogło by być :
    TCCR1A |=(1<<WGM12) | (1<<CS00)


    czy są pdfy po polsku lub po niemiecku ?



    teraz pokazuje taki błąd>


    /*

    Kod: c
    Zaloguj się, aby zobaczyć kod





    Code:
    17:40:56 **** Incremental Build of configuration Release for project Tester Wtryskiwaczy ****
    
    make all
    'Building file: ../main.c'
    'Invoking: AVR Compiler'
    avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=1000UL -MMD -MP -MF"main.d" -MT"main.o" -c -o "main.o" "../main.c"
    'Finished building: ../main.c'
    ' '
    'Building target: Tester Wtryskiwaczy.elf'
    'Invoking: AVR C Linker'
    avr-gcc -Wl,-Map,Tester Wtryskiwaczy.map -mmcu=atmega8 -o "Tester Wtryskiwaczy.elf"  ./main.o   
    avr-gcc: error: Wtryskiwaczy.map: No such file or directory
    make: *** [Tester Wtryskiwaczy.elf] Error 1
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 15 Mar 2018 00:15
    Artyliusz
    Poziom 11  

    Andrzej Ł napisał:
    A czemu kolega używa TCCR1B ,czy nie można używać opcji z TCCR1A (wedle pdf CS00=1 dla preskaler =1),tzn czy :
    TCCR1B |= (1<<WGM12) | (1<<CS10) nie mogło by być :
    TCCR1A |=(1<<WGM12) | (1<<CS00)


    Nie mogło by być tak, ponieważ w rejestrze TCCR1A nie ma bitów WGM12 oraz CS00. A w ogóle bit CS00 przynależy do Timera0.
    Tutaj masz tabelkę jakie bity znajdują się w rejestrach TCCR1A oraz TCCR1B ze strony noty katalogowej Atmegi8A pt. Register Summary:
    ATmega8 (C) generator 1 KHz
    Szczegóły dotyczące rejestru TCCR1A znajdziesz na stronie 132 a TCCR1B na stronie 135 noty katalogowej tego procka. Pomimo, że przynależą oba rejestry do Timera1, który jest 16-bitowy to tworzą dwa oddzielnie 8-bitowe rejestry (bo taka jest długość słowa w tym uC) i nie można ustawiać bitów w jednym rejestrze będące bitami drugiego rejestru.

    Mnie się Twój kod poprawnie skompilował (chociaż jest błąd przy #define - nie powinno być na końcu średnika). Używam Eclipse z AVR Toolchian, który chyba oparty jest na WinAVR. Widocznie masz źle skonfigurowany.

    0
  • #7 15 Mar 2018 06:07
    km__
    Poziom 12  

    avr-gcc niezbyt lubi pliki ze spacjami. Przy

    Andrzej Ł napisał:
    'Building target: Tester Wtryskiwaczy.elf'

    kompilator sam dodał spację, ale już przy:
    Andrzej Ł napisał:
    avr-gcc: error: Wtryskiwaczy.map: No such file or directory

    usunął pierwszy człon i zostało samo wtryskiwaczy. ;)

    0