АЦП и SPI AtTiny861

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
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 какое-нибудь число (константу) размером в байт.
попробовала передать unsigned char temp = 8;
вот что вышло:
Изображение

а можно сделать asm вставку? как это примерно должно выглядеть?
можно писать так?

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

OUT   USIDR,USR ;
Реклама
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

katbka писал(а): попробовала передать unsigned char temp = 8;
вот что вышло:
Изображение
Ну вот, все правильно передалось. Теперь нужно попробовать передавать по два байта. Младший просто после логического умножения USR на 0xFF, а старший - сначала сдвинуть USR вправо на 8 бит, потом тоже на 0xFF умножить.
katbka писал(а): а можно сделать asm вставку? как это примерно должно выглядеть?
можно писать так?

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

OUT   USIDR,USR ;
Некоторые компиляторы позволяют написать что-то типа asm("OUT USIDR,USR")
Реклама
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а): Ну вот, все правильно передалось. Теперь нужно попробовать передавать по два байта. Младший просто после логического умножения USR на 0xFF, а старший - сначала сдвинуть USR вправо на 8 бит, потом тоже на 0xFF умножить.
а то что "2.154 s 2.154 s ??"
это нормально? меня эти вопросы смущают..
Последний раз редактировалось katbka Чт дек 29, 2011 18:32:50, всего редактировалось 2 раза.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

katbka писал(а): а то что "2.154 s 2.154 s ??"
это нормально.. меня эти вопросы смущают..
Один из "??" относится к обратной линии данных SPI, так как там ничего не передается, то нарисованы знаки вопроса.
Вторая пара знаков вопроса относится к нашим данным. Не знаю почему, но байт похоже передался не полностью, возможно SS или CLK поднялись "не в той фазе", тут нужно осциллографом посмотреть. Ну а то что время одинаковое, так это из-за того что байт передается менее чем за 1 мс.
Реклама
Эиком - электронные компоненты и радиодетали
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):
katbka писал(а): а то что "2.154 s 2.154 s ??"
это нормально.. меня эти вопросы смущают..
Один из "??" относится к обратной линии данных SPI, так как там ничего не передается, то нарисованы знаки вопроса.
Вторая пара знаков вопроса относится к нашим данным. Не знаю почему, но байт похоже передался не полностью, возможно SS или CLK поднялись "не в той фазе", тут нужно осциллографом посмотреть. Ну а то что время одинаковое, так это из-за того что байт передается менее чем за 1 мс.
прописала:

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

#define HI(x) (((x)>>8)& 0xFF)
#define LO(x) ((x)& 0xFF)
-то что вы сказали.

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

USRL = LO(USR);
USRH = HI(USR);
if(!trans)
      {
        while(!trans); 
        delay_ms(10);
        PORTB.5=0;
        USIDR=USRL;
        USISR|=0x40;          
        while (!USISR.6)
          USICR=0x1B;                                 
        PORTB.5=1; 
        
         PORTB.5=0;
        USIDR=USRH;
        USISR|=0x40;           
        while (!USISR.6)
          USICR=0x1B;                                 
        PORTB.5=1; 
        
         PORTB.5=0;
        USIDR=j;
        USISR|=0x40;          
        while (!USISR.6)
          USICR=0x1B;                                 
        PORTB.5=1;
      }
с первым битом опять ??, а другие нули(

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

Re: АЦП и SPI AtTiny861

Сообщение Engineer_Keen »

katbka писал(а): с первым битом опять ??
Значит проблема в начале передачи, а не в конце. В каком состоянии находится линия SCK после инициализации? Надо проинвертировать.
katbka писал(а): а другие нули(
Значит там нули :dont_know: Ставим точку останова перед вычислением LO-HI, и смотрим что в переменной USR.
Реклама
katbka
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Ср дек 14, 2011 17:13:37

Re: АЦП и SPI AtTiny861

Сообщение katbka »

Engineer_Keen писал(а):
katbka писал(а): с первым битом опять ??
Значит проблема в начале передачи, а не в конце. В каком состоянии находится линия SCK после инициализации? Надо проинвертировать.
katbka писал(а): а другие нули(
Значит там нули :dont_know: Ставим точку останова перед вычислением LO-HI, и смотрим что в переменной USR.
дебаг не понадобился.. ошибка была тупее тупейших... а так как написано было не мной, то и не возникало мысли это проверить.
поиск максимального...

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

 
// Расчет максимального значения среди средних арифметических
      USR=0;
      j=0;
      for (i=0; i<=7; i++)     
      {
          if (USR<srednee[i]) 
              { 
                    USR=srednee[i];       //суммируем значения массива данных
                    j=i;                  //меняем номер канала
              };
      }
вместо

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

if (USR<srednee[i]) 
стояло

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

if (USR>srednee[i]) 
естественно 0 не был больше измерений...
спасибо Вам огромнейшее за помощь)
Закрыто

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