Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение просто КОТ »

Спойлер

Код: Выделить всё

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

unsigned char Coef = 100;
unsigned char B = 100;

ISR(TIM0_COMPA_vect)  {
    TCCR0B|=(0<<CS00)|(0<<CS02); // îñòàíîâèòü.
    PORTA |= 0x02;
}

ISR(INT0_vect)  {
    PORTA &= ~0x02;
   TCCR0B|=(1<<CS00)|(1<<CS02); // Äåëèòü ÷àñòîòó íà 1024.
}

int main (void){
    // Crystal Oscillator division factor: 1
    CLKPR=(1<<CLKPCE);
    CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

    GIMSK |= (1<<INT0);
    MCUCR = (0<<ISC01) | (1<<ISC00); //i'a`n~o`?i^e`e"e`n~u"
    GIFR=(1<<INTF0) | (0<<PCIF1) | (0<<PCIF0);
    TCCR0B|=(0<<CS00)|(0<<CS02); // îñòàíîâèòü.
    TIMSK|=(1<<OCIE0A); // Ðàçðåøèòü ïðåðûâàíèå ïî ñîâïàäåíèþ.
    DDRA = 0xFF;
    OCR0A = 156;

    sei();
    while (1){
        _delay_ms(1000);
        PORTA |= 0x10;
        _delay_ms(1000);
        PORTA &= ~0x10;
    }
    return 0;
}


Пытаюсь сделать типа диммер. Т.е. он принимает сигнал о переходе фазы через ноль. Запускает таймер на совпадение и потом должен таймер сработать и на 2 пин вывести высокий уровень. При следующем переходе через 0 ставится низкий уровень и снова таймер. Что не так? Компилятор говорит что-то непонятное:

Спойлер../Test.c: In function 'main':
../Test.c:29: error: 'TIMSK' undeclared (first use in this function)
../Test.c:29: error: (Each undeclared identifier is reported only once
../Test.c:29: error: for each function it appears in.)
make: *** [Test.o] Error 1
Build failed with 3 errors and 0 warnings...
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение oleg110592 »

'TIMSK' undeclared

нет такого регистра у Tiny24, если посмотреть документацию есть регистр TIMSK0
Изображение
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение baghear »

Добрый день, для чего мк нужна сигнатура, как её можно использовать ?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Engineer_Keen »

Ну например чтобы оболочка для программирования знала какие фьюзы есть в этом контроллере и каков размер его памяти.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение просто КОТ »

Продолжаем холивар. Сделал код, почти как выше. буквально пара правок. Записываю 39 в сравнение. делитель 1024, тактовая 8МГц. Итого прерывание на 10мс выходит. Подаю прямоугольник 50Гц на вход. должно быть на выходе прямоугольник совпадающий по фазе, но 100Гц. А там нечто странное.
СпойлерИзображение

Код: Выделить всё

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

unsigned char Coef = 100;
unsigned char B = 100;

ISR(TIM0_COMPA_vect)  {
    TCCR0B|=(0<<CS00)|(0<<CS02); // îñòàíîâèòü.
    PORTA |= 0x02;
}

ISR(INT0_vect)  {
    PORTA &= ~0x02;
   OCR0A = 39;
   TCCR0B|=(1<<CS00)|(1<<CS02); // Äåëèòü ÷àñòîòó íà 1024.
}

int main (void){
    // Crystal Oscillator division factor: 1
    CLKPR=(1<<CLKPCE);
    CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

    GIMSK |= (1<<INT0);
    MCUCR = (0<<ISC01) | (1<<ISC00); //i'a`n~o`?i^e`e"e`n~u"
    GIFR=(1<<INTF0) | (0<<PCIF1) | (0<<PCIF0);
    TCCR0B|=(0<<CS00)|(0<<CS02); // îñòàíîâèòü.
    TIMSK0|=(1<<OCIE0A); // Ðàçðåøèòü ïðåðûâàíèå ïî ñîâïàäåíèþ.
    DDRA = 0xFF;

    sei();
    while (1){
        _delay_ms(1000);
        PORTA |= 0x10;
        _delay_ms(1000);
        PORTA &= ~0x10;
    }
    return 0;
}
Вложения
Снимок.PNG
(121.06 КБ) 698 скачиваний
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение baghear »

Спасибо, а можно ли её, сигнатуру, перезаписать?
Последний раз редактировалось baghear Ср сен 10, 2014 16:59:58, всего редактировалось 1 раз.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Что значит "переписать"? Куда переписать? Куда переписать?
Если вы хотите сжульничать и, скажем, 8-ю Мегу продавать как 48-ю, подменив сигнатуру, то не получится.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение просто КОТ »

А мне шо скажете?
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Baasil
Говорящий с текстолитом
Сообщения: 1641
Зарегистрирован: Пн авг 25, 2014 21:52:26
Откуда: Ленинград

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Baasil »

Не трогайте делей, делайте на прерываниях)
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение просто КОТ »

Дык на делеях работает. Хотя это и грузит всё. Мне такое НЕ подходит. А вот на прерываниях не запустилось. Хотя должно было.

Код: Выделить всё

ISR(INT0_vect)  {   // Фаза пересекаетноль
    PORTA &= ~0x02;  // Симистор закрыт
   OCR0A = 39;  // Заводим таймер на 9мс
   TCCR0B|=(1<<CS00)|(1<<CS02);  // Выставляем делитель 1024
}

ISR(TIM0_COMPA_vect)  {  // Прошло 9мс
    TCCR0B|=(0<<CS00)|(0<<CS02); // Остановили таймер.
    PORTA |= 0x02;  // Симистор открыт до следующего перехода фазы через ноль.
}
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение baghear »

Спасибо!!!
Paranoia Agent
Родился
Сообщения: 1
Зарегистрирован: Ср сен 10, 2014 20:25:14

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Paranoia Agent »

Ребят, помогите выбрать платку :)
Очень срочно (за 2 дня) нужна готовая плата с ПЛИС или микроконтроллером для примитивной задачки:
- получить данные с компьютера (можно через COM, можно через ethernet, ~300 кбит/сек)
- примитивно обработать (выделить управляющие команды + небольшая обработка (пара бинарных операций))
- вывести на 2 вывода ( ~250 кбит/сек с амплитудой не менее 2В).

Требования:
- наличие коммуникационного порта (COM или ethernet);
- ну и, естественно, наличие в магазинах Санкт-Петербурга;
- также к нему нужен программатор и питание.

Желательно:
- питание от USB;
- маленький размер;
- маленькая цена (ПЛИСы, практически, отметаются);
- процессор AVR (я с ARM не работал);
- если есть еще и корпус, то совсем шикарно.

Я выбрал вот эту, но не знаю, справится иль нет:
http://www.terraelectronica.ru/catalog_ ... DE=1087512
Еще есть такая:
http://www.terraelectronica.ru/catalog_ ... ODE=339595

У кого есть какие предложения, хочется послушать.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение isx »

Доброй ночи!
Никак не могу побороть проблему в CVAVR с AtMega16.
Вот часть кода:

Код: Выделить всё

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{

// Read the AD conversion result
adc_data=ADCH;
// Place your code here
if (adc_data != adc_dataold)  {
OCR0 = adc_data;
adc_dataold = adc_data;
}
}

.....................

PORTA=0b00010000;
DDRA=0b01101111;

PORTB=0b00000000;
DDRB=0b11111111;
.....................


// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0b01110001;
TCNT0=0x00;
OCR0=0x10;

Эта фигня регулирует яркость свечения светодиода от ручки переменника. Беда в том, что когда постепенно уменьшаешь свечение, то в определённый момент (процентов на 20 яркости) вместо того чтоб потухнуть, диод наоборот загорается на полную.
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Mishany »

по коду вроде правильно, единственное проверить в настройке ацп, что в adch действительно 8 bit, и проверить переменник, может в нем проблема.
и проще сделать в прерывании OCR0=ADCH; что бы не было лишних бестолковых сравнений и присваиваний в прерывании (50-250 тыс. раз в секунду заходить в оператор if .....).
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение isx »

Сравнение итак в прерывании АЦП. Просто протеус жёстко тупил от простого присваивания.
Кстати, в протеусе тоже всё работает. Я уже и без переменника закорачивал - что на плюс, что на минус - один хрен горит на полную.
Пробывл и на другом МК - результат тот же.
Chettuser

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Chettuser »

Светодиод случайно не DIGITAL ?
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение isx »

Нее, обычный.
Выставил TCCR0=0b01101001; и завёлся. Только вот теперь новая проблема.

Код: Выделить всё

\
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{

// Read the AD conversion result
adc_data=ADCH;
// Place your code here
if (adc_data != adc_dataold)  {
if (adc_data > 200) {OCR0 = 255;}
if (adc_data < 100) {OCR0 = 0;}
if ((adc_data >= 100) && (adc_data <= 200)) {OCR0 = adc_data;}
adc_dataold = adc_data;
delay_us(1);
}
}




void main(void)
{

PORTA=0b00010000;
DDRA=0b01101111;

PORTB=0b00000000;
DDRB=0b11111111;

PORTD=0b00000000;
DDRD=0b11111111;

PORTC=0b10000000;
DDRC=0b01111111;


TCCR0=0b01100001;
TCNT0=0x00;
OCR0=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0b01000100;

ACSR=0x80;
SFIOR=0x00;

ADMUX=0b01110111;
ADCSRA=0b11101111;
SFIOR&=0x00;

// Global enable interrupts
#asm("sei")

while (1)
      {
delay_us(5);
    PORTA = ((PORTA & 0b11110000) | mpxbutt);   

delay_us(5);         
mpxbutt = mpxbutt + 1;
if (mpxbutt == 16) {mpxbutt = 0;};   

Со строкой PORTA = ((PORTA & 0b11110000) | mpxbutt); проблема возобновляется. Как только её убираю - всё становиться нормально (у меня тут мультиплексор висит)
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение isx »

Блин. Почему-то всегда, когда я произвожу обращение к порту "А", диод начинает тупо светиться.
пробовал строку PORTA = ((PORTA & 0b11110000) | mpxbutt); обхватить таким образом:

Код: Выделить всё

delay_ms(1000);
 PORTA = ((PORTA & 0b11110000) | mpxbutt);
delay_ms(1000);

СД сначала нормально реагирует на потенцимометр. Через секунду он начинает тупо светиться. Ещё через секунду, всё снова работает нормально - и так по кругу.
Это вообще лечиться?? :(


Paranoia Agent писал(а):Ребят, помогите выбрать платку :)
Очень срочно (за 2 дня) нужна готовая плата с ПЛИС или микроконтроллером для примитивной задачки:


Discovery от STM - дёшево и сердито. Простейшие операции за пару дней выучить можно, там не так всё кошмарно, как о нём говорят :). Зато за 400р. и USB и куча пинов, периферии и мощи.
К диплому готовитесь небось? :)))
nirq
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение nirq »

Блин. Убери magic numbers, добавь "out UDR, xxx" в интересующих местах, подключи что-нибудь к чему-нибудь для отладки вместо гадания и не майся этой дурью в онлайне.
И делай в прерывании конечно круто, но на будущее салеае прикупи всё-таки.
Chettuser

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Chettuser »

isx писал(а):Discovery от STM - дёшево ... за 400р.

Где такие цены??? :shock:
Ответить

Вернуться в «Разные вопросы по МК»