Страница 1 из 1
Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 07:31:11
panya
Мяу.
Не работает вот эта штука, не могу понять из-за чего ((
Даташиты поковырял и ничего не нашел, по идее должно работать, но реальность упертая штука
Код: Выделить всё
#include <io.h>
// Declare your global variables here
#include <delay.h>
unsigned char cData=90;
/* Макросы для кнопок: */
#define DDR_Button DDRB
#define Button_0 0
/* - - - - - - - - - - - - - - - - - - - - - - - */
/* Макросы для SPI % Используем аппаратный SPI % */
#define DDR_SPI DDRB
#define DD_PB1 1
#define DD_SS 2
#define DD_MOSI 3
#define DD_MISO 4
#define DD_SCK 5
/* - - - - - - - - - - - - - - - - - - - - - - - */
void SPI_MasterInit(void){
/* Включили SPI, мастер, установили частоту Fck/128 */
SPCR=(0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(1<<SPR0);
SPSR=(0<<SPI2X);
/* Установили MOSI и SCK выход, все остальные вход */
DDR_SPI=(1<<DD_MOSI)|(1<<DD_SCK)|(0<<DD_MISO);
}
void SPI_MasterTransmit(unsigned char cData){
/* Команда писать данные в нулевой потенциометр */
SPDR=0b00010001; while(!(SPSR & (1<<SPIF)));
/* Старт передачи */
SPDR=cData; while(!(SPSR & (1<<SPIF)));
}
void main(void){
/* Установили кнопки как вход */
DDR_Button=(0<<Button_0)|(1<<DD_PB1)|(1<<DD_SS);
SPI_MasterInit();
while(1)
{
if(PINB.0==1){PORTB.1=0; cData=cData+10; SPI_MasterTransmit(cData);}else{PORTB.1=1;
}
}
}
Re: Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 08:12:07
SubDia
Так. А что это у Вас происходит с выводом SS? Как вход используется, непонятно.
Где сброс CS потенциометра перед выходом на передачу данных? Тоже не видать мне..
Re: Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 08:29:39
igor-x
на
http://www.arduino-projekte.de есть библиотеки для MCP41010/MCP41050/MCP42010/MCP42050.
Re: Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 09:09:06
panya
SubDia писал(а):Так. А что это у Вас происходит с выводом SS? Как вход используется, непонятно.
Где сброс CS потенциометра перед выходом на передачу данных? Тоже не видать мне..
SS МК сконфигурирован на вход и на него подвешено питание +5В.
CS:
если нажата кнопка, то низкий уровень, иначе высокий
Re: Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 10:06:41
SubDia
panya писал(а):если нажата кнопка, то низкий уровень, иначе высокий
Вижу. Наверное, это я еще очи не разлепил с утра)
Честно говоря, я бы эти манипуляции внес в функцию передачи данных. Опустили
CS - подняли
CS.
Впрочем, ладно.
Еще я бы попробовал (коль совсем непонятно, почему не работает) для эксперимента реализовать программный SPI.
Ибо в принципе работа с MCP41xx/42xx элементарна, "не работать" тут нечему.
Кстати говоря, в чем проявляется неработоспособность? У Вас кнопка отрабатывает? По мне, так в Вашей схеме не хватает подтяжки вывода (который к кнопке подключен, PB0) к "земле". Возможно, конечно, в Протеусе и так работать должно. =)
Что вообще показывает напряжометр?
Re: Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 14:25:12
panya
SubDia писал(а):Что вообще показывает напряжометр?
Напряжометр показывает падение напруги. Сопротивление больше - падение больше, меньше - меньше. Поставил чтоб контролировать работу сопротивлялки.
SubDia писал(а):Кстати говоря, в чем проявляется неработоспособность?
Если зажать кнопку и запустить протеус, то сопротивление меняется (показания вольтметра меняются, в момент отжатия кнопки, разное время с момента пуска - разные показания вольтметра. Тоесть вроде работает). Если запустить с отжатой кнопкой то ничего не меняется. Хотя осциллограф показывает что что-то отправляется.
Может:
================
/* Установили кнопки как вход */
DDR_Button=(0<<Button_0)|(1<<DD_PB1)|(1<<DD_SS);
POTR.DD_PB1=1;
а потом уже:
if(PINB.0==1){
PORTB.1=0; cData=cData+10; SPI_MasterTransmit(cData);
}else{PORTB.1=1;}
Так как изначально состояние порта не задано.
Re: Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 16:39:57
SubDia
panya писал(а):Напряжометр показывает падение напруги. Сопротивление больше - падение больше, меньше - меньше. Поставил чтоб контролировать работу сопротивлялки.
Да это понятно. Я имел в виду какие конкретно значения он показывает. По идее, после запуска с отжатой кнопкой он должен показать 2,5 В (MCP41010 устанавливает среднее значение (от номинала) сопротивления после сброса).
panya писал(а):POTR.DD_PB1=1;
Пробуйте.
panya писал(а):Если зажать кнопку и запустить протеус, то сопротивление меняется (показания вольтметра меняются, в момент отжатия кнопки, разное время с момента пуска - разные показания вольтметра. Тоесть вроде работает). Если запустить с отжатой кнопкой то ничего не меняется.
Потому что при запуске с зажатой кнопкой у Вас в любом случае выполняется условие
if(PINB.0==1)
А если нет, то на выводе может быть что угодно, вывод-то
PB0 в воздухе висит. Притяните его к земле на всякий случай. Приблизительно так.

Re: Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 16:53:19
s_black
Вот, может быть чем-то поможет.
Re: Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 18:06:22
Пока_без_кота
SubDia писал(а):Приблизительно так.

Схема неправильная. Нажатие кнопки никоим образом не повлияет на уровень напряжения на ножке МК. Там всегда будет потенциал земли (0 Вольт).
Re: Помогите с SPI и цифровым резистром
Добавлено: Чт ноя 19, 2015 19:10:17
panya
Всем спасибо. работает. Разрешения толкового не было, сделал разрешение от кнопки, когда вкл. кнопка то подтягивает землю на порт и на CS. И завелся резюк.
мяу
Re: Помогите с SPI и цифровым резистром
Добавлено: Пт ноя 20, 2015 08:30:42
SubDia
Пока_без_кота писал(а):Схема неправильная.
Точно. Я всегда настраиваю срабатывание по низкому уровню, схема там чуть друга, вот и накосячил в спешке)
panya писал(а):работает.
Ну вот и отлично.