АЦП и SPI AtTiny861

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

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

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

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):Кстати в DDRB везде нули, а надо 1 в тех битах, которые на выход.
прописала:

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

DDRB.0=1;
DDRB.1=1;
DDRB.2=1;
DDRB.5=1;
оно задышало) только не так видимо как надо:
Изображение
Реклама
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

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

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):В цикл где происходит передача данных нужно дописать тактирование модуля USI, не знаю как там в 861 регистр называется, нужно даташит глянуть, там кстати и пример передачи должен быть.
пример есть, но на асме. регистр
USICR — регистр управления
он?
7ой бит USISIE — разрешение прерывания по обнаружению состояния СТАРТ
6ой бит USIOIE — разрешение прерывания при переполнении счетчика
5ый бит USIWM1 и 4ый бит USIWM0 — режим работы модуля USI
3ий бит USICS1 и 2ой бит USICS0 – выбор источника тактового сигнала
1ый бит USICLK — строб тактового сигнала
0ой бит USITC — переключение состояния вывода тактового сигнала

т.е. 3, 2 и 1 биты?
Изображение

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

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

Не пишу на Си, но наверно так...

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

      PORTB.5=0;
        USIDR=USR;
        USISR=(1<<USIOIF);                    //инициируем процесс передачи
        while (i==0)
           {
          USICR=(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)
        i=USISR.6;            //определяем состояние флага завершения передачи                                   
           }
        PORTB.5=1;
Кстати нужно еще предусмотреть что эта процедура выводит 8-битные числа, а у USR тип int!
Реклама
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):Не пишу на Си, но наверно так...

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

      PORTB.5=0;
        USIDR=USR;
        USISR=(1<<USIOIF);                    //инициируем процесс передачи
        while (i==0)
           {
          USICR=(1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)
        i=USISR.6;            //определяем состояние флага завершения передачи                                   
           }
        PORTB.5=1;
Кстати нужно еще предусмотреть что эта процедура выводит 8-битные числа, а у USR тип int!
у меня такое чувство, что оно никогда не заработает...
ругается CVAVR на USIOIF и USIWM0... что тут может быть не так?
Реклама
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

katbka писал(а):ругается CVAVR на USIOIF и USIWM0... что тут может быть не так?
CVAVR не знает как называются биты в регистрах ? :facepalm:
Значит придется писать тупо циферками...
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):
katbka писал(а):ругается CVAVR на USIOIF и USIWM0... что тут может быть не так?
CVAVR не знает как называются биты в регистрах ? :facepalm:
Значит придется писать тупо циферками...
я знаю, я тупая.. но я не понимаю какие циферки писать(
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

Смотрим даташит:
регистр USISR, бит USIOIF - 6-й, значит пишем USISR=0x40
регистр USICR, биты USIWM0-4й, USICS1-3й, USICLK-1й, USITC-0й, пишем: USICR=0x1B
Может нужно просто где-то в настройках контроллер определить или какой-нибудь файл с определениями подключить, странно что компилятор не знает имена битов, а на имена регистров он не ругается :dont_know:

Добавлено через 4 часа...

Я тут прикинул...
Если взять частоту 8МГц, (это максимум встроенного генератора, внешний использовать нельзя, его ноги заняты под АЦП) то даже если принять что частота АЦП будет получена делением тактовой на 2 получаем частоту АЦП~38 киловыборок в секунду для каждого канала (8000000МГц/2/13тактов/8каналов), т.е значительно меньше 50кГц.
Практически же получается еще меньше - 37кГц, если писать на ассемблере: оптимизировать уже некуда и разрядность АЦП взята 8бит. Я не говорю про точность, которая неизвестно как пострадает при таком зверском повышении тактовой частоты АЦП.
Вот такая информация к размышлению.
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):Смотрим даташит:
регистр USISR, бит USIOIF - 6-й, значит пишем USISR=0x40
регистр USICR, биты USIWM0-4й, USICS1-3й, USICLK-1й, USITC-0й, пишем: USICR=0x1B
Может нужно просто где-то в настройках контроллер определить или какой-нибудь файл с определениями подключить, странно что компилятор не знает имена битов, а на имена регистров он не ругается :dont_know:

Добавлено через 4 часа...

Я тут прикинул...
Если взять частоту 8МГц, (это максимум встроенного генератора, внешний использовать нельзя, его ноги заняты под АЦП) то даже если принять что частота АЦП будет получена делением тактовой на 2 получаем частоту АЦП~38 киловыборок в секунду для каждого канала (8000000МГц/2/13тактов/8каналов), т.е значительно меньше 50кГц.
Практически же получается еще меньше - 37кГц, если писать на ассемблере: оптимизировать уже некуда и разрядность АЦП взята 8бит. Я не говорю про точность, которая неизвестно как пострадает при таком зверском повышении тактовой частоты АЦП.
Вот такая информация к размышлению.

а ситуация с spi не изменилась.. только теперь еще и SCK горит красным...
надо разобраться с spi.. а по поводу точности.. посмотрим что преподаватель скажет...
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):Смотрим даташит:
регистр USISR, бит USIOIF - 6-й, значит пишем USISR=0x40
регистр USICR, биты USIWM0-4й, USICS1-3й, USICLK-1й, USITC-0й, пишем: USICR=0x1B
Может нужно просто где-то в настройках контроллер определить или какой-нибудь файл с определениями подключить, странно что компилятор не знает имена битов, а на имена регистров он не ругается :dont_know:
хотя нет.. вот..
Изображение
по-моему он таки не передает...
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

Передает... Но почему-то нули...
Так. Ясно...
Грабли номер раз: идиоты из Atmel опять переставили ноги MISO и MOSI для USI в противоположное состояние относительно ISP, как они сделали это с tiny2313 :facepalm:
Ногами интерфейса USI нужно считать не ноги MOSI-MISO, а ноги DI-DO, они как раз наоборот, там что ногу DIN SPI-дебаггера нужно подключать к ноге PB1, а не к PB0. DDRB в инициализации соответственно тоже поправить.
Грабли номер два: до или после передачи данных нужно сбрасывать и бит USIOIF и счетчик USICNT. Я всегда использовал длинный, но быстрый вывод, где просто подается 16 тактов на счетчик, и проверять флаг мне не было необходимости. В алгоритме с циклом это не прокатит.

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

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

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):Передает... Но почему-то нули...
Так. Ясно...
Грабли номер раз: идиоты из Atmel опять переставили ноги MISO и MOSI для USI в противоположное состояние относительно ISP, как они сделали это с tiny2313 :facepalm:
Ногами интерфейса USI нужно считать не ноги MOSI-MISO, а ноги DI-DO, они как раз наоборот, там что ногу DIN SPI-дебаггера нужно подключать к ноге PB1, а не к PB0. DDRB в инициализации соответственно тоже поправить.
Грабли номер два: до или после передачи данных нужно сбрасывать и бит USIOIF и счетчик USICNT. Я всегда использовал длинный, но быстрый вывод, где просто подается 16 тактов на счетчик, и проверять флаг мне не было необходимости. В алгоритме с циклом это не прокатит.

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

        
PORTB.5=0;
       USIDR=USR;
        USISR=0xF0;                    //инициируем процесс передачи (сброс флагов и счетчика)
        while (i==0)
           {
          USICR=0x1B
        i=USISR.6;            //определяем состояние флага завершения передачи                                   
           }
PORTB.5=1;
сделала...

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

// Инициалиация порта B
PORTB=0x00;
DDRB=0x00;
DDRB.1=1;
DDRB.2=1; 
DDRB.5=1;
как я поняла, так. теперь ничего не выводит...
Изображение
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

Не знаю, у меня на ассемблере все работает. Выкладываю "образец", может понадобится. Каментов минимум, некогда было писать. До понедельника больше не подскажу.
Вложения
ADC_Tiny861.rar
Прошивка, проект, исходник(асм)
(13.42 КБ) 161 скачивание
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):Не знаю, у меня на ассемблере все работает. Выкладываю "образец", может понадобится. Каментов минимум, некогда было писать. До понедельника больше не подскажу.
то есть он еще и не должен так постоянно моргать, как у меня?

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

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

Кто должен моргать? Сделали 16 измерений на каждый канал, подождали нажатия на кнопку, выдали 8 средних значений, и все сначала. Так?
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):Кто должен моргать? Сделали 16 измерений на каждый канал, подождали нажатия на кнопку, выдали 8 средних значений, и все сначала. Так?
ну там еще максимальное из них находится и оно передается. но суть не в том. у меня, когда запускаю, spi сразу начинает постоянно писать: active, inactive. то есть то. что на скриншоте. много-много раз...
Аватара пользователя
Shapa
Встал на лапы
Сообщения: 127
Зарегистрирован: Пт июн 20, 2008 09:38:05
Откуда: Харьков
Контактная информация:

Re: АЦП и SPI AtTiny861

Сообщение Shapa »

katbka писал(а): ну там еще максимальное из них находится и оно передается. но суть не в том. у меня, когда запускаю, spi сразу начинает постоянно писать: active, inactive. то есть то. что на скриншоте. много-много раз...
Конечно оно мигает:) И вас мучает вопрос почему...мигает оно потому, что вы его заставили так работать

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

PORTB.5=0;
       USIDR=USR;
        USISR=0xF0;                    //инициируем процесс передачи (сброс флагов и счетчика)
        while (i==0)
           {
          USICR=0x1B
        i=USISR.6;            //определяем состояние флага завершения передачи                                   
           }
PORTB.5=1
и это правильно. С SPI именно так работать и надо: Активировали нужное нам устройство (линию CS/SS) опустили в 0. Передали данные, подняли линию СS в еденичку. Потому что мало ли, вдруг у нас на одной шине SPI весит 10 разных устройств: часы, камера, флешка и т.д. (для каждого из устройств будет своя линия CS/SS - Chip Select, Slave Select, выбор "партнёра для общения")

А теперь попробую по полочкам...Катерина, вы запутались в трёх соснах. И проблема ваша, как и всех новичков, в том, что вы сразу пытаетесь написать весь код. Так не делают. К сожалению для большинства микроконтроллеров используемых радиолюбителям и начинающими специалистами нет доступных средств отладки. Симуляторы позволяют немного решить эту проблему, но лишь очень в узком дипозоне возможностей. А внутрисхемные дебагеры...не по карману студенту. Что-то не в ту степь ушел. ИТАК! Вам я рекомендую: создать новый проект, и переносить в него части уже проверенного кода. Проверяйте все что можно через дебагер (отладчик). Используйте функции!
например опишите функцию записи по SPI

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

void SPI_write_byte(unsigned char data)
{
       PORTB.5=0;
       USIDR=data;
       USISR=0xF0;                   
       while (!USISR.6)
             USICR=0x1B                                       
       PORTB.5=1
}// за работоспособность данной функции я не ручаюсь, я лишь скопировал ваш код, удалив лишнее
Думаю для данной курсовой работы вам хватит возможнсотей Codevision. Но я настойчиво рокемендую перейти на AVr studio 5. Во-первых первисточник ВСЕГДА ближе к истине. Во-вторых они бесплатния и не имеет ограничений по размеру кода. Да, там нем готовых бибилотек и красивой работы с бтами в регистрах. Но это легко решается использыванием побитовых опираций и сложности с этим возникают тольк ов самый первый раз. В третьих поддержка средств внутрихсемной отладки (котрые вы можете не покупать, а собрать сами)
Но всё это актуально лишь в том случае, если вам предстоит продолжать заниматься МК и собирать устройства в железе....
Если у вас есть кча мелких вопросов, даже самых "глупых" смело обращайтесь в ЛС, или ICQ, чем смогу - тем помогу
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

katbka писал(а):когда запускаю, spi сразу начинает постоянно писать: active, inactive. то есть то. что на скриншоте. много-много раз...
Это значит что во-первых все работает без ожидания нажатия на кнопку.
Во-вторых данные не передаются, должно выглядеть примерно так:
SPI_1.PNG
(8.96 КБ) 440 скачиваний
Не понятно почему ничего не передается, ведь код (как мне кажется) аналогичен.

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

	CBI	PORTB,PB6  ; = "PORTB.5=0"
	OUT	USIDR,R19 ; = "USIDR=USR"
	LDI	R19,0xF0 ;
	OUT	USISR,R19 ; = "USISR=0xF0"
SPI_LOOP: ; = "{"
	LDI	R19,0x1B  ;
	OUT	USICR,R19 ; = "USICR=0x1B"
	IN	R19,USISR ; = "i=USISR.6"
	SBRS	R19,USIOIF ; = "}"
	RJMP	SPI_LOOP ;= "while (i==0)"
	SBI	PORTB,PB6 ; ="PORTB.5=1"
Может из-за того, что USR - не однобайтное число, или компилятор как-то выносит за скобки "повторяющееся действие" - USICR=0x1B...
Нужно попробовать передать вместо USR какое-нибудь число (константу) размером в байт.
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):
katbka писал(а):когда запускаю, spi сразу начинает постоянно писать: active, inactive. то есть то. что на скриншоте. много-много раз...
Это значит что во-первых все работает без ожидания нажатия на кнопку.
Во-вторых данные не передаются, должно выглядеть примерно так:
SPI_1.PNG
Не понятно почему ничего не передается, ведь код (как мне кажется) аналогичен.

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

	CBI	PORTB,PB6  ; = "PORTB.5=0"
	OUT	USIDR,R19 ; = "USIDR=USR"
	LDI	R19,0xF0 ;
	OUT	USISR,R19 ; = "USISR=0xF0"
SPI_LOOP: ; = "{"
	LDI	R19,0x1B  ;
	OUT	USICR,R19 ; = "USICR=0x1B"
	IN	R19,USISR ; = "i=USISR.6"
	SBRS	R19,USIOIF ; = "}"
	RJMP	SPI_LOOP ;= "while (i==0)"
	SBI	PORTB,PB6 ; ="PORTB.5=1"
Может из-за того, что USR - не однобайтное число, или компилятор как-то выносит за скобки "повторяющееся действие" - USICR=0x1B...
Нужно попробовать передать вместо USR какое-нибудь число (константу) размером в байт.
попробую..
уже и программный spi пыталась писать.. Точнее, Shapa показал что и как... все равно не лучше результат...
Закрыто

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