Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 11.10.2016, 20:51   #1
Zombie47
Senior Member
 
Регистрация: 05.10.2015
Возраст: 32
Сообщений: 137
Вес репутации: 91/0
Zombie47 will become famous soon enough
По умолчанию MAX6675 по SPI с МК PIC16F819

Эх мучаюсь который день, недостаточно знаний.
Вообщем есть термопара с контроллером 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 нужных. Как то отправить как то принять.
Zombie47 вне форума   Ответить с цитированием
Старый 02.11.2016, 00:38   #2
Zombie47
Senior Member
 
Регистрация: 05.10.2015
Возраст: 32
Сообщений: 137
Вес репутации: 91/0
Zombie47 will become famous soon enough
По умолчанию Re: MAX6675 по SPI с МК PIC16F819

Сделал прогу работает:
Код:
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);

  }
}
}
Zombie47 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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


Часовой пояс GMT +3, время: 22:36.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot