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

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

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

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

Зачем лишнее сравнение?
Что бы выйти в любом месте, а не дожидаться конца цикла. Тем более, что вопрос и был в том, как выйти.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Даже такой код выдаёт туже ошибку. Видать и правда что-то с таймером хотя он не так уже и быстро включает :(

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

interrupt [ADC_INT] void adc_isr(void)
{
switch (chanel){
            case 0:{
                  chanel1=ADCW;
                  break;
            }
            case 6:{
                //  chanel6=ADCW; 
                  break;
            }
}
}
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

сообщение удалил, сорри за невнимательность
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Удалил свой комментарий о невнимательности пользователя unalex :)
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

чего весь проект не выкладываем? Военная разработка? Может это глюк протеуса, бывает с ним всякое, даже один и тот же проект заново созданный бывает работает с той же самой прошивкой, с которой не работает первоначально созданный.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Там черт ногу сломит :) Сильно не бейте.
ADC+LCD CKO.rar
(164.46 КБ) 127 скачиваний
Аватара пользователя
servo
Встал на лапы
Сообщения: 88
Зарегистрирован: Вс окт 30, 2011 22:52:51

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

Сообщение servo »

Аlex писал(а):
servo писал(а):Как правильно это сделать не могли бы Вы примерчик накидать :)

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

char* func(){
static char arr[16];   // Создаём массив
............           // Работаем с массивом
............           //
............           //
return arr;            // Возвращаем указатель на массив
}


что-то не получается :)

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

//в заголовочном файле объявляю массив
static byte my_files[50][11];


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

//функция в библиотеке
 byte* fat_find_name_files() {
      byte i;
      byte f; //Счетчик прочитаных записей
     
     
      addr.al=rootoff; //Будем пролистывать все сначала, т.е. сначала корневой директории
 do {
      sd_read(addr); //Читаем
      f=0;
      do {
         for (i=0;i<11;i++) my_files[f][i]=sd_byte(); //Читаем имя
         sd_skip(21); //Пропускам 21 байт
         
         f++;
           if (my_files[f][0]==0)
           { //Закончились записи
               sd_skip(514-(f<<5)); //Дочитаем не дочитаное (пропустим) + CRC 2 байта
               return 0; //Ни чего не нашли
           }
           //Если равно 0xe5, это удаленая запись
           //Так же проверяется атрибуты и имя
           if (my_files[f][0]!=0xe5)
           {
               sd_skip(514-(f<<5));
               //return 1; //Что-то есть :)
           }
      } while(f<16); //Пока не прочитали 16 записей 16*32(размер записи)=512(размер блока) байт
     
      sd_skip(2); //CRC
      addr.al+=512; //Следующий блок
     
 } while(addr.al<dataoff); //Пока не кончатся записи
 
 return my_files;
}


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

//тут пытаюсь получить данные из массива из основного кода
 do{
  for (i=0;i<11;i++) FileNameArray[f][i] = *fat_find_name_files();
  f++;
  }while(FileNameArray[f][i]!=0);



компиль выдает ошибку : Library error: D:\_____________.c(170): incompatible return expression of type 'byte [50][11]', expect a 'flash byte'
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Аlex писал(а):
Зачем лишнее сравнение?
Что бы выйти в любом месте, а не дожидаться конца цикла. Тем более, что вопрос и был в том, как выйти.

Ну да, только таких сравнений нужно по всему циклу натыкать, чтобы в любом месте выйти.
pokk писал(а):Частота синхронизации АЦП 62 кГц
А запуск преобразования от таймера 4 кГц (250us).

Что то ваш делитель http://SSMaker.ru/a5f60959/ не совпадает с вашими расчетами.
http://SSMaker.ru/445aec9c/
Поправил
http://SSMaker.ru/81e95283/
Работает без без предупреждений, думаю, что остальное самостоятельно проверите?
Спойлер

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

void INIT_TIMER(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7.813 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x07;
OCR1AL=0xCF;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
Последний раз редактировалось vitalik_1984 Вс мар 03, 2013 21:59:17, всего редактировалось 2 раза.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

таких сравнений нужно по всему циклу натыкать, чтобы в любом месте выйти
Естественно. Откуда нужно прервать цикл, туда и "тыкать". :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

компиль выдает ошибку :
Это уже к фанатам CV. Тут я пас :roll:
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

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

...
 
 return *my_files;
}


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

//тут пытаюсь получить данные из массива из основного кода
 do{
  for (i=0;i<11;i++) FileNameArray[f][i] = *(fat_find_name_files() + f*sizeof(byte) + i);
  f++;
  }while(FileNameArray[f][i]!=0);
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

vitalik_1984, а что эта за программка во второй картинке ?
при расчёте таймера у меня что-то там не сходилось я посчитал одни значение получилось а CV выдал другое долго смотрел где накосячил так и не нашёл и кажись свои значения взял уже не помню. Потом проверил это в протеусе в таймере написал porb=1; в главном цикле portb=0; и осциллографом по мерил интервал он выдал 252us.

Благодарю за помощь сейчас с таймером буду разбираться.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

unalex писал(а):

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

...
 
 return *my_files;
}
Так возвратится значение по адресу my_files, а не указатель.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

Аlex
servo писал(а):получить данные из массива из основного кода

неужели мой код не получил данные из массива?
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

vitalik_1984 писал(а):Работает без без предупреждений, думаю, что остальное самостоятельно проверите?
Спойлер

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

void INIT_TIMER(void)
{
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7.813 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x07;
OCR1AL=0xCF;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
}
 


а у меня всё так же =( только чуть медленнее ошибки пошли

Пока разбирался возник по таймеру вопрос
подставил всё в формулу из datasheet atmega128 стр 124
Изображение
Получил
Изображение
что-то 4000 Гц не пахнет. Видать по этому я и поставил другой делитель не 1024. И частота ошибок как раз из за этого уменьшилась.
Может не по той формуле посчитал ?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

unalex писал(а):неужели мой код не получил данные из массива?
Получил, но не все и не известно какие :)
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

Аlex писал(а):Получил, но не все и не известно какие


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

FileNameArray[f][i] = *(fat_find_name_files() + f*sizeof(byte) + i);


какие просит, такие и даем
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

unalex учите С. Аlex вам написал, что

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

return *my_files;
... это ни о чем.
можно написать

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

return my_files;
либо

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

return &my_files[0][0];


PS. еще один момент - возврат указателя на массив в вашем случае не нужен, так как массив не создается динамически и его адрес и так известен.....
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

Вообще если честно я не вижу вообще смысла возвращать ни сам массив ни указатель на него
функция отработала, модифицировала массив, бери и читай
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

unalex , откуда тогда взяться универсальности? Указатель нужен для того, чтобы пихнуть функции любые данные, либо вернуть в произвольное место.
Хотя с другой стороны, лучше возвращать удачна ли операция или сколько получилось циклов в случае, если функция с циклом внутри и что либо считает.
pokk Это простой онлайн калькулятор таймера AVR первый попавшийся в поиске.
В поисках истины человек развивается.
Ответить

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