Мелкие вопросы по МК и ПЛИС.
Такой ещё вопрос.. А какой командой задаётся потолок счёта таймеру? т.е. чтоб не по переполнению, а по совпадению. Такого не могу чёт найти, хотя явно есть.Надо взвести его на 10мс.
- Реклама
При каждом таймере (кроме нулевого) есть регистр (OCR), который подключен вместе с таймером к цифровому компаратору.
Достаточно записать в этот регистр необходимую величину пересчета и Вы добьетесь искомого.
Достаточно записать в этот регистр необходимую величину пересчета и Вы добьетесь искомого.
Не достаточно, но необходимо. Ещё необходимо сконфигурировать режим СТС или иной подходящий.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Код: Выделить всё
// При частоте генератора 14.7456 МГц и делителе 1024, 1000ms - 14400 тактов.
OCR3AH=56; OCR3AL=63;И да, какими командами запускать/прекращать действие таймера?
Спойлер
Код: Выделить всё
#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;
}Спойлер
../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...
- Реклама
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
нет такого регистра у Tiny24, если посмотреть документацию есть регистр TIMSK0'TIMSK' undeclared

- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
Добрый день, для чего мк нужна сигнатура, как её можно использовать ?
Ну например чтобы оболочка для программирования знала какие фьюзы есть в этом контроллере и каков размер его памяти.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Продолжаем холивар. Сделал код, почти как выше. буквально пара правок. Записываю 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 КБ) 721 скачивание
Что значит "переписать"? Куда переписать? Куда переписать?
Если вы хотите сжульничать и, скажем, 8-ю Мегу продавать как 48-ю, подменив сигнатуру, то не получится.
Если вы хотите сжульничать и, скажем, 8-ю Мегу продавать как 48-ю, подменив сигнатуру, то не получится.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
А мне шо скажете?
Дык на делеях работает. Хотя это и грузит всё. Мне такое НЕ подходит. А вот на прерываниях не запустилось. Хотя должно было.
Код: Выделить всё
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; // Симистор открыт до следующего перехода фазы через ноль.
}
- Сообщения: 791
- Зарегистрирован: Вт июн 17, 2014 00:34:26
- Сообщения: 1
- Зарегистрирован: Ср сен 10, 2014 20:25:14
Ребят, помогите выбрать платку 
Очень срочно (за 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
У кого есть какие предложения, хочется послушать.
Очень срочно (за 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
У кого есть какие предложения, хочется послушать.
- Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
Доброй ночи!
Никак не могу побороть проблему в CVAVR с AtMega16.
Вот часть кода:
Эта фигня регулирует яркость свечения светодиода от ручки переменника. Беда в том, что когда постепенно уменьшаешь свечение, то в определённый момент (процентов на 20 яркости) вместо того чтоб потухнуть, диод наоборот загорается на полную.
Никак не могу побороть проблему в 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;
по коду вроде правильно, единственное проверить в настройке ацп, что в adch действительно 8 bit, и проверить переменник, может в нем проблема.
и проще сделать в прерывании OCR0=ADCH; что бы не было лишних бестолковых сравнений и присваиваний в прерывании (50-250 тыс. раз в секунду заходить в оператор if .....).
и проще сделать в прерывании OCR0=ADCH; что бы не было лишних бестолковых сравнений и присваиваний в прерывании (50-250 тыс. раз в секунду заходить в оператор if .....).
- Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
Сравнение итак в прерывании АЦП. Просто протеус жёстко тупил от простого присваивания.
Кстати, в протеусе тоже всё работает. Я уже и без переменника закорачивал - что на плюс, что на минус - один хрен горит на полную.
Пробывл и на другом МК - результат тот же.
Кстати, в протеусе тоже всё работает. Я уже и без переменника закорачивал - что на плюс, что на минус - один хрен горит на полную.
Пробывл и на другом МК - результат тот же.




