АЦП и SPI AtTiny861

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

АЦП и SPI AtTiny861

Сообщение katbka »

Разработать контроллер, реализующий следующие функции: преобразование напряжения в диапазоне 0…5 В, количество каналов – 8, количество измерений на один канал – 16, погрешность преобразования – 0,2%, режим опроса каналов – циклический, частота – 50 кГц. Ввод данных – программный, по сигналу готовности.
По каждому каналу определить среднее арифметическое и большее значение передать по SPI на скорость 100 кГц с указанием номера канала. Начало обмена задает приемник информации, ввод – по прерыванию. Передача возможна, если цикл измерения завершен. Предусмотреть буфер для хранения результата.
Изображение
Изображение

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

for (i=0; i<=15; i++)     
      {
          ADMUX=0;                        //выбираем канал 0 АЦП
          ADCSRA|=0x40;                   //запускаем преобразование
          while (j==0) 
              {
                  j=ADCSRA.4;             //определяем состояние флага завершения преобразования АЦП   
              }                           //ждем завершения преобразования
          channel0[i]=ADCW;               //содержимое АЦП присваиваем массиву данных
и так по 8ми каналам. Но при симуляции в протеусе warning: adc ad converter reference value=0
в чем тут проблема?

и про SPI.. что подключить в протеусе? как называется?
и верно ли написан код

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

// Максимальное среднее значение по всем каналам - USR, номер канала - j
      
      //Определяем был ли запрос на передачу (по флагу прерывания) и передаем данные по SPI
      i=USISR.7;
      if (i==1)                            //если был запрос на передачу, передаем данные      
      { 
          USIDR=USR;
          USISR|=0x40;                    //инициируем процесс передачи
          while (i==0)
              {
                    i=USISR.6;            //определяем состояние флага завершения передачи                                   
              } 
      };
      };
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: АЦП и SPI AtTiny861

Сообщение SubDia »

1. Вывод 17 - AREF - источник опорного напряжения. Относительно чего измеряем-то? Конечно, Протеус ругается.
2. Называется SPI Debugger, во вкладке измерительных приборов.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

SubDia писал(а):1. Вывод 17 - AREF - источник опорного напряжения. Относительно чего измеряем-то? Конечно, Протеус ругается.
2. Называется SPI Debugger, во вкладке измерительных приборов.
1. и что к нему подсоединять, 15-AVCC?
2. не могу найти
извиняюсь за тупость вопросов. всем этим занимаюсь не по своей воле и 1й и последний, надеюсь, раз...
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: АЦП и SPI AtTiny861

Сообщение SubDia »

Можно посадить туда конденсатор, а в настройках регистров АЦП указать, что используется напряжение питания - и отсюда уже плясать.
Как вариант.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

SubDia писал(а):Можно посадить туда конденсатор, а в настройках регистров АЦП указать, что используется напряжение питания - и отсюда уже плясать.
Как вариант.
так в настройках CVA вроде стоит: Volt.Ref.: AVCC pin

по поводу SPI... мне сказали про терминал.. не можете подсказать где искать и как его подключить?
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: АЦП и SPI AtTiny861

Сообщение SubDia »

Никогда в жизни в CVAVR не пользовался визардом, посему могу только предполагать, что "Volt.Ref.: AVCC pin" - это и значит, что опорное напряжение - это и есть напряжения питания. Так что да, на AVCC нужно подать питание (хотя, вроде, Протеус сам распихивает все питания по умолчанию). Но попробуйте.
SPI дебаггер находится вот тут:
Изображение
Ножку IN дебаггера подключать к выводу MOSI контроллера (1-я). OUT дебаггера - к выводу MISO контроллера (2-я). Одноименные выводы SCK (3-й у МК) соединить. На мониторе дебаггера после запуска эмуляции будет виден процесс обмена. Если программа написана верно и все верно подключено.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

SubDia писал(а): Ножку IN дебаггера подключать к выводу MOSI контроллера (1-я). OUT дебаггера - к выводу MISO контроллера (2-я). Одноименные выводы SCK (3-й у МК) соединить. На мониторе дебаггера после запуска эмуляции будет виден процесс обмена. Если программа написана верно и все верно подключено.
спасибо Вам большое)
вроде так подключила.. а не выводит..
Изображение
вот код относительно кнопки и SPI

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

#define trans PINB.3
.....
// Инициализация интерфейса USI
// режим работыe: SPI
USICR=0x12;
....


// Максимальное среднее значение по всем каналам - USR, номер канала - j
                  
      while(trans){}//Ожидаем нажатие кнопки
      USISR.7=1;
      //Определяем был ли запрос на передачу (по флагу прерывания) и передаем данные по SPI
      i=USISR.7;
      if (i==1)                            //если был запрос на передачу, передаем данные      
      { 
          USIDR=USR;
          USISR|=0x40;                    //инициируем процесс передачи
          while (i==0)
              {
                    i=USISR.6;            //определяем состояние флага завершения передачи                                   
              } 
      };
      };
в чем моя, в очередной раз тупая, ошибка?
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

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

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

В интерфейсе SPI есть еще линия выбора устройства. В SPI дебаггере она называется SS (активный уровень - низкий). Перед началом передачи ее нужно опускать в 0, а после окончания возвращать в 1. У AVR-ок для этой линии выделяется один пин (или несколько, если несколько SPI-устройств) и управляется программно.

При инициализации нужно в DDRx.y и PORTx.y этого пина записать 1, перед выводом по SPI вставить "PORTx.y=0", а после передачи "PORTx.y=1".
Да и дебаггер должен быть в режиме slave или monitor...
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: АЦП и SPI AtTiny861

Сообщение Kavka »

katbka писал(а): частота – 50 кГц
Это на каждый из 8 каналов? Или на каждом канале 50/8=6.25 КГц. Хотя это всё равно. Даже для последнего варианта вы не сможете чётко указать, что вы получите указанную точность, так как в спецификации не нормируется ухудшение разрешения АЦП с увеличением частоты сэмплирования.
Прочитайте спецификацию на мегу - раздел про АЦП.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Kavka писал(а):
katbka писал(а): частота – 50 кГц
Это на каждый из 8 каналов? Или на каждом канале 50/8=6.25 КГц. Хотя это всё равно. Даже для последнего варианта вы не сможете чётко указать, что вы получите указанную точность, так как в спецификации не нормируется ухудшение разрешения АЦП с увеличением частоты сэмплирования.
Прочитайте спецификацию на мегу - раздел про АЦП.
да, это на каждый. сейчас у меня не с этим проблема)
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):В интерфейсе SPI есть еще линия выбора устройства. В SPI дебаггере она называется SS (активный уровень - низкий). Перед началом передачи ее нужно опускать в 0, а после окончания возвращать в 1. У AVR-ок для этой линии выделяется один пин (или несколько, если несколько SPI-устройств) и управляется программно.

При инициализации нужно в DDRx.y и PORTx.y этого пина записать 1, перед выводом по SPI вставить "PORTx.y=0", а после передачи "PORTx.y=1".
Да и дебаггер должен быть в режиме slave или monitor...

то есть SS дебагера подключить к какому-либо порту? например B?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

Да SS нужно подключить к PB5 или PB6 (можно к PB7, если RESET не жалко). Больше вроде свободных портов не осталось.
Аватара пользователя
Shapa
Встал на лапы
Сообщения: 127
Зарегистрирован: Пт июн 20, 2008 09:38:05
Откуда: Харьков
Контактная информация:

Re: АЦП и SPI AtTiny861

Сообщение Shapa »

Здравствуйте, katbka!
То, что бросилось в глаза:
1.

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

while(trans){}//Ожидаем нажатие кнопки
в Этом месте ваш код застопорится до нажатия кнопки. Думаю вы имелли ввиду:

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

if(!trans){}
т.е. если нажали, то передавать. (вскл. знак - отрицание. эквивалент trans != true)
Если да, то рекоменду делать так:

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

if(!!trans)
{
while(!trans); // ждём пока кнопка нажата
_delay_ms(10); // ожидаем пока контакты разойдутся
//выполнить ваш код передачи данных
}
2. Не ясно назначение вот этой конструкции

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

USISR.7=1;
      i=USISR.7;
      if (i==1)  
Вы присваиваете определённому биту значение, после его читаете и сравниваете с тем, чему присвоили...бессмыслеца какая-то
3. Вы используете модуль USI в SPI-он включени. Скажите пожалуйста в ТЗ описано, что именно так должно быть? мой опыт попыто использования USI-SPI(Attiny2313, attiny26) негативен. Модуль так и не заработал, как нужно. Я бы вам рекомендовал перейти на контроллер с аппаратным модулем SPI.
4. Вы выложите код полностью, это поможет найти остальыне ошибки.
Кажется всё
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: АЦП и SPI AtTiny861

Сообщение Kavka »

katbka писал(а):да, это на каждый. сейчас у меня не с этим проблема)
Так вот вам ещё одна проблема.
Считаем без учёта накладных расходов на переключение каналов.
50 кГц * 8 каналов = 400 кГц, т.е. 400 тыс. выборок в секунду, т.е. тактовая АЦП должна быть 400000 * 13 = 5200000Гц - это больше допустимого максимума по спецификации в 5.2 раз. Про точность даже говорить нечего.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

Shapa писал(а): 3. Вы используете модуль USI в SPI-он включени. Скажите пожалуйста в ТЗ описано, что именно так должно быть? мой опыт попыто использования USI-SPI(Attiny2313, attiny26) негативен. Модуль так и не заработал, как нужно. Я бы вам рекомендовал перейти на контроллер с аппаратным модулем SPI.
Использование USI в режиме SPI - это совершенно нормально, неоднократно использовал, в том числе в 2313, главное не забывать что нужна линия CS(SS). Единственная проблема - программная передача/прием данных.
Shapa писал(а): 4. Вы выложите код полностью, это поможет найти остальыне ошибки.
Полностью согласен.
Kavka писал(а):
katbka писал(а):да, это на каждый. сейчас у меня не с этим проблема)
Так вот вам ещё одна проблема.[...]
Вот тут надо повнимательнее. Либо "по другому понять" задание (например 50кГц - не на каждый канал, а на все вместе), либо придется брать другой контроллер или внешний АЦП, а это в любом случае глобальная переделка всего кода.
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

вот весь код с попытками добавить то, что советовали:

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

#include <tiny861.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x00
#define trans PINB.3

void main(void)
{
char j;                        //номер канала с максимальным средним значением 
char i;                        //cчетчик числа итераций цикла 
unsigned int USR;              //среднее арифметическое
unsigned int channel0[16];     //массив 16 измерений канала 0
unsigned int channel1[16];     //массив 16 измерений канала 1
unsigned int channel2[16];     //массив 16 измерений канала 2
unsigned int channel3[16];     //массив 16 измерений канала 3
unsigned int channel4[16];     //массив 16 измерений канала 4
unsigned int channel5[16];     //массив 16 измерений канала 5
unsigned int channel6[16];     //массив 16 измерений канала 6
unsigned int channel7[16];     //массив 16 измерений канала 7
unsigned int srednee[8];       //массив средних арифметических значений

// Коэффициент деления тактовой частоты: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Инициализация портов
// Инициализация порта A
PORTA=0x00;
DDRA=0x00;
// Инициализация порта В
PORTB=0x00;
DDRB=0x00;

// Инициализация интерфейса USI
// режим работыe: SPI
// тактовая частота: задается с входа USICLK
// прерывание: нет
USICR=0x12;

// Выключение аналогового компаратора
ACSRA=0x80;
ACSRB=0x00;

// Инициализация АЦП
// Тактовая частота АЦП: 625,000 кГц
// Опорное напряжение: напряжение питания
// Входное напряжение: однополярное
DIDR0=0x00;
DIDR1=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8C;
ADCSRB&=0x7F;
ADCSRB|=0x00 | ((ADC_VREF_TYPE & 0x100) >> 4);

while (1)
      {
      // Измерение напряжения при помощи встроенного АЦП
      for (i=0; i<=15; i++)     
      {
          ADMUX=0;                        //выбираем канал 0 АЦП
          ADCSRA|=0x40;                   //запускаем преобразование
          while (j==0) 
              {
                  j=ADCSRA.4;             //определяем состояние флага завершения преобразования АЦП   
              }                           //ждем завершения преобразования
          channel0[i]=ADCW;               //содержимое АЦП присваиваем массиву данных
          ADMUX=1;                        //выбираем канал 1 АЦП
          ADCSRA|=0x40;                   //запускаем преобразование
          while (j==0) 
              {
                  j=ADCSRA.4;             //определяем состояние флага завершения преобразования АЦП   
              }                           //ждем завершения преобразования
          channel1[i]=ADCW;               //содержимое АЦП присваиваем массиву данных
          ADMUX=2;                        //выбираем канал 2 АЦП
          ADCSRA|=0x40;                   //запускаем преобразование
          while (j==0) 
              {
                  j=ADCSRA.4;             //определяем состояние флага завершения преобразования АЦП   
              }                           //ждем завершения преобразования
          channel2[i]=ADCW;               //содержимое АЦП присваиваем массиву данных
          ADMUX=3;                        //выбираем канал 3 АЦП
          ADCSRA|=0x40;                   //запускаем преобразование
          while (j==0) 
              {
                  j=ADCSRA.4;             //определяем состояние флага завершения преобразования АЦП   
              }                           //ждем завершения преобразования
          channel3[i]=ADCW;               //содержимое АЦП присваиваем массиву данных
          ADMUX=4;                        //выбираем канал 5 АЦП
          ADCSRA|=0x40;                   //запускаем преобразование
          while (j==0) 
              {
                  j=ADCSRA.4;             //определяем состояние флага завершения преобразования АЦП   
              }                           //ждем завершения преобразования
          channel4[i]=ADCW;               //содержимое АЦП присваиваем массиву данных
          ADMUX=5;                        //выбираем канал 5 АЦП
          ADCSRA|=0x40;                   //запускаем преобразование
          while (j==0) 
              {
                  j=ADCSRA.4;             //определяем состояние флага завершения преобразования АЦП   
              }                           //ждем завершения преобразования
          channel5[i]=ADCW;               //содержимое АЦП присваиваем массиву данных
          ADMUX=6;                        //выбираем канал 6 АЦП
          ADCSRA|=0x40;                   //запускаем преобразование
          while (j==0) 
              {
                  j=ADCSRA.4;             //определяем состояние флага завершения преобразования АЦП   
              }                           //ждем завершения преобразования
          channel6[i]=ADCW;               //содержимое АЦП присваиваем массиву данных
          ADMUX=7;                        //выбираем канал 7 АЦП
          ADCSRA|=0x40;                   //запускаем преобразование
          while (j==0) 
              {
                  j=ADCSRA.4;             //определяем состояние флага завершения преобразования АЦП   
              }                           //ждем завершения преобразования
          channel7[i]=ADCW;               //содержимое АЦП присваиваем массиву данных
      }
      // Расчет среднего арифметического значения напряжения по каналу 0
      USR=0;
      for (i=0; i<=15; i++)     
      {
          USR=USR+channel0[i];            //суммируем значения массива данных
      }
      USR=USR/16;                         //находим среднее значение
      srednee[0]=USR;                     //присваиваем результат массиву средних значений
      // Расчет среднего арифметического значения напряжения по каналу 1
      USR=0;
      for (i=0; i<=15; i++)     
      {
          USR=USR+channel1[i];            //суммируем значения массива данных
      }
      USR=USR/16;                         //находим среднее значение
      srednee[1]=USR;                     //присваиваем результат массиву средних значений
      // Расчет среднего арифметического значения напряжения по каналу 2
      USR=0;
      for (i=0; i<=15; i++)     
      {
          USR=USR+channel2[i];            //суммируем значения массива данных
      }
      USR=USR/16;                         //находим среднее значение
      srednee[2]=USR;                     //присваиваем результат массиву средних значений
      // Расчет среднего арифметического значения напряжения по каналу 3
      USR=0;
      for (i=0; i<=15; i++)     
      {
          USR=USR+channel3[i];            //суммируем значения массива данных
      }
      USR=USR/16;                         //находим среднее значение
      srednee[3]=USR;                     //присваиваем результат массиву средних значений
      // Расчет среднего арифметического значения напряжения по каналу 4
      USR=0;
      for (i=0; i<=15; i++)     
      {
          USR=USR+channel4[i];            //суммируем значения массива данных
      }
      USR=USR/16;                         //находим среднее значение
      srednee[4]=USR;                     //присваиваем результат массиву средних значений
      // Расчет среднего арифметического значения напряжения по каналу 5
      USR=0;
      for (i=0; i<=15; i++)     
      {
          USR=USR+channel5[i];            //суммируем значения массива данных
      }
      USR=USR/16;                         //находим среднее значение
      srednee[5]=USR;                     //присваиваем результат массиву средних значений
      // Расчет среднего арифметического значения напряжения по каналу 6
      USR=0;
      for (i=0; i<=15; i++)     
      {
          USR=USR+channel6[i];            //суммируем значения массива данных
      }
      USR=USR/16;                         //находим среднее значение
      srednee[6]=USR;                     //присваиваем результат массиву средних значений
      // Расчет среднего арифметического значения напряжения по каналу 7
      USR=0;
      for (i=0; i<=15; i++)     
      {
          USR=USR+channel7[i];            //суммируем значения массива данных
      }
      USR=USR/16;                         //находим среднее значение
      srednee[7]=USR;                     //присваиваем результат массиву средних значений
      // Расчет максимального значения среди средних арифметических
      USR=0;
      j=0;
      for (i=0; i<=7; i++)     
      {
          if (USR>srednee[i]) 
              { 
                    USR=srednee[i];       //суммируем значения массива данных
                    j=i;                  //меняем номер канала
              };
      }
      // Максимальное среднее значение по всем каналам - USR, номер канала - j
      
      
      if(!!trans)
      {
        while(!trans); // ждём пока кнопка нажата
        delay_ms(10); // ожидаем пока контакты разойдутся 
        PINB.5=0;
        USIDR=USR;
        USISR|=0x40;                    //инициируем процесс передачи
        while (i==0)
           {
                i=USISR.6;            //определяем состояние флага завершения передачи                                   
           }
        PINB.5=1;
      };
      };
}
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Shapa писал(а):Здравствуйте, katbka!
То, что бросилось в глаза:
1.

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

while(trans){}//Ожидаем нажатие кнопки
в Этом месте ваш код застопорится до нажатия кнопки. Думаю вы имелли ввиду:

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

if(!trans){}
т.е. если нажали, то передавать. (вскл. знак - отрицание. эквивалент trans != true)
Если да, то рекоменду делать так:

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

if(!!trans)
{
while(!trans); // ждём пока кнопка нажата
_delay_ms(10); // ожидаем пока контакты разойдутся
//выполнить ваш код передачи данных
}
я пыталась сделать так, чтобы именно ожидал нажатия кнопки. Но можно и как Вы говорите..
2. Не ясно назначение вот этой конструкции
Shapa писал(а):

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

USISR.7=1;
      i=USISR.7;
      if (i==1)  
Вы присваиваете определённому биту значение, после его читаете и сравниваете с тем, чему присвоили...бессмыслеца какая-то
ну тут сама себя запутала. просто делала вид что запрос на передачу посылает "как будто" какое-то устройсво. в данном случае это только кнопка.
Shapa писал(а): 3. Вы используете модуль USI в SPI-он включени. Скажите пожалуйста в ТЗ описано, что именно так должно быть? мой опыт попыто использования USI-SPI(Attiny2313, attiny26) негативен. Модуль так и не заработал, как нужно. Я бы вам рекомендовал перейти на контроллер с аппаратным модулем SPI.
4. Вы выложите код полностью, это поможет найти остальыне ошибки.
Кажется всё
из ТЗ:
При выборе ОМК в соответствии с разработанной структурой необходимо оценить состав резидентных средств ( ОЗУ, ПЗУ, периферийные блоки и так далее), требуемое количество линий ввода-вывода, быстродействие.
При этом следует контролировать отсутствие избыточности рези-дентных периферийных блоков, так как это приводит к увеличению стоимости микросхемы ОМК и МПУ.
В тех случаях , когда быстродействие не является определяющим, возможна программная реализация недостающих периферийных блоков. Однако необходимо контролировать требуемые ресурсы памяти программ, данных, линий ввода-вывода.
Использование внешних периферийных устройств целесообразно, если необходимые блоки отсутствуют в выбранном ОМК или не отвечают требованиям технического задания.

Весь код в сообщении выше.
спасибо за помощь)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

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

        PINB.5=0;
        USIDR=USR;
        USISR|=0x40;                    //инициируем процесс передачи
        while (i==0)
           {
                i=USISR.6;            //определяем состояние флага завершения передачи                                   
           }
        PINB.5=1;
      };
      };
}
PINB - это для чтения порта, для установки/сброса нужно писать в PORTB.
Насчет остального кода не знаю. Надеюсь только что компилятор "правильно" делит на 16...
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а): PINB - это для чтения порта, для установки/сброса нужно писать в PORTB.
Насчет остального кода не знаю. Надеюсь только что компилятор "правильно" делит на 16...
вот.
так?

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

 if(!!trans)
      {
        while(!trans); // ждём пока кнопка нажата
        delay_ms(10); // ожидаем пока контакты разойдутся 
        PORTB.5=0;
        USIDR=USR;
        USISR|=0x40;                    //инициируем процесс передачи
        while (i==0)
           {
                i=USISR.6;            //определяем состояние флага завершения передачи                                   
           }
        PORTB.5=1;
      }
при моделировании контакт SS красный.. и ничего не выводит...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»