임베디드/고추건조기

Rom search

twoweeks-within 2024. 12. 7. 16:22

Rom search : 0xF0
주소를 어떻게 찾지?

1. 한 bit 를 읽음
2. 비트의 보수를 읽음
3. 0 or 1 Write
>
시작
1.  리셋펄스
2. slave 응답
3. 써치 커맨드 , 0xF0
4. 비트를 읽음

찾아내기
ROM1 00110101---64
ROM2 10101010---64
ROM3 11110101
ROM4 00010001

1. slave : MSB 들을 동시에 보냄 0 1 1 0 
  master : 0 으로 인식
 // 0 : 60~120 μs , 1: 1μs > 겹침 > 결국 60~120 인 0 으로 읽음
2. 보수를 보냄 > 1 0 01 
                > 똑같이 0 으로 인식

3. 경우의수
00  : slave 들이 0, 1 섞여있음 // 장치가 여러개임을 인식 > check
01 :    " 다 0 임 > 보수를 취하면 1 // 둘다 0 일 수도있지만 하나만 0일지 확실하지 않음
10 : "" 다 1임 
11 : 연결된 장치가 없음 // 말이안됨

4.  slave가 경우의수 bit 송신
M) 00 수신  > check ( 장치가 걸러짐)
M) 0 송신 > S) MSB가 1 이면 자동 탈락( ROM2,ROM3)
                    > 경우의수 01 을 송신 (ROM1, ROM4 MSB가 0 0 이므로)
M) 01 수신 > (MSB-1 bit) 다 0 이구나 파악 check X (걸러지는 장치 없음) > M) 0 안보냄
                     > 00 송신 (MSB -2 bit)
M) 00 수신 > check ( 장치가 걸러짐) 
M) 0 송신 > ROM4만 남음 > 10 00 01 01..... 이렇게 64bit 찾은 주소 저장

5. 나머지 찾기
마지막 check 지점 ( 분기점 ) > M) 1을 보냄 > ROM1만 남음
첫번재 check 지점 > 1을 보냄 > 00 check ( MSB -1 )
      > 0 을보냄 > ROM2만 남음
      > 분기점 back > 1을 보냄 > ROM3만 남음

칩 관련소스 , one-wire에 대한 소스 


Ds18b20_Init();

OneWire_Init(&OneWire,_DS18B20_GPIO ,_DS18B20_PIN); 
// 구조체 설정 및 신호를 HIGH > LOW >"HIGH" 셋팅

OneWireDevices = OneWire_First(&OneWire); 
>
uint8_t OneWire_First(OneWire_t* OneWireStruct) {
/* Reset search values */
OneWire_ResetSearch(OneWireStruct);
// 초기 리셋 한번 해주고
/* Start with searching */
return OneWire_Search(OneWireStruct, ONEWIRE_CMD_SEARCHROM);
}   // 장치 하나를 search

typedef struct {
GPIO_TypeDef* GPIOx;           /*!< GPIOx port to be used for I/O functions */
uint16_t GPIO_Pin;             /*!< GPIO Pin to be used for I/O functions */
uint8_t LastDiscrepancy;       /*!< Search private */
uint8_t LastFamilyDiscrepancy; /*!< Search private */
uint8_t LastDeviceFlag;        /*!< Search private */
uint8_t ROM_NO[8];             /*!< 8-bytes address of last search device */
} OneWire_t;

이 구조체에 찾아낸걸  ROM_NO[8];  //64 bit 에 저장
>> 나머지 장치들은??

OneWireDevices = OneWire_First(&OneWire);
while (OneWireDevices) // 장치가 있다면
{
Ds18b20Delay(100);
TempSensorCount++; // count ++
OneWire_GetFullROM(&OneWire, ds18b20[TempSensorCount-1].Address);
// address에 저장
// _DS18B20_MAX_SENSORS == 1 // 센서 1개
OneWireDevices = OneWire_Next(&OneWire);


uint8_t OneWire_Next(OneWire_t* OneWireStruct) {
   /* Leave the search state alone */
   return OneWire_Search(OneWireStruct, ONEWIRE_CMD_SEARCHROM);
}  
다음장치를 OneWireDevices 에 저장후 다시 while 문 반복,,

do{
if(TempSensorCount>0){
break;
    }
Ds18b20TryToFind--;
}while(Ds18b20TryToFind>0); 
// do while 문
// count 가 1보다 크다 : 즉 장치 찾으면 break로 while 빠져나옴 
// Ds18b20TryToFind=5 > 5번정도 찾기 시도해보고 없으면

if(Ds18b20TryToFind==0)
return false;
// 그래도 못찾으면 false > 함수 종료


for (uint8_t i = 0; i < TempSensorCount; i++)
{
Ds18b20Delay(50);
    DS18B20_SetResolution(&OneWire, ds18b20[i].Address, DS18B20_Resolution_12bits);
// 온도정밀도 , 사진참조
Ds18b20Delay(50);
    DS18B20_DisableAlarmTemperature(&OneWire,  ds18b20[i].Address);
// 온도 알림
  }
장치갯수 만큼 for문

'임베디드 > 고추건조기' 카테고리의 다른 글

릴레이 모듈  (0) 2024.12.10
온도센서 검증  (0) 2024.12.08
1-wire, 프로토콜  (0) 2024.12.06
온도센서  (0) 2024.12.05
GPIO >SPI  (0) 2024.12.03