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

Konwersja programu z Atmega16 >> Atmega8. Nadajnik

18 Wrz 2007 13:37 1503 2
  • Poziom 10  
    Witam. Pewnie zabrzmi to głupio aczkolwiek lubię się upewnić czy pewne rzeczy robię dobrze czy też źle. Jako iż nie dysponuję w tym momencie pod ręką programatorem to nawet nie mogę sprawdzić czy dobrze piszę czy nie.


    Rozchodzi się o zmianę programu napisanego na Atmegę16 tak aby pasował do Atmegi8. Jest to nadajnik podczerwieni o określonej częstotliwości sterowany wewnętrznym zegarem mikrokontrolera.

    Kod "wyjściowy" dla Atmegi16 znajduje się na http://www.lutecki.republika.pl/Timers1.html

    Od autora kodu dowiedziałem się iż powinien on działać po lekkiej modyfikacji
    - dodać zmienną z częst. proc. - unsigned long xtal=16000000;
    - zmienić numer pinu nóżki na której jest wyjście generatora (w notach oznaczone jako OC1A, OC2 itp.).
    - timer0_gen(36000); (dla 36k Hz, 38000 dla 38k Hz).

    Autor tego kodu napisał mi też coś takiego:

    Cytat:

    Pozdrowienia i powodzenia w eksperymentach. i procesorach można uzyskać bez problemu 36 kHz.nić numer pinu nóżki na której jest wyjście generatora w nocie ozn


    Kurde, i tutaj nie rozumiem czy muszę zmienić te numery pinu bezpośrednio w kodzie czy tez dopiero podczas lutowania wziąć poprawkę ze te piny w obu atmegach mieszczą sie gdzie indziej w obudowie.
    Specyfikacje obu mikrokontrolerów można znaleść na:
    http://www.atmel.com/dyn/products/product_card.asp?part_id=2004 - Atmega 8
    http://www.atmel.com/dyn/products/Product_card.asp?part_id=2010 - atmega 16


    A o to "moja" wersja programu.

    Cytat:

    #include <Main.h>
    /////////////////////////////////////////////////////////////////////////////
    void timers_init(void)
    {

    TCCR0|=(1<<CS02)|(1<<CS00)|(1<<WGM01);//preskaler /1024, najwieksze opoznienie- ~16ms@16Mhz
    //TIMSK|=(1<<OCIE0);//przerwanie od porownania
    TCCR2|=(1<<CS22)|(1<<CS20)|(1<<WGM21);//preskaler /1024, najwieksze opoznienie- ~16ms@16Mhz
    //TIMSK|=(1<<OCIE2);//przerwanie od porownania
    #define _10ms ( 10 * ( xtal / 1024000 ) )

    OCR0=_10ms;//rejest porownania
    OCR2=_10ms;//rejest porownania

    //sbi(DDRD, 5);
    DDRD|=(1<<5)|(1<<5);
    //sbi(DDRD, 4);
    TCCR1A = 0xa3;//10100011 PWM z liczeniem w gore, bez preskalera
    TCCR1B = 0x09;//00001001 fast PWM, 10 bit, gorna wartosc 1023
    OCR1A=100;
    OCR1B=100;

    //poczatek bez zmian

    }
    /////////////////////////////////////////////////////////////////////////////

    void timer0_gen(36000) // tutaj ustawiłem pożądaną czest. 36k Hz



    {
    unsigned long xtal=16000000; // tutaj ustawiłem xtal

    TCCR0|=(1<<WGM01)|(1<<COM00);
    TCCR0&=~((1<<WGM00)|(1<<CS02)|(1<<CS01)|(1<<COM01));
    DDRB|=(1<<3);

    if((f<=(unsigned long)(xtal/2))&&(f>(unsigned long)(xtal/2/256)))
    {
    TCCR0&=~((1<<CS01)|(1<<CS02));
    TCCR0|=(1<<CS00);
    OCR0=(unsigned char)(xtal/f/2-1); // zastanawiam sie tutaj
    }
    else if((f<=(unsigned long)(xtal/2/8))&&(f>(unsigned long)(xtal/2/8/256)))
    {
    TCCR0&=~((1<<CS00)|(1<<CS02));
    TCCR0|=(1<<CS01);
    OCR0=(unsigned char)(xtal/f/8/2-1); // zastanawiam sie tutaj
    }
    else if((f<=(unsigned long)(xtal/2/64))&&(f>(unsigned long)(xtal/2/64/256)))
    {
    TCCR0&=~(1<<CS02);
    TCCR0|=(1<<CS01)|(1<<CS00);
    OCR0=(unsigned char)(xtal/f/64/2-1); // zastanawiam sie tutaj
    }

    else if((f<=(unsigned long)(xtal/2/256))&&(f>(unsigned long)(xtal/2/256/256)))
    {
    TCCR0&=~((1<<CS00)|(1<<CS01));
    TCCR0|=(1<<CS02);
    OCR0=(unsigned char)(xtal/f/256/2-1; // zastanawiam sie tutaj
    }

    else if((f<=(unsigned long)(xtal/2/1024))&&(f>(unsigned long)(xtal/2/256/1024)))
    {
    TCCR0&=~(1<<CS01);
    TCCR0|=(1<<CS02)|(1<<CS00);
    OCR0=(unsigned char)(xtal/f/1024/2-1); // zastanawiam sie tutaj
    }

    // reszte usunolem jako zbedna
    }



    Proszę o uwagi wszelkiej maści.

    Z góry dziękuję
  • Poziom 11  
    pierwsze spostrzezenie;p
    atmega 8 na wewnetrznym zegarze nie bedzie miala 16mhz a tak to jak juz wiesz to tez sie nad tym mecze:D
  • Poziom 27  
    Nóżki programowo nie zmienisz, ponieważ jest ona przypisana do danego licznika. Z kodu wynika, że to T0, który ma w M16 nieco więcej funkcj iniz w M8 co może Ci przeszkadzać... Moja rada zmień na M88 skoro już chcesz mieć mniejszą obudowę. Ewentualnie sprawdz czy funckję, które wykonuje T2, możesz zrobic na T0 i wtedy wyjściem będzie T2 (OC2x)
    Pozdrawiam

    P.S. Do kolegi powyżej: rzaden procek AVR nie ma wewnętrznego kwarcu !