CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 9
Зарегистрирован: Пт май 04, 2012 17:31:06

Сообщение maxim___71rus »

Помагите!! При программировании Atmega8 прогроматором AVR ISP MKII(клон на at90usb162) появляется вот такая ошибка!Сигнатуру он определяет нормально, но когда нажимаешь отчистить чип или записать флеш, то вылетает эта ошибка.
Изображение
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

maxim___71rus
ПомОгу перевести
проверьте не является ли тактовая частота(SLK Frequency)слишком высокой
Некоторые чипы AVR поставляются с завода с фьюзами CLKSEL, установленными на внутренний 1МГц генератор
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

сеттингс/программер чуток увеличить задержку
Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Сообщение ELcat »

Появился и у меня вопросик.
Так ли страшен чорт, как его малюют?
ATxmega.jpg
(185.67 КБ) 343 скачивания
Кто-нибудь уже кодил эти камушки из-под CV AVR? Wizard генерит для них код? Есть ли какое-то серьёзное отличие работы с ними от работы с обычными ATmega в CV AVR (кроме разрядности ядра и регистров разумеется)? Если на РадиоКоте уже есть тема или статья по ним, дайте ссылку.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Конечно генеририт код, это должно было стать для пользователя заметным начиная с недавних версий, так как визард стал постоянно спрашивать мега или иксмега
И само представление визарда поменялось.
Вложения
CVAVR_code_wisard_XMEGA.GIF
(32.49 КБ) 379 скачиваний
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Сообщение ELcat »

Виталий, а вы с ними уже работали?
Реклама
Встал на лапы
Сообщения: 85
Зарегистрирован: Сб май 01, 2010 23:09:26
Откуда: Одесса

Сообщение fiksx »

Добрый день! Подскажите ктото втречал бибилиотеку USB для codevision? Пол дня сегодня убил в поиске но ничего так и не нашел. Интересует программный usb(например для atmega8).
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Нет особого смысла искать только для CVAVR, это такой же компилятор для си как и некоторые другие.
Вот тут можно почитать про USB.
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Подскажите, как разделить два сигнала с АЦП.
к примеру один сигнал подаётся на вход меги128 ADC0 а другой на ADC6, так вот как их записать каждый в свой массив.
с одним сигналом понятно АЦП завершило преобразование прерывание сработало и там записал в массив. А вот когда сигналов несколько то тут не совсем понятно с какого канала сработало прерывания.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

не совсем понятно с какого канала сработало прерывания
C выбранного Вами :)
Непонятно, если честно, в чём проблема... Выбираете канал, запускаете преобразование, считываете. И так для двух каналов по очереди.
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Так оно может проскочить. Я забыл написать что я таймером запускаю АЦП (задаю частоту дискретизации)

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

interrupt [ADC_INT] void adc_isr(void)
{
#asm("cli")
buffer[ADC_INDEX]=ADCW;
    if(ADC_INDEX>=30){ADC_INDEX=0;}
ADC_INDEX++;
#asm("sei")
}

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
ADCSRA|=(1<<ADSC); // включения  АЦП  частота дискретизации 4КГц
}
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Так оно может проскочить
Что проскочить ? И куда ?
buffer[ADC_INDEX]=ADCW;
if(ADC_INDEX>=30){ADC_INDEX=0;}
ADC_INDEX++;
Сразу видна ошибка невооруженным глазом :)

И это

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

#asm("cli")
...
#asm("sei")
Никчему писать. При входе в обработчик итак идёт запрет, с восстановлением перед выходом.
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Сразу видна ошибка невооруженным глазом :)
То что обнуляю INDEX_ADC а потом сразу инкрементирую ?


Как-то так ? Не нравится мне только, то что в прерывании много нагородил.

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

flag_ACD=0;

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
ADCSRA|=(1<<ADSC); // включения  АЦП  частота дискретизации 4КГц
}

interrupt [ADC_INT] void adc_isr(void)
{
#asm("cli")
switch (flag_ACD){
				case 0:{
						buffer[ADC_INDEX]=ADCW;
                                        ADC_INDEX++;
						break;
				}
				case 1:{
						buffer1[ADC_INDEX1]=ADCW;
                                  ADC_INDEX1++;
						break;
				}
#asm("sei")
}

while(1){
	ADC_1();		// выбрали  первый канал 
	flag_ACD=0;
	
	ADC_6();		// выбрали  шестой канал 
	flag_ACD=1;

}
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

То что обнуляю INDEX_ADC а потом сразу инкрементирую ?
Конечно. Нужно сначала инкрементировать, потом проверять на переполнение. Иначе логика непонятна...

У Вас получилось выбор канала и преобразование - два асинхронных процесса. Каша будет.
Выбирать следующий канал нужно по завершению преобразования и небольшой выдержки.
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Аlex писал(а):Выбирать следующий канал нужно по завершению преобразования и небольшой выдержки.
Что-то не могу понять "по завершению преобразования" это как сделать? проверять как-нибудь флаг ?
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

pokk писал(а):это как сделать? проверять как-нибудь флаг ?
Лол. А для одного канала вы как делаете? :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

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

void wait_ADC()
{
	while((ADCSRA & (1 << ADIF)) == 0);	//wait for Flag ADIF(conversion complete)
	ADCSRA |= (1 << ADIF);				//Reset conversion complete flag (ADIF = 1)
}

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

switch(channel)
{
	case 0:
		buffer[channel][ADC0_INDEX] = read_ADC(channel);
		(ADC0_INDEX < 30) ? (ADC0_INDEX++) : (ADC0_INDEX = 0)
		channel = 6
		select_ADC(channel);
		break;
	case 6:
		buffer[channel][ADC6_INDEX] = read_ADC(channel);
		(ADC6_INDEX < 30) ? (ADC6_INDEX++) : (ADC6_INDEX = 0)
		channel = 0
		select_ADC(channel);
		break;
}
Последний раз редактировалось unalex Ср фев 27, 2013 15:45:31, всего редактировалось 2 раза.
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Gudd-Head писал(а):Лол. А для одного канала вы как делаете? :)

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

interrupt [ADC_INT] void adc_isr(void)
{
buffer[ADC_INDEX]=ADCW;
ADC_INDEX++;
    if(ADC_INDEX>=30){ADC_INDEX=0;}
}

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
ADCSRA|=(1<<ADSC); // включения  АЦП  частота дискретизации 4КГц
}


while(1){
// основной код  подсчёт среднеквадратичного значений и вывод на дисплей. 
} 

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

void wait_ADC()
{
   while((ADCSRA & (1 << ADIF)) == 0);   //wait for Flag ADIF(conversion complete)
   ADCSRA |= (1 << ADIF);            //Reset conversion complete flag (ADIF = 1)
}
Примерно так и думал. Только не могу понять зачем ?Ведь во время прерывания нечего случится не может как выйдет из него так и закончилось преобразование =)
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Удалил свой недосмотр :)))
Последний раз редактировалось vitalik_1984 Ср фев 27, 2013 15:53:35, всего редактировалось 2 раза.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Сообщение unalex »

удалил свой комментарий о недосмотре пользователя vitalik_1984 :))
Последний раз редактировалось unalex Ср фев 27, 2013 16:19:02, всего редактировалось 1 раз.
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Ответить

Вернуться в «AVR»