![]() |
|
|
Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Senior Member
Регистрация: 05.10.2015
Возраст: 32
Сообщений: 137
Вес репутации: 91/0 ![]() |
![]()
Эх мучаюсь который день, недостаточно знаний.
Вообщем есть термопара с контроллером MAX6675, она передает инфу о температуре в цифровом виде по SPI. Из того что успел понять вникнуть: MAX6675 шлет 16бит, но инфа о температуре хранится в 12 битах. SPI не умеет просто слать. Нам нужно отправить в MAX6675 что нить по SPI и тогда он ответит температурой. Ну как двусторонний обмен. В моем МК 8 битный аппаратный SPI. Использую среду mikroC PRO for PIC Вот код который смог нагородить: Код:
sbit Chip_Select at RB5_bit; //RB5 íàçîâåì êàê Chip_Select sbit Chip_Select_Direction at TRISB5_bit; void InitMain() { TRISA0_bit = 1; // Set RA0 pin as input TRISA1_bit = 1; // Set RA1 pin as input TRISB3_bit = 0; Chip_Select = 1; // Deselect DAC Chip_Select_Direction = 0; // Set CS# pin as Output SPI1_Init(); //èíèöèàëèçàöèÿ SPI ïî äåôîëòó // SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH); } unsigned int MAX6675_readCelsius(void) { //read max6675 thermocouple preamp - conversion takes 220ms! //static unsigned int tempRead=0; unsigned char valRead=0; unsigned int tempRead=0; SPI1_Write(valRead);//ïûòàþñü îòïðàâèòü îò ÌÊ ïî spi çíà÷åíèå valRead, ïðîñòî òàê ÷òîáû ñèíèöèðîâàòü ïåðåñûëêó îò MAX6675 SPI1_Read (valRead); //ïûòàþñü ñ÷èòàòü ïî SPI è çàïèñàòü òî ÷òî ñ÷èòàë â ïåðåìåííóþ valRead tempRead = valRead << 5; // SPI1_Write(valRead); valRead &= 0b11111000; valRead >>= 3; tempRead |= valRead; return tempRead; } void main() { ADRESL = 0; ADRESH = 0; InitMain(); // Perform main initialization while (1) { // Endless loop Chip_Select = 0; // MAX6675_readCelsius(); if ( MAX6675_readCelsius()>10){ RB3_bit=1; } else{ RB3_bit=0; } Delay_ms(2000); Chip_Select = 1; // Slow down key repeat pace } } В протеусе код не хочет работать. Рано пока грешить на кривость протеуса ибо я половину не понимаю. Как я понимаю мне надо считать 16 бит, выделить из них 8 и 4 нужных. Как то отправить как то принять. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 05.10.2015
Возраст: 32
Сообщений: 137
Вес репутации: 91/0 ![]() |
![]()
Сделал прогу работает:
Код:
sbit Chip_Select at RB5_bit; //RB5 назовем как Chip_Select sbit Chip_Select_Direction at TRISB5_bit; static unsigned int first=0; static unsigned int second=0; static unsigned int buffer=0; static unsigned int tempRead=0; unsigned int value; char error; char temp; void InitMain() { INTCON =0b00000000; // даташит page 18 ниже описание: //7bit=0 (GIE глобальное разрешение прерываний выкл) //6bit=0 (PEIE разрешение прерываний от периферийных модулей выкл) //5bit=0 (TMR0IE разрешение прерывания по переполнению таймера TMR0 выкл) //4bit=0 (INTE разрешение внешних прерываний выкл) //3bit=0 (RBIE разрешение прерывания по изменению сигнала на входах RB4-RB7) //2bit=0 (TMR0IF флаг прерывания который поднимается при переполнении таймера, мы его сбрасываем в 0) //1bit=0 (INTF флаг прерывания который поднимается если выполнено условие внешнего прерывания на выводе RB0/INT, мы его сбрасываем в 0) //0bit=0 (RBIF флаг прерывания который поднимается при измении сигнала на одном из входов RB4-RB7, мы его сбрасываем в 0 ) OSCCON = 0b01110100; //даташит page 38 ниже описание: //7bit=0 (READ as 0) //6-4bit=111 (частота внутреннего генератора 8mhz) //3bit=0 (READ as 0) //2bit=1 (IOFS стабилизация частоты INTOSC вкл ) //1-0bit=0 (READ as 0) //Chip_Select = 1; // Deselect DAC // Chip_Select_Direction = 0; // Set CS# pin as Output // ниже настройка АЦП ADCON0=0b01000001; //даташит page 81 ниже описание: //7-6bit=01 (Если ADCS2=0 то задается частота Fosc/8) //5-3bit=000 (канал для АЦП RA0) //2bit=0 (GO/DONE как я понял это что вроде флага, в процессе АЦП или нет ) //1bit=0 (READ as 0) //0bit=0 (ADON этот бит запускает работу ацп.) ADCON1=0b10001110; //даташит page 82 ниже описание: //7bit=1 (ADFM правое выравнивание результата АЦП, 6 старших битов регистра ADRESH читаются как 0) //6bit=0 (ADCS2 частота АЦП делиться на 2 когда используется системная частота, но у нас ВЫКЛ) //5-4bit=0 (READ as 0) //3-0bit=1110 (какая то конфигурация АЦП) //правое выравнивание, включен аналоговый вход RA0/AN0, остальные входы цифровые // ниже настройка таймера TMR0 TMR0 = 0; //сбрасываем таймер в 0 OPTION_REG = 0b10000011; //ниже описание (даташит page 54): //7bit=0 (portb подтягивающие резисторы вкл) //6bit=0 (INTEDG прерывания по заднему фронту сигнала хз что это) //5bit=0 (источник тактирования таймера 0 = внутренний генератор) //4bit=0 (в какую сторону считает таймер, от меньшего к большему) //3bit=0 (прескалер применяется к Timer0 а не к WDT) //2-0bit=011 (прескайлер равен 1:16) // ниже разрешение прерываний TMR0IE_bit = 0; //разрешение прерывания по таймеру0 GIE_bit = 1; // глобальное разрешение прерываний TRISA = 0b00000000; TRISB = 0b10000000; PORTA = 0; //САМОЕ ГЛАВНОЕ, этой ***ни не было и нихуя не работало PORTB = 0; //САМОЕ ГЛАВНОЕ, этой ***ни не было и нихуя не работало SPI1_Init(); //инициализация SPI по дефолту Soft_UART_Init(&PORTB, 7, 6, 9600, 0); //RB7 - RX, RB6-TX PORTA = 0; PORTB = 0; } void DAC_Output(void) { //static unsigned short valRead=90; Chip_Select = 0; // Select chip first=SPI1_Read(buffer);//эта функция сама иницирует прием. первые 8 бит записываем в переменную Delay_ms(300); second=SPI1_Read(buffer);//так как посылка 16 битная то тут записываем вторые 8 бит так как max6675 будет отправлять их Delay_ms(300); tempRead=(first<<8) | second; //склеиваем 2 числа, пока не режем tempRead=(tempRead>>5); // сдвигаем направо всё 16-и битное число, выдавливая нули tempRead=(tempRead&0x07FF); // применяем маску, чтоб откинуть неиспользуемые нули, вдруг там мусор? Chip_Select = 1; // Deselect chip } void main() { ADRESL = 0; ADRESH = 0; InitMain(); // Perform main initialization while (1) { // Endless loop Delay_ms(200); DAC_Output(); // Send value to DAC chip Delay_ms(200); Soft_UART_Write(tempRead); } } } |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
PIC24FJ256GB410 + SPI | geotox | Продукция MICROCHIP | 8 | 14.08.2016 18:56 |
PIC16F877A и MCP41010, работа по SPI | RTSAM | Своими руками | 26 | 12.09.2015 22:31 |
ПО для цифрового слухового аппарата | RTSAM | Своими руками | 45 | 19.07.2015 22:01 |
HELP pic32mx скорость SPI. | Dmitriy_1000 | Продукция MICROCHIP | 32 | 02.08.2014 01:42 |
Боян: связь МК с сотовым по GPRS | Vaicartana | Общетехнические вопросы | 10 | 23.01.2008 12:44 |