АЦП и SPI AtTiny861
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: АЦП и SPI AtTiny861
Кстати в DDRB везде нули, а надо 1 в тех битах, которые на выход.
- Реклама
Re: АЦП и SPI AtTiny861
прописала: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
В цикл где происходит передача данных нужно дописать тактирование модуля USI, не знаю как там в 861 регистр называется, нужно даташит глянуть, там кстати и пример передачи должен быть.
Re: АЦП и SPI AtTiny861
пример есть, но на асме. регистр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
Не пишу на Си, но наверно так...
Кстати нужно еще предусмотреть что эта процедура выводит 8-битные числа, а у USR тип int!
Код: Выделить всё
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;
- Реклама
Re: АЦП и SPI AtTiny861
у меня такое чувство, что оно никогда не заработает...Engineer_Keen писал(а):Не пишу на Си, но наверно так...Кстати нужно еще предусмотреть что эта процедура выводит 8-битные числа, а у USR тип int!Код: Выделить всё
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;
ругается CVAVR на USIOIF и USIWM0... что тут может быть не так?
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: АЦП и SPI AtTiny861
CVAVR не знает как называются биты в регистрах ?katbka писал(а):ругается CVAVR на USIOIF и USIWM0... что тут может быть не так?
Значит придется писать тупо циферками...
Re: АЦП и SPI AtTiny861
я знаю, я тупая.. но я не понимаю какие циферки писать(Engineer_Keen писал(а):CVAVR не знает как называются биты в регистрах ?katbka писал(а):ругается CVAVR на USIOIF и USIWM0... что тут может быть не так?![]()
Значит придется писать тупо циферками...
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: АЦП и SPI AtTiny861
Смотрим даташит:
регистр USISR, бит USIOIF - 6-й, значит пишем USISR=0x40
регистр USICR, биты USIWM0-4й, USICS1-3й, USICLK-1й, USITC-0й, пишем: USICR=0x1B
Может нужно просто где-то в настройках контроллер определить или какой-нибудь файл с определениями подключить, странно что компилятор не знает имена битов, а на имена регистров он не ругается
Добавлено через 4 часа...
Я тут прикинул...
Если взять частоту 8МГц, (это максимум встроенного генератора, внешний использовать нельзя, его ноги заняты под АЦП) то даже если принять что частота АЦП будет получена делением тактовой на 2 получаем частоту АЦП~38 киловыборок в секунду для каждого канала (8000000МГц/2/13тактов/8каналов), т.е значительно меньше 50кГц.
Практически же получается еще меньше - 37кГц, если писать на ассемблере: оптимизировать уже некуда и разрядность АЦП взята 8бит. Я не говорю про точность, которая неизвестно как пострадает при таком зверском повышении тактовой частоты АЦП.
Вот такая информация к размышлению.
регистр USISR, бит USIOIF - 6-й, значит пишем USISR=0x40
регистр USICR, биты USIWM0-4й, USICS1-3й, USICLK-1й, USITC-0й, пишем: USICR=0x1B
Может нужно просто где-то в настройках контроллер определить или какой-нибудь файл с определениями подключить, странно что компилятор не знает имена битов, а на имена регистров он не ругается
Добавлено через 4 часа...
Я тут прикинул...
Если взять частоту 8МГц, (это максимум встроенного генератора, внешний использовать нельзя, его ноги заняты под АЦП) то даже если принять что частота АЦП будет получена делением тактовой на 2 получаем частоту АЦП~38 киловыборок в секунду для каждого канала (8000000МГц/2/13тактов/8каналов), т.е значительно меньше 50кГц.
Практически же получается еще меньше - 37кГц, если писать на ассемблере: оптимизировать уже некуда и разрядность АЦП взята 8бит. Я не говорю про точность, которая неизвестно как пострадает при таком зверском повышении тактовой частоты АЦП.
Вот такая информация к размышлению.
Re: АЦП и SPI AtTiny861
Engineer_Keen писал(а):Смотрим даташит:
регистр USISR, бит USIOIF - 6-й, значит пишем USISR=0x40
регистр USICR, биты USIWM0-4й, USICS1-3й, USICLK-1й, USITC-0й, пишем: USICR=0x1B
Может нужно просто где-то в настройках контроллер определить или какой-нибудь файл с определениями подключить, странно что компилятор не знает имена битов, а на имена регистров он не ругается
Добавлено через 4 часа...
Я тут прикинул...
Если взять частоту 8МГц, (это максимум встроенного генератора, внешний использовать нельзя, его ноги заняты под АЦП) то даже если принять что частота АЦП будет получена делением тактовой на 2 получаем частоту АЦП~38 киловыборок в секунду для каждого канала (8000000МГц/2/13тактов/8каналов), т.е значительно меньше 50кГц.
Практически же получается еще меньше - 37кГц, если писать на ассемблере: оптимизировать уже некуда и разрядность АЦП взята 8бит. Я не говорю про точность, которая неизвестно как пострадает при таком зверском повышении тактовой частоты АЦП.
Вот такая информация к размышлению.
а ситуация с spi не изменилась.. только теперь еще и SCK горит красным...
надо разобраться с spi.. а по поводу точности.. посмотрим что преподаватель скажет...
Re: АЦП и SPI AtTiny861
хотя нет.. вот..Engineer_Keen писал(а):Смотрим даташит:
регистр USISR, бит USIOIF - 6-й, значит пишем USISR=0x40
регистр USICR, биты USIWM0-4й, USICS1-3й, USICLK-1й, USITC-0й, пишем: USICR=0x1B
Может нужно просто где-то в настройках контроллер определить или какой-нибудь файл с определениями подключить, странно что компилятор не знает имена битов, а на имена регистров он не ругается![]()

по-моему он таки не передает...
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: АЦП и SPI AtTiny861
Передает... Но почему-то нули...
Так. Ясно...
Грабли номер раз: идиоты из Atmel опять переставили ноги MISO и MOSI для USI в противоположное состояние относительно ISP, как они сделали это с tiny2313
Ногами интерфейса USI нужно считать не ноги MOSI-MISO, а ноги DI-DO, они как раз наоборот, там что ногу DIN SPI-дебаггера нужно подключать к ноге PB1, а не к PB0. DDRB в инициализации соответственно тоже поправить.
Грабли номер два: до или после передачи данных нужно сбрасывать и бит USIOIF и счетчик USICNT. Я всегда использовал длинный, но быстрый вывод, где просто подается 16 тактов на счетчик, и проверять флаг мне не было необходимости. В алгоритме с циклом это не прокатит.
Так. Ясно...
Грабли номер раз: идиоты из Atmel опять переставили ноги MISO и MOSI для USI в противоположное состояние относительно ISP, как они сделали это с tiny2313
Ногами интерфейса 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;Re: АЦП и SPI AtTiny861
сделала...Engineer_Keen писал(а):Передает... Но почему-то нули...
Так. Ясно...
Грабли номер раз: идиоты из Atmel опять переставили ноги MISO и MOSI для USI в противоположное состояние относительно ISP, как они сделали это с tiny2313![]()
Ногами интерфейса 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
Не знаю, у меня на ассемблере все работает. Выкладываю "образец", может понадобится. Каментов минимум, некогда было писать. До понедельника больше не подскажу.
- Вложения
-
- ADC_Tiny861.rar
- Прошивка, проект, исходник(асм)
- (13.42 КБ) 161 скачивание
Re: АЦП и SPI AtTiny861
то есть он еще и не должен так постоянно моргать, как у меня?Engineer_Keen писал(а):Не знаю, у меня на ассемблере все работает. Выкладываю "образец", может понадобится. Каментов минимум, некогда было писать. До понедельника больше не подскажу.
что ж это такое то(
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: АЦП и SPI AtTiny861
Кто должен моргать? Сделали 16 измерений на каждый канал, подождали нажатия на кнопку, выдали 8 средних значений, и все сначала. Так?
Re: АЦП и SPI AtTiny861
ну там еще максимальное из них находится и оно передается. но суть не в том. у меня, когда запускаю, spi сразу начинает постоянно писать: active, inactive. то есть то. что на скриншоте. много-много раз...Engineer_Keen писал(а):Кто должен моргать? Сделали 16 измерений на каждый канал, подождали нажатия на кнопку, выдали 8 средних значений, и все сначала. Так?
- Shapa
- Встал на лапы
- Сообщения: 127
- Зарегистрирован: Пт июн 20, 2008 09:38:05
- Откуда: Харьков
- Контактная информация:
Re: АЦП и SPI AtTiny861
Конечно оно мигает:) И вас мучает вопрос почему...мигает оно потому, что вы его заставили так работатьkatbka писал(а): ну там еще максимальное из них находится и оно передается. но суть не в том. у меня, когда запускаю, spi сразу начинает постоянно писать: active, inactive. то есть то. что на скриншоте. много-много раз...
Код: Выделить всё
PORTB.5=0;
USIDR=USR;
USISR=0xF0; //инициируем процесс передачи (сброс флагов и счетчика)
while (i==0)
{
USICR=0x1B
i=USISR.6; //определяем состояние флага завершения передачи
}
PORTB.5=1А теперь попробую по полочкам...Катерина, вы запутались в трёх соснах. И проблема ваша, как и всех новичков, в том, что вы сразу пытаетесь написать весь код. Так не делают. К сожалению для большинства микроконтроллеров используемых радиолюбителям и начинающими специалистами нет доступных средств отладки. Симуляторы позволяют немного решить эту проблему, но лишь очень в узком дипозоне возможностей. А внутрисхемные дебагеры...не по карману студенту. Что-то не в ту степь ушел. ИТАК! Вам я рекомендую: создать новый проект, и переносить в него части уже проверенного кода. Проверяйте все что можно через дебагер (отладчик). Используйте функции!
например опишите функцию записи по SPI
Код: Выделить всё
void SPI_write_byte(unsigned char data)
{
PORTB.5=0;
USIDR=data;
USISR=0xF0;
while (!USISR.6)
USICR=0x1B
PORTB.5=1
}// за работоспособность данной функции я не ручаюсь, я лишь скопировал ваш код, удалив лишнееНо всё это актуально лишь в том случае, если вам предстоит продолжать заниматься МК и собирать устройства в железе....
Если у вас есть кча мелких вопросов, даже самых "глупых" смело обращайтесь в ЛС, или ICQ, чем смогу - тем помогу
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: АЦП и SPI AtTiny861
Это значит что во-первых все работает без ожидания нажатия на кнопку.katbka писал(а):когда запускаю, spi сразу начинает постоянно писать: active, inactive. то есть то. что на скриншоте. много-много раз...
Во-вторых данные не передаются, должно выглядеть примерно так: Не понятно почему ничего не передается, ведь код (как мне кажется) аналогичен.
Код: Выделить всё
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 какое-нибудь число (константу) размером в байт.
Re: АЦП и SPI AtTiny861
попробую..Engineer_Keen писал(а):Это значит что во-первых все работает без ожидания нажатия на кнопку.katbka писал(а):когда запускаю, spi сразу начинает постоянно писать: active, inactive. то есть то. что на скриншоте. много-много раз...
Во-вторых данные не передаются, должно выглядеть примерно так: Не понятно почему ничего не передается, ведь код (как мне кажется) аналогичен.Может из-за того, что USR - не однобайтное число, или компилятор как-то выносит за скобки "повторяющееся действие" - USICR=0x1B...Код: Выделить всё
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 какое-нибудь число (константу) размером в байт.
уже и программный spi пыталась писать.. Точнее, Shapa показал что и как... все равно не лучше результат...


