Страница 245 из 421

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

Добавлено: Вс мар 03, 2013 17:50:20
Аlex
Зачем лишнее сравнение?
Что бы выйти в любом месте, а не дожидаться конца цикла. Тем более, что вопрос и был в том, как выйти.

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

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

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

interrupt [ADC_INT] void adc_isr(void)
{
switch (chanel){
            case 0:{
                  chanel1=ADCW;
                  break;
            }
            case 6:{ 
                //  chanel6=ADCW;  
                  break;
            }
}
}

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

Добавлено: Вс мар 03, 2013 19:37:09
unalex
сообщение удалил, сорри за невнимательность

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

Добавлено: Вс мар 03, 2013 19:40:45
pokk
Удалил свой комментарий о невнимательности пользователя unalex :)

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

Добавлено: Вс мар 03, 2013 19:49:03
vitalik_1984
чего весь проект не выкладываем? Военная разработка? Может это глюк протеуса, бывает с ним всякое, даже один и тот же проект заново созданный бывает работает с той же самой прошивкой, с которой не работает первоначально созданный.

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

Добавлено: Вс мар 03, 2013 19:54:46
pokk
Там черт ногу сломит :) Сильно не бейте.
ADC+LCD CKO.rar
(164.46 КБ) 129 скачиваний

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

Добавлено: Вс мар 03, 2013 20:47:19
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'

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

Добавлено: Вс мар 03, 2013 21:42:32
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;
} 

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

Добавлено: Вс мар 03, 2013 21:58:05
Аlex
таких сравнений нужно по всему циклу натыкать, чтобы в любом месте выйти
Естественно. Откуда нужно прервать цикл, туда и "тыкать". :)

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

Добавлено: Вс мар 03, 2013 22:15:45
Аlex
компиль выдает ошибку :
Это уже к фанатам CV. Тут я пас :roll:

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

Добавлено: Пн мар 04, 2013 00:26:34
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);

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

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

Благодарю за помощь сейчас с таймером буду разбираться.

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

Добавлено: Пн мар 04, 2013 09:07:25
Аlex
unalex писал(а):

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

...
 
 return *my_files;
}
Так возвратится значение по адресу my_files, а не указатель.

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

Добавлено: Пн мар 04, 2013 10:21:49
unalex
Аlex
servo писал(а):получить данные из массива из основного кода
неужели мой код не получил данные из массива?

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

Добавлено: Пн мар 04, 2013 10:58:00
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. И частота ошибок как раз из за этого уменьшилась.
Может не по той формуле посчитал ?

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

Добавлено: Пн мар 04, 2013 11:32:27
Аlex
unalex писал(а):неужели мой код не получил данные из массива?
Получил, но не все и не известно какие :)

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

Добавлено: Пн мар 04, 2013 12:18:56
unalex
Аlex писал(а):Получил, но не все и не известно какие

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

FileNameArray[f][i] = *(fat_find_name_files() + f*sizeof(byte) + i);
какие просит, такие и даем

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

Добавлено: Пн мар 04, 2013 14:17:03
ChipKiller
unalex учите С. Аlex вам написал, что

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

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

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

return my_files;
либо

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

return &my_files[0][0];
PS. еще один момент - возврат указателя на массив в вашем случае не нужен, так как массив не создается динамически и его адрес и так известен.....

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

Добавлено: Пн мар 04, 2013 15:42:44
unalex
Вообще если честно я не вижу вообще смысла возвращать ни сам массив ни указатель на него
функция отработала, модифицировала массив, бери и читай

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

Добавлено: Пн мар 04, 2013 21:49:15
vitalik_1984
unalex , откуда тогда взяться универсальности? Указатель нужен для того, чтобы пихнуть функции любые данные, либо вернуть в произвольное место.
Хотя с другой стороны, лучше возвращать удачна ли операция или сколько получилось циклов в случае, если функция с циклом внутри и что либо считает.
pokk Это простой онлайн калькулятор таймера AVR первый попавшийся в поиске.