Перейти к содержанию

IGRISE

Members
  • Постов

    67
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные IGRISE

  1. Дай свой майл, пришлю простенькие программы для расчета фильтров... Сюда почему то не получается их прикрепить ...

    Две программы весят в архиве в сумме 10 кбайт...

  2. С МК и Flash все впорядке, ты лучше разберись с фильтром... Кто-то даже говорил, что такой фильтр подавляет совсем не те частоты которые нужно... :(

    Какое у тебя получилось время записи и воспроизведения...?

  3. Если чесно, у меня слов не хватает, чтобы выразить все эмоции которые, я испытывал когда читал инициализацию портов... :angry:

    Постараюсь объяснить тебе по мягче...

    Во первых: Ты говоришь программа почти не изменилась, в этом ты не прав, если ты изменишь один байт программы,

    ты уже ее сильно поменяешь, в лучшем случае МК просто неправильно будет работать, в худшем ты его испортишь...

    А вот это вот что:

    /* Инициализация порта */

    void port_init()

    {

    PORTB=0x01; :angry:

    DDRB=0x01;

    PORTC=0x00;

    DDRC=0xFF;

    PORTD=0x00;

    DDRD=0xFF; //0xf3

    }

    Зачем ты при инициализации порта устанавливашь высокий уровень на выходе...???

    Datasheet иногда надо читать :angry:

  4. Да... Оригинально подмечено - рвение делать робота быстро прошло... :rolleyes:

    Ну тогда дайте пожалуйста ссылку если есть на Индикатор на AVR и миди клаву тоже на AVR если есть!

    Индикатор какой LCD или LED...??? Зайди на оффсайт ATMEL, там есть похожая реализация ШИМ, да и индикатор светодиодный есть...

  5. HOT ICE: Так дело в том что ты мне код последний который дал он по идее и должен выполнять мою задачу но прирывания почемуто не происходят!Программа начинает работать без прерывания

    Вот уже ближе...

    А теперь смотри... <<HOT ICE: Программа начинает работать без прерывания>>, программа всегда работает

    если ты имел ввиду, что при включении МК не должен попадать в функцию включения работы двигателя engine_on(), дак он туда и не попадает, т.е если ты использовал предыдущий код, я не поленюсь еще его сюда кину:

    /*****************************************************
    Chip type : ATmega8
    Program type : Application
    Clock frequency : 12,000000 MHz
    Memory model : Small
    External SRAM size : 0
    Data Stack size : 256
    *****************************************************/
    
    #include <mega8.h>
    #include <delay.h>
    
    /* Глобальные переменные */
    unsigned char f_on=0, f_mozgi=0; 
    
    /* Инициализация порта */
    void port_init()
    {
    PORTB=0x00;
    DDRB=0x00; 
    
    PORTC=0x00;
    DDRC=0xFF; 
    
    PORTD=0x00;
    DDRD=0xFF;   //0xf3
    } 
    
    /* Инициализация внешних прерываний */
    void int_init()
    {
    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Rising Edge
    // INT1: On
    // INT1 Mode: Rising Edge
    GICR|=0xC0;
    MCUCR=0x0F;
    GIFR=0xC0;
    }
    
    /* Инициализация аналогового компаратора (его выключение) */
    void an_comp_init()
    {
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    } 
    
    /* Функция включения работы двигателя */
    void engine_on()
    { 
    if (f_on) 
    {
     #asm("cli");
     //мотор1 вперёд
     PORTD.0=1;  
     //мотор2 вперёд
     PORTD.1=1;
     delay_ms(500);  
     PORTD.0=0;
     PORTD.1=1;
     delay_ms(500);
     #asm("sei");  
    }
    } 
    
    /* Функция ВЫключения работы двигателя */
    void engine_off() 
    {
    PORTD.0=0;//стоп
    PORTD.1=0;//стоп
    }
    
    /* Прерывание от вывода PD2(INT0) */
    interrupt [EXT_INT0] void ext_int0_isr()
    { 
    // Это прерывание возникает когда на выводе PD2 идет фронт сигнала
    if (f_mozgi) 
    { 
     PORTD.0=1; 
     PORTD.1=0;
     f_mozgi=0;
    }
    else
    {
     PORTD.0=0; 
     PORTD.1=1;
     f_mozgi=1;
    }   
    }
    
    /* Прерывание от вывода PD3(INT1) */
    interrupt [EXT_INT1] void ext_int1_isr()
    {
    // Это прерывание возникает когда на выводе PD3 идет фронт сигнала
    if (f_on) f_on = 0;
      else f_on = 1;
    if (f_on==0) engine_off(); // Выключение
    }
    
    void main()
    {
    #asm("cli"); // Запрет всех прерываний
    port_init();
    int_init();
    an_comp_init();
    #asm("sei"); // Разрешение внешних прерываний
    
    while(1) engine_on();
    }

    И если ты подключил так, как на схеме::

    ТО НИЧЕГО У ТЕБЯ НА НАЧАЛЬОМ ЭТАПЕ НЕ БУДЕТ ВКЛЮЧАТЬСЯ!!!

    Если у тебя что-то включается, то это только твои ошибки, при подключении кнопок...

    post-18659-1172164497_thumb.jpg

  6. А может тогда чтото другое посоветуеш???Ато как мне ещё движками нормально управлять?

    На счёт программы,,,

    Я тебе только посоветую зайти на специальный форум роботостроения... И спросить кто какие драйверы использует...

    Ну да я был бы очень рад если ты мне её набросаеш,ато времени остаётся всё меньше,а я так и не сделал то что хотел

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

    А в итоге пришли к тому что-ты ничего не понял или не хочешь понимать... ??? :(

  7. А я в протеусе мало, что эмулирую, тем более он совсем не подходит для сложных задач...

    Я к каждому своему устройству делаю выводы для подключения переходника UART<<>>RS-232,

    и просматриваю все, что мне надо... :) на комп-ре.

  8. Ну вот я тебе примерно напишу как это делается на С:

    Самая простая реализация:

    SPCR = 0x5c; // Настройка SPI: прерывания запрещены, порт SPI включен, <<ведущий режим>>,

    // первый MSB, 3 режим SPI, fosc/4(без удвоения частоты).

    SPDR = data; // data - данные необходимые для передачи

    while (!(SPSR & temp)); // Ожидание завершения передачи

    SPCR = 0x00; // Выключение SPI

    Но обычно по SPI передаются не только данные, но и команды:

    SPCR = 0x5c; // Настройка SPI: прерывания запрещены, порт SPI включен, <<ведущий режим>>,

    // первый MSB, 3 режим SPI, fosc/4(без удвоения частоты).

    SPDR = com; // com - команда

    while (!(SPSR & temp)); // Ожидание завершения передачи

    SPDR = data; // data - данные необходимые для передачи

    while (!(SPSR & temp)); // Ожидание завершения передачи

    SPCR = 0x00; // Выключение SPI

    Но почти всегда микросхемы подключенные к МК требуют передачи не восми разрядных данных,

    а например 16-ти, 14-ти или 12-ти...

    Тогда я использовал сдвиг:

    SPCR = 0x5c; // Настройка SPI: прерывания запрещены, порт SPI включен, <<ведущий режим>>,

    // первый MSB, 3 режим SPI, fosc/4(без удвоения частоты).

    SPDR = com; // com - команда

    while (!(SPSR & temp)); // Ожидание завершения передачи

    SPDR = (char)(data>>8); // data - данные необходимые для передачи

    while (!(SPSR & temp)); // Ожидание завершения передачи

    SPDR = (char) data; // data - данные необходимые для передачи

    while (!(SPSR & temp)); // Ожидание завершения передачи

    SPCR = 0x00; // Выключение SPI

    Ну примерно так...

    И еще можешь зайти вот сюда: форум Atmel

  9. Привет всем, я не приходил сюда потому что отдыхал далеко от компьютера :) !!!

    Неужели я уже заслуживаю статус учителя...?

    Ладно не буду вводить в заблуждение

    Смотри что мне нужно от всей програмы:

    1)При подаче питания,программа ждёт прерывания 1

    2)когда произошло прерывание 1 програма,включает код

    который активирует двигатели,и они начинают вращаться то в перёд то назад(Ну ето уже как я пропишу)Постоянно!

    3)А при возникновении прерывания 2 программа проверяет какое последнее действие выполнялось для моторов

    и делает всё наоборот в течении 5 секунд

    4)И после етого снова переходит к продолжению работы двигателей от прерывания 1 но не ждёт етого прерывания!!

    5)При подаче ещё одного прерывания 1 выполнение кода для двигателей останавливается,и снова начиная с пункта1!

    Нормально описал?

    HOT ICE ты вот это мне сказал, для того чтобы я тебе программу написал, или что...???

    Вот то, что ты мне написал является "простенькой" программой, я например, совсем не могу понять какие у тебя проблеммы с ней могут возникнуть...??? Вот я понимаю, если ты не можешь организовать многоуровневое меню, или не получается реализовать программно какой-нибудь интерфейс или еще что-то тогда другое дело ...

    Кстатти я наверно спалил INT1 и INT2.Я их проводом производил а не кнопкой и без резистора,раньше всё работаало а сейчас нет Новую мегу покупать прийдётся наверно.

    Я согласен с Duhas, одновременно два вывода (INT1 и INT2) мало вероятно спалить, тем более проводком, да еще ты ведь эти выводы настроил на вход (по крайней мере я на это надеюсь :) )... Напиши простую программу м проверь эти выводы...

    А вот на счет fuses не согласен, они ведь никак не влияют на работу INT1 и INT2...

    Кстатти я на той схеме что ты выложил не понял что такое J1?

    J1, ты мог на него не обращать, я тебе так показал, что выводы от МК идут к драйверу...

  10. Ну вот я набросал примерный код, а так можно посмотреть на сайте Atmel, там много примеров даже такой есть какой ты просишь

    void timer0_init()
    {
    // Используется для клавиатуры
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 15,625 kHz
    // Mode: CTC top=OCR0
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0xff;  // Происходит прерывание каждые 16,32 ms
    }
    
    interrupt [TIM0_COMP] void timer0_comp_isr(void)
    {
    /* Опрос клавиатуры (Клавиатура 4x4 подключена к порту X) */
    DDRX=0xf0;	
    PORTX=0x0f;  
    key=PINX;  
    DDRX=0x0f;   
    PORTX=0xf0;  
    key+=PINX;
    key //это переменная которая содержит, код нажатой клавиши
    }

    Надеюсь пебе все понятно... Потому что я до Вторника сюда не буду приходить...

    IGRISE уехал на отдых... :-)

  11. Ну я тебе так, на словах пока разьясню:

    Ты наверно имел ввиду без прерывания от INT0 и INT1, раз ты указал что их всего два...

    Да написать программу без прерывания можно, но только мало кто так делают, если у тебя МК не занят другими задачами то используй просто задержки delay_ms(); delay_us();

    Ну вот например делаешь так:

    Считываешь состояние порта: save_first = PINX.X;

    Ждешь 20 милли секунд: delay_ms(20);

    Считываешь состояние порта: save_final = PINX.X;

    Сравниваешь эти два значения, для подаления "дребезга контактов": if ((!f_new_key)&(save_first==save_final)) f_new_key=1; // получили новое значение от вывода, теперь можно использовать save_first или save_final для управления программой... если хочешь получить состояние кнопки тебе нужно обнулить флаг f_new_key=1;

    Ждешь 20 милли секунд: delay_ms(20);

    И все это зацикливаешь...

    Только ты сам понимаешь, что обычно МК не только считывает состояние кнопки, но и еще что-то делает, поэтому использование функций delay_ms(); delay_us(); несколько замедлит выполнение программы, вместо того, чтобы МК что-то выполнял, он будет тупо сидеть в этих функциях и ждать, поэтому без прерывания от какого-нибудь таймера никак не обойтись... Удачи... :)

    Dimas19904 ответил: для меня проще написать программу без использования прерывания

    Можешь не использовать прерывания, а просто считывать флаг состояния прерывания, но тогда тебе придется принудительно после чтения обнулять эти флаги... Сразу оговорюсь, я так никогда не делал, но это конечно не озночает, что другие так не делали, попробуй... :)

  12. Пока НЕ могу

    Вот тут я тебя не понял, что ты именно не можешь...?

    Я так понял что это сторожевой таймер, но как его корректно включать???????

    Да ты правильно меня понял, это сторожевая собачка, включают ее двумя способами или fuse bits или программой...

×
×
  • Создать...