Помогите исправить код под серво :(

Тема в разделе "Микроконтроллеры AVR", создана пользователем genia1991, 22 мар 2021.

  1. genia1991

    genia1991 Гик

    Пытаюсь ардуиновский скетч переделать под AVR studio. Но совсем не знаю как исправить эти ошибки.
    как переписать правильно под авр аттини13 ? :(

    Код (C++):
    #define F_CPU 9600000
    int servo = PB0;  //connect servo to PB0
    long angle;
    int pwm;
    #include <avr/io.h>
    void adc_setup (void)
    {
        // Set the ADC input to PB2/ADC1
        ADMUX |= (1 << MUX0);
        ADMUX |= (1 << ADLAR);
        // Set the prescaler to clock/128 & enable ADC
        // At 9.6 MHz this is 75 kHz.
        ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN);
    }
    int adc_read (void)
    {
        // Start the conversion
        ADCSRA |= (1 << ADSC);
        // Wait for it to finish
        while (ADCSRA & (1 << ADSC));
        return ADCH; // return the value
    }
    void setup()
    {
        pinMode(servo, OUTPUT);  // set servo as output pin
    }
    void loop ()
    {
        long a;
        adc_setup();
        a = adc_read();  // read the potentiometer value
        angle = (a * 3) / 2; // convert the reading to angle between 0 and 180.
        servoPulse(servo, angle);  // call the servoPulse function.
    }
    void servoPulse (int servo, int angle)
    {
        pwm = (angle * 11) + 500;    // Convert angle to microseconds
        digitalWrite(servo, HIGH);
        delayMicroseconds(pwm);
        digitalWrite(servo, LOW);
        _delay_ms(50);                 // Refresh cycle of servo
    }
     
     

    Вложения:

  2. genia1991

    genia1991 Гик

    ошибки подсвечивает такие:
    upload_2021-3-22_13-43-26.png
     
  3. b707

    b707 Гуру

    ну как -судя по ошибкам, никаких ардуиновских функций типа pinMode() digitalRead() digitalWrite() в студии нет
    Все их надо заменить прямой записью в регистры
    pinMode - это регистр DDRx где х - имя порта
    digitalWrite - это регистр PORTx
    digitalRead - это регистр PINx
    подробнее ищите в инете. гайдов на эту тему тыщи
    например http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
     
    genia1991 нравится это.
  4. Airbus

    Airbus Радиохулиган Модератор

    Дык ПаровоЗЗ же говорил что Студия поддерживает Ардуину?Или таки нет?Я просто не в теме я ей не пользуюсь.Да и библиотека не подойдет скорей всего-нужно будет ассемблерные вставки делать-оно Вам надо?
    А зачем?Вы уверены что влезет?
     
  5. genia1991

    genia1991 Гик

    студия поддерживает ардуино. Но скомпилировать не получилось тот код. ошибка записи для аттини . как то так было написано.

    надеюсь что влезет. Просто начал изучать контроллеры без ардуино :)
    и понял что даже блинк не смогу написать ((
    Совсем все по другому и сложно очень
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Сложного ничего нет. Надо только определиться Вы изучаете МК на уровне регистров и чистого Си или Вам достаточно проекта Ардуино? Расхожая мысль что сначало Ардуино а потом старт в мир «настоящих» МК. На самом деле это не всегда верно. Кто то застревает на уровне Ардуино навсегда. А кто то наоборот приходит в Ардуино от «реальных» МК. К им отношусь я , СергейL, ИгорьК, Пушной Звер и другие старожилы. Если быть и там и тут то в голове возникнет каша. Тини 13 кстати тоже программируется и шьется через Ардуино IDE но только не все функции ему будут доступны.
     
    Daniil и genia1991 нравится это.
  7. genia1991

    genia1991 Гик

    Скетчи для ардуино для тини получается только находить с программированием регистров. А если писать обычным ардуиновским языком то на аттини 13 уже ничего не влазит :(
    Может как то по другому надо делать
     
  8. genia1991

    genia1991 Гик

    даже на этот код ругается (
    Хотя читаю о пинах и регистрах. там тоже все так же записано вроде
    upload_2021-3-22_15-29-14.png
     
  9. b707

    b707 Гуру

    вставляйте код в теги для кода, как вам на ошибки указывать?
    Например,
    Код (C++):
    OCR0A = 6.54
    OCR0B = 6.54
    это очевидный бред, все регистры МК работают только с целыми

    И еще обращайте внимание на регистр букв
    wgm01 и WGM01 - это совсем не одно и тоже
     
    genia1991 нравится это.
  10. parovoZZ

    parovoZZ Гуру

    Что это? Качать надо последнюю.
    upload_2021-3-22_16-33-56.png
     
    genia1991 нравится это.
  11. b707

    b707 Гуру

    Эйрбус и Паровоз, кончайте человека грузить всякой ерундой, помогите лучше по коду
     
  12. genia1991

    genia1991 Гик

    хороший пример скачал для примера регистров. надо поизучать его и грузануть в контроллер. Наверное код серво еще тяжело будет очень.С простого начал
    upload_2021-3-22_15-43-27.png
     
  13. parovoZZ

    parovoZZ Гуру

    Я использую такие макросы:
    Код (C++):
    #ifndef BITS_MACROS_
    #define BITS_MACROS_
    /***********************************************************
    //BITS MACROS
    //PASHGAN 2009
    //CHIPENABLE.RU
    //
    //reg : имя переменной, регистра
    //bit : позиция бита
    //val : 0 или 1
    ************************************************************/

    #define Bit(bit)  (1<<(bit))

    #define ClearBit(reg, bit)       reg &= (~(1<<(bit)))
    //пример: ClearBit(PORTB, 1); //сбросить 1-й бит PORTB

    #define SetBit(reg, bit)          reg |= (1<<(bit))  
    //пример: SetBit(PORTB, 3); //установить 3-й бит PORTB

    //Установка битов для Long
    #define SetBitValLong(reg, bit, val) do{if ((long) val==0) reg &= (~((long) 1<<(bit)));\
                                            else reg |= ((long) 1<<(bit));}while(0)

    //Для int и char                          
    #define SetBitVal(reg, bit, val) do{if ((val&1)==0) reg &= (~(1<<(bit)));\
                                      else reg |= (1<<(bit));}while(0)

    //пример: SetBitVal(PORTB, 3, 1); //установить 3-й бит PORTB
    //      SetBitVal(PORTB, 2, 0); //сбросить 2-й бит PORTB

    #define BitIsClear(reg, bit)    ((reg & (1<<(bit))) == 0)
    //пример: if (BitIsClear(PORTB,1)) {...} //если бит очищен

    #define BitIsSet(reg, bit)       ((reg & (1<<(bit))) != 0)
    //пример: if(BitIsSet(PORTB,2)) {...} //если бит установлен

    #define InvBit(reg, bit)      reg ^= (1<<(bit))
    //пример: InvBit(PORTB, 1); //инвертировать 1-й бит PORTB

    #endif //BITS_MACROS_
     
    Пример ногодрыга:
    Код (C++):
    #define Dimmer_pin_On()        ClearBit(Dimmer_PORT, Dimmer_OUT)        // Установить управляющий сигнал на пине симистора
    #define Dimmer_pin_Off()    SetBit(Dimmer_PORT, Dimmer_OUT)            // Снять управляющий сигнал с пина симистора
    Мигаем светодиодом через таймер1:
    Код (C++):
    ISR(TIMER1_COMPA_vect)
    {
        Dimmer_pin_On();
    }


    ISR(TIMER1_COMPB_vect)
    {
        Dimmer_pin_Off();
    }
    Ну или тупо:

    Код (C++):
    I
        Dimmer_pin_On();
        delay_ms(2000)
        Dimmer_pin_Off();
        delay_ms(1000);
     
     
    genia1991 нравится это.
  14. Airbus

    Airbus Радиохулиган Модератор

    А представляете-у меня вся эте Ересь под Тини13 скомпилилась!
    Вот что пишет
    [​IMG]
     
    genia1991 и b707 нравится это.
  15. Airbus

    Airbus Радиохулиган Модератор

    Я уже и забыл что это такое
    ADMUX |= (1 << MUX0);
    ADMUX |= (1 << ADLAR);
    // Set the prescaler to clock/128 & enable ADC
    // At 9.6 MHz this is 75 kHz.
    ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN);

    Ругательства какие?Или заклинания?
     
  16. genia1991

    genia1991 Гик

    шпаргалку сделал по пинам :)
    upload_2021-3-22_16-26-48.png
     
  17. genia1991

    genia1991 Гик

    как то кварц делиться что бы потом получить pwm в нужном диапазоне. наверное :)
     
  18. genia1991

    genia1991 Гик

    я устанавливал ядро tiniavr 13 . примерное название. ошибка компиляции для платы. поэтому пришлось другой путь искать
     
  19. genia1991

    genia1991 Гик

    так тоже не работает код серво (

    Код (C++):
    #define F_CPU 9600000
    //int servo = PB0;  //connect servo to PB0
    long angle;
    int pwm;
    #include <avr/io.h>
    void adc_setup (void)
    {
        // Set the ADC input to PB2/ADC1
        ADMUX |= (1 << MUX0);
        ADMUX |= (1 << ADLAR);
        // Set the prescaler to clock/128 & enable ADC
        // At 9.6 MHz this is 75 kHz.
        ADCSRA |= (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN);
    }
    int adc_read (void)
    {
        // Start the conversion
        ADCSRA |= (1 << ADSC);
        // Wait for it to finish
        while (ADCSRA & (1 << ADSC));
        return ADCH; // return the value
    }
    void setup()
    {
        DDRB |= 1<<0; // set servo as output pin    PB0
    }
    void loop ()
    {
        long a;
        adc_setup();
        a = adc_read();  // read the potentiometer value
        angle = (a * 3) / 2; // convert the reading to angle between 0 and 180.
        servoPulse();  // call the servoPulse function.
    }
    void servoPulse (int servo, int angle)
    {
        pwm = (angle * 11) + 500;    // Convert angle to microseconds
        PORTB^= (1<<0);
        _delay_ms(pwm);
        PORTB^= ~(1<<0);
        _delay_ms(10);                // Refresh cycle of servo
    }
     
     
  20. akl

    akl Гуру

    это не в ардуино-иде?
    тогда там нет никаких loop и setup.
    должно быть так:
    Код (C++):

    int main(void){
        //это сетап

    while (1==1) {
        //а тут типа луп
       
    }
    return 0;
    }
     
    кстати сервомашинками вроде некомильфо управлять при помощи ШИМа. там нужны импульсы - смотри как работает библиотека серво из ардуино
     
    genia1991 нравится это.