'연구노트'에 해당되는 글 35건

  1. 2013.02.19 이클립스에서 플러긴 설치시 오류
  2. 2013.01.22 올해의 자작 목표 : REPRAP 1
  3. 2012.11.01 DYE 레이저.. DYE 교체 방법.
  4. 2012.11.01 레이저 주의... 공유함.
  5. 2012.04.26 셀발란싱 프로그램
  6. 2012.03.18 코딩중 .. 2
  7. 2012.03.18 코딩 중..
  8. 2012.03.08 부스트 컨버터의 제작.
  9. 2012.03.08 NIXIE 소켓용 PCB 제작..
  10. 2012.03.08 nixie

이클립스에서 플러긴 설치시 오류

이클립스에서 ADT 플러그인을 깔려고 할 때에 


다음과 같은 에러 메세지를 만날 경우


Cannot complete the install because one or more required items could not be found. ....


웹검색결과 indigo 이상 버전에서 하면 된다 했지만 이미 나는 Juno 인걸~


음..뭐지?


살짝 고민해봤는데 원인은 eclipse 를 관리자 버전으로 실행시켜야한다는 것. (window 7일 경우이다)




올해의 자작 목표 : REPRAP

올해는 깔끔하게 REPRAP 을 만들어본다.


이제 시작. 2013.1.22


일단, electronics 부터...


가장 많이 사용한다는 RAMP 컨트롤러를 잠깐 봤다.


REPRAP 컨트롤러는 아두이노 메가 보드를 기본으로, 각종 스텝모터 컨트롤용 DRIVER, 온도 제어를 위한 써미스터 소켓, 각종 입출력을 위한 소켓


등으로 이루어져 있다.


결국 펌웨어는 익숙한 아두이노.. 그런데 메가보드임 (ATMEGA1280 사용) .. 아두니오 보드는 구매를 해야하는 것인가!!


.. 어쨌든 스텝 모터 드라이버는 A4988 칩을 사용했는데, 인풋으로 DIR, STEP  두핀을 받는다. EN 단자도 있지만 깔끔하게 무시하자. ㅋㅋ


어쨌든 2상 바이폴라용 스테핑으로 구동 되는데, 유니폴라로 가도 무방할듯. 


이것 저것 모두 무시한 결과 가격도 비싼 산켄의 SLA7062 를 선택하자고 결론 지었는데, 그 이유는 다름아닌 과거에 떠놓은 보드가 있기 때문.


DIR, STEP 두핀씩만 꺼내서 연결하면, 비용이 절약되어 모두가 행복해진다.


추가로 손땜하여 제작할 부분은


Heater, Fan 컨트롤 부분... 이것도 뭐 fet 하나면 해결하니 해결 가능.


그리고 써미스터 소켓 부분.. 이것도 결국 저항 하나와, cap 하나로 이루어져 있으므로 그럭 저럭 해결할 수 있을 듯 하다.


결국 약간 큰 사이즈의 만능 기판 + 아두이노 메가 보드 + 과거 떠놓은 stepping용 컨트롤러 보드 2장(안타깝게 3개짜리라서 2장이 필요하다)


면 저렴하게 컨트롤러를 꾸밀 수 있을 거라 예상된다.


계속..




DYE 레이저.. DYE 교체 방법.

Dye change.

 

출력이 나빠지기 시작하면 dye를 교환해야한다.

 

A. preparing

1. dye를 바꾸기 위한 모든 장비를 깨끗이 씻는다. 비커와 유리막대등.

2. dye를 잰다. DCM dye의 경우 1리터에 152mg이 들어간다.

 

B. removing old dye

1. dye battle을 돌려서 연다. 그리고 바로 아래에 놓는다. 그럼 호스의 남아있는 dye가 통안으로 떨어진다. 완벽히 빼내기 위해서 dye laser에 연결된 swagilok(supply)을 열어서 공기가 들어가게 한다.

2. 충분히 빠졌다면 filter cabinet을 연다. 뚜껑 편에 붙어있을 filter를 제거한다.

3. dye battle을 오른쪽(벨브쪽)으로 옮겨서 벨브를 연다. 벨브를 열면 밑으로 dye가 빠진다. 필터통에 dye가 다 없어질때까지 열어놓는다.

4. dye를 다 빼냈다면 필터통을 와이퍼류로 닦는다. 그리고 dye통에 든 dye를 제거하고 메타놀로 행궈서 dye통도 청소한다.

 

C. melting dye

1. 큰통에 152mlDCM dye를 넣는다. 그리고 메타놀 800mlPC 200ml를 준비하여 큰 통에 넣는다.

2. 유리막대로 dye가 완전히 녹을 때 까지 젓는다.

3. dye battledye2/3 가량 담는다.

 

D. installing new dye

1. dye통을 설치한다.

2. filter cabinet에 남은 dye를 스포이드로 옮긴다. 가득 채운 후, 새 필터도 dye에 살짝 적신후 뚜껑 편에 붙인다. 그 후 필터 통을 잠근다.

3. B과정에서 열었던 호스를 다시 잠근다. 너무 세게 잠글 필요는 없고, 손힘으로만 잠근다.

4. circulator를 동작시켜서 dye가 순환되게 한다.


레이저 주의... 공유함.



LASERCAUTION.zip


셀발란싱 프로그램

#include <stdio.h>

#include <stdlib.h>



#define V_RISING (0.05) // per 1sec

#define V_BLEED (0.02) // per 1sec

#define V_TH (4.0)

#define CELL_NUM (3)

#define V_FINISH (4.2)

#define V_HYS (4.18)

 

int main()

{

FILE* fout = fopen("data.txt","w");

fprintf(fout,"TIME,CELL1,CELL2,CELL3\r\n");

float Vcell[CELL_NUM];

int Vcell_balance[CELL_NUM];

int    balance_mode = 0;


long time = 0;

// define initial cell voltage

Vcell[0] = 3.3;

Vcell[1] = 3.5;

Vcell[2] = 3.55;


for(int i = 0;i < CELL_NUM;i++) {

Vcell_balance[i] = 0;

}


while(1) { // 1sec per 1 loop

// balance mode 인지 확인한다

// 셀중 어느 한 셀이 4.2v 에 도달하면 balance mode 로 진입한다

if(balance_mode) {

for(int i = 0;i < CELL_NUM;i++) {

if(Vcell_balance[i] == 1) {

Vcell[i] += V_BLEED;

if(Vcell[i] <= V_HYS) Vcell_balance[i] = 0;

}

}

for(int i = 0;i < CELL_NUM;i++) {

Vcell[i] += V_RISING;


if(Vcell[i] >= V_FINISH) {

Vcell_balance

}


// 모든 셀이 Vth 를 넘기면 Bleeding current 가 없다

if(Vcell[0] > V_TH && Vcell[1] > V_TH && Vcell[2] > V_TH) {


} else {

for(int i = 0; i < CELL_NUM;i++) {

if(Vcell[i] >= V_TH) Vcell[i] += V_BLEED;

}

for(int i =0; i < CELL_NUM; i++) {

if(Vcell[i] >= V_FINISH) { // 어느 하나라도 Vfinish 에 도달하면

Vcell_balance[i] = 1;

}


}


}


// 현재 전압을 프린트한다

fprintf(fout,"%d,%f,%f,%f\r\n",time,Vcell[0],Vcell[1],Vcell[2]);


// 모든 셀이 V hysterisis 를 넘기면 프로그램을 끝낸다

if(Vcell[0] > V_HYS && Vcell[1] > V_HYS && Vcell[2] > V_HYS) {

fprintf(stderr,"Finish!!\r\n");

}

fclose(fout);

return 0;

}


코딩중 .. 2



// Made by DAEWOO RYU
// NEW TECHNOLOGY COMPANY(N.T.C)
// Email : davdiryu@newtc.co.kr
// http://www.NTC.co.kr
// You can use this source code freely, but we don't support for upgrading or
// we do have no responsiblilty for using this source code for commercial purpose.
// When you spread this source code out, then please leave my name and company name.

// ****************************** //
// *** I2C Hardware Interface *** //
// ****************************** //

#define F_CPU (16000000L)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include <compat/twi.h>



#define MAX_TRIES 50
#define DS1307_ID    0xD0        // I2C DS1307 Device Identifier
#define DS1307_ADDR  0x00        // I2C DS1307 Device Address
#define I2C_START 0
#define I2C_DATA 1
#define I2C_DATA_ACK 2
#define I2C_STOP 3
#define ACK 1
#define NACK 0

// DS1307 Register Address
// Second: ds1307_addr[0]
// Minute: ds1307_addr[1]
// Hour  : ds1307_addr[2]
// Day   : ds1307_addr[3]
// Date  : ds1307_addr[4]
// Month : ds1307_addr[5]
// Year  : ds1307_addr[6]

#define HOUR_24 0
#define HOUR_12 1
char ds1307_addr[7];
char sdigit[3]={'0','0','\0'};
char *weekday[]={"Null","Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
char *month[]={"Null","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
char hour_mode, ampm_mode;




/* START I2C Routine */
unsigned char i2c_transmit(unsigned char type) 
{
  switch(type) {
     case I2C_START:    // Send Start Condition
       TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
       break;
     case I2C_DATA:     // Send Data with No-Acknowledge
       TWCR = (1 << TWINT) | (1 << TWEN);
  break;
     case I2C_DATA_ACK: // Send Data with Acknowledge
       TWCR = (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
  break;
     case I2C_STOP:     // Send Stop Condition
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
  return 0;
  }
  // Wait for TWINT flag set on Register TWCR
  while (!(TWCR & (1 << TWINT)));
  // Return TWI Status Register, mask the prescaller bits (TWPS1,TWPS0)
  return (TWSR & 0xF8);
}
char i2c_start(unsigned int dev_id, unsigned int dev_addr, unsigned char rw_type)
{
  unsigned char n = 0;
  unsigned char twi_status;
  char r_val = -1;
i2c_retry:
  if (n++ >= MAX_TRIES) return r_val;
  // Transmit Start Condition
  twi_status=i2c_transmit(I2C_START);

  // Check the TWI Status
  if (twi_status == TW_MT_ARB_LOST) goto i2c_retry;
  if ((twi_status != TW_START) && (twi_status != TW_REP_START)) goto i2c_quit;
  // Send slave address (SLA_W)
  TWDR = (dev_id & 0xF0) | (dev_addr & 0x07) | rw_type;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_DATA);
  // Check the TWSR status
  if ((twi_status == TW_MT_SLA_NACK) || (twi_status == TW_MT_ARB_LOST)) goto i2c_retry;
  if (twi_status != TW_MT_SLA_ACK) goto i2c_quit;
  r_val=0;
i2c_quit:
  return r_val;
}

void i2c_stop(void)
{
  unsigned char twi_status;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_STOP);
}

char i2c_write(char data)
{
  unsigned char twi_status;
  char r_val = -1;
  // Send the Data to I2C Bus
  TWDR = data;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_DATA);
  // Check the TWSR status
  if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
  r_val=0;
i2c_quit:
  return r_val;
}

char i2c_read(char *data,char ack_type)
{
  unsigned char twi_status;
  char r_val = -1;               

  if (ack_type) {
    // Read I2C Data and Send Acknowledge
    twi_status=i2c_transmit(I2C_DATA_ACK);
    if (twi_status != TW_MR_DATA_ACK) goto i2c_quit;
  } else {
    // Read I2C Data and Send No Acknowledge
    twi_status=i2c_transmit(I2C_DATA);
    if (twi_status != TW_MR_DATA_NACK) goto i2c_quit;
  }
  // Get the Data
  *data=TWDR;
  r_val=0;
i2c_quit:
  return r_val;
}

// Convert Decimal to Binary Coded Decimal (BCD)
char dec2bcd(char num)
{
  return ((num/10 * 16) + (num % 10));
}

// Convert Binary Coded Decimal (BCD) to Decimal
char bcd2dec(char num)
{
  return ((num/16 * 10) + (num % 16));
}



void Read_DS1307(void)
{
   char data;
   // First we initial the pointer register to address 0x00
   // Start the I2C Write Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
    // Start from Address 0x00
   i2c_write(0x00);
   // Stop I2C Transmission
   i2c_stop();

   // Start the I2C Read Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_READ);
   // Read the Second Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[0]=bcd2dec(data & 0x7F);
   // Read the Minute Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[1]=bcd2dec(data);
   // Read the Hour Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   if ((data & 0x40) == 0x40) {
     hour_mode = HOUR_12;
ampm_mode=(data & 0x20) >> 5;   // ampm_mode: 0-AM, 1-PM
ds1307_addr[2]=bcd2dec(data & 0x1F);
   } else {
     hour_mode = HOUR_24;
ampm_mode=0;
     ds1307_addr[2]=bcd2dec(data & 0x3F);
   }
   // Read the Day of Week Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[3]=bcd2dec(data);
   // Read the Day of Month Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[4]=bcd2dec(data);
   // Read the Month Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[5]=bcd2dec(data);
   // Read the Year Register, Send Master No Acknowledge
   i2c_read(&data,NACK);
   ds1307_addr[6]=bcd2dec(data);
   // Stop I2C Transmission
   i2c_stop();
}



void Write_DS1307(void)
{
   unsigned char i, hour_format;
   // Make sure we enable the Oscillator control bit CH=0 on Register 0x00
   ds1307_addr[0]=ds1307_addr[0] & 0x7F;
   // Start the I2C Write Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
   // Start from Address 0x00
   i2c_write(0x00);
   // Write the data to the DS1307 address start at 0x00
   // DS1307 automatically will increase the Address.
   for (i=0; i<7; i++) {
     if (i == 2) {
  hour_format=dec2bcd(ds1307_addr[i]);
  if (hour_mode) {
    hour_format |= (1 << 6);
        if (ampm_mode)
      hour_format |= (1 << 5);
         else
      hour_format &= ~(1 << 5);
  } else {
    hour_format &= ~(1 << 6);
       }
  i2c_write(hour_format);
} else {
       i2c_write(dec2bcd(ds1307_addr[i]));
     }
   }
   // Stop I2C Transmission
   i2c_stop();
}


void port_init(void)
{
  PORTB = 0x00;
  DDRB  = 0x00;

  PORTC = 0x00; //m103 output only
  DDRC  = 0x0f;

  PORTD = 0x00;
  DDRD  = 0x00;
}


unsigned char digit_num=0;
const char segment_data[10] = {63, 6,91,79,102,109,125,39,127,103};
unsigned char display_num[4]={0,0,0,0};         // Seven segment 4자리 숫자 출력 버퍼
unsigned int FourDigit=1234;

volatile int display_now = 0;


void Display(void){        
display_num[0] = (FourDigit%10000)/1000;
    display_num[1] = (FourDigit%1000)/100;
    display_num[2] = (FourDigit%100)/10;
    display_num[3] = (FourDigit%10);
}



typedef unsigned char BYTE;

volatile BYTE RS_Char=0x00;


int SendByte(BYTE data)
{
// while (!((UCSRA) & (1<<UDRE)));
loop_until_bit_is_set(UCSRA,UDRE);
UDR = data;
return 0;
}


SIGNAL(SIG_UART_RECV) // UART0 수신 인터럽트
{
RS_Char = UDR;
SendByte(RS_Char);
}


SIGNAL(SIG_OVERFLOW0)
{
static unsigned char count = 0;
  TCNT0= 0xFF - 157;          // overflow at 10 mSec

if(count > 10) { // every 100ms
display_now = 1;
count = 0;
return;
}
count++;
}


void UART_Init(unsigned long BaudRate)
{
// Not Double mode, Not multi_communication
UCSRA = 0X00;
// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
UCSRB = 0X98;
UCSRC = 0X06;
// Setting BaudRate
UBRRH = 0X00;
UBRRL = (F_CPU/BaudRate/16 - 1);

}


int main()
{

asm volatile ("cli"); //disable all interrupts
  port_init();



  TCCR0=(1<<CS02)|(1<<CS00);  // Use maximum prescaller: Clk/1024
// 64us per 1 clk
  TCNT0= 0xFF - 157;          // overflow at 10 mSec
  TIMSK=(1<<TOIE0);            // Enable Counter Overflow Interrupt


UART_Init(9600);


 // Initial ATMega168 TWI/I2C Peripheral
  TWSR = 0x00;   // Select Prescaler of 1
  // SCL frequency = 11059200 / (16 + 2 * 48 * 1) = 98.743 khz
  TWBR = 0x30;   // 48 Decimal


  asm volatile ("sei"); //re-enable interrupts

fdevopen(SendByte, 0);
 
while(1) {
    // Read DS1307
if(display_now) {
display_now = 0;
   Read_DS1307();   
printf("%s,%s(%d:%d:%d)\r\n",weekday[ds1307_addr[3]],month[ds1307_addr[5]],ds1307_addr[2],ds1307_addr[1],ds1307_addr[0]);
}
}
return 1;
}

코딩 중..



// Made by DAEWOO RYU
// NEW TECHNOLOGY COMPANY(N.T.C)
// Email : davdiryu@newtc.co.kr
// http://www.NTC.co.kr
// You can use this source code freely, but we don't support for upgrading or
// we do have no responsiblilty for using this source code for commercial purpose.
// When you spread this source code out, then please leave my name and company name.

// ****************************** //
// *** I2C Hardware Interface *** //
// ****************************** //

#define F_CPU (16000000L)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include <compat/twi.h>



#define MAX_TRIES 50
#define DS1307_ID    0xD0        // I2C DS1307 Device Identifier
#define DS1307_ADDR  0x00        // I2C DS1307 Device Address
#define I2C_START 0
#define I2C_DATA 1
#define I2C_DATA_ACK 2
#define I2C_STOP 3
#define ACK 1
#define NACK 0

// DS1307 Register Address
// Second: ds1307_addr[0]
// Minute: ds1307_addr[1]
// Hour  : ds1307_addr[2]
// Day   : ds1307_addr[3]
// Date  : ds1307_addr[4]
// Month : ds1307_addr[5]
// Year  : ds1307_addr[6]

#define HOUR_24 0
#define HOUR_12 1
char ds1307_addr[7];
char sdigit[3]={'0','0','\0'};
char *weekday[]={"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
char *month[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
char hour_mode, ampm_mode;




/* START I2C Routine */
unsigned char i2c_transmit(unsigned char type) 
{
  switch(type) {
     case I2C_START:    // Send Start Condition
       TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
       break;
     case I2C_DATA:     // Send Data with No-Acknowledge
       TWCR = (1 << TWINT) | (1 << TWEN);
  break;
     case I2C_DATA_ACK: // Send Data with Acknowledge
       TWCR = (1 << TWEA) | (1 << TWINT) | (1 << TWEN);
  break;
     case I2C_STOP:     // Send Stop Condition
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
  return 0;
  }
  // Wait for TWINT flag set on Register TWCR
  while (!(TWCR & (1 << TWINT)));
  // Return TWI Status Register, mask the prescaller bits (TWPS1,TWPS0)
  return (TWSR & 0xF8);
}
char i2c_start(unsigned int dev_id, unsigned int dev_addr, unsigned char rw_type)
{
  unsigned char n = 0;
  unsigned char twi_status;
  char r_val = -1;
i2c_retry:
  if (n++ >= MAX_TRIES) return r_val;
  // Transmit Start Condition
  twi_status=i2c_transmit(I2C_START);

  // Check the TWI Status
  if (twi_status == TW_MT_ARB_LOST) goto i2c_retry;
  if ((twi_status != TW_START) && (twi_status != TW_REP_START)) goto i2c_quit;
  // Send slave address (SLA_W)
  TWDR = (dev_id & 0xF0) | (dev_addr & 0x07) | rw_type;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_DATA);
  // Check the TWSR status
  if ((twi_status == TW_MT_SLA_NACK) || (twi_status == TW_MT_ARB_LOST)) goto i2c_retry;
  if (twi_status != TW_MT_SLA_ACK) goto i2c_quit;
  r_val=0;
i2c_quit:
  return r_val;
}

void i2c_stop(void)
{
  unsigned char twi_status;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_STOP);
}

char i2c_write(char data)
{
  unsigned char twi_status;
  char r_val = -1;
  // Send the Data to I2C Bus
  TWDR = data;
  // Transmit I2C Data
  twi_status=i2c_transmit(I2C_DATA);
  // Check the TWSR status
  if (twi_status != TW_MT_DATA_ACK) goto i2c_quit;
  r_val=0;
i2c_quit:
  return r_val;
}

char i2c_read(char *data,char ack_type)
{
  unsigned char twi_status;
  char r_val = -1;               

  if (ack_type) {
    // Read I2C Data and Send Acknowledge
    twi_status=i2c_transmit(I2C_DATA_ACK);
    if (twi_status != TW_MR_DATA_ACK) goto i2c_quit;
  } else {
    // Read I2C Data and Send No Acknowledge
    twi_status=i2c_transmit(I2C_DATA);
    if (twi_status != TW_MR_DATA_NACK) goto i2c_quit;
  }
  // Get the Data
  *data=TWDR;
  r_val=0;
i2c_quit:
  return r_val;
}

// Convert Decimal to Binary Coded Decimal (BCD)
char dec2bcd(char num)
{
  return ((num/10 * 16) + (num % 10));
}

// Convert Binary Coded Decimal (BCD) to Decimal
char bcd2dec(char num)
{
  return ((num/16 * 10) + (num % 16));
}



void Read_DS1307(void)
{
   char data;
   // First we initial the pointer register to address 0x00
   // Start the I2C Write Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
    // Start from Address 0x00
   i2c_write(0x00);
   // Stop I2C Transmission
   i2c_stop();

   // Start the I2C Read Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_READ);
   // Read the Second Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[0]=bcd2dec(data & 0x7F);
   // Read the Minute Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[1]=bcd2dec(data);
   // Read the Hour Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   if ((data & 0x40) == 0x40) {
     hour_mode = HOUR_12;
ampm_mode=(data & 0x20) >> 5;   // ampm_mode: 0-AM, 1-PM
ds1307_addr[2]=bcd2dec(data & 0x1F);
   } else {
     hour_mode = HOUR_24;
ampm_mode=0;
     ds1307_addr[2]=bcd2dec(data & 0x3F);
   }
   // Read the Day of Week Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[3]=bcd2dec(data);
   // Read the Day of Month Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[4]=bcd2dec(data);
   // Read the Month Register, Send Master Acknowledge
   i2c_read(&data,ACK);
   ds1307_addr[5]=bcd2dec(data);
   // Read the Year Register, Send Master No Acknowledge
   i2c_read(&data,NACK);
   ds1307_addr[6]=bcd2dec(data);
   // Stop I2C Transmission
   i2c_stop();
}



void Write_DS1307(void)
{
   unsigned char i, hour_format;
   // Make sure we enable the Oscillator control bit CH=0 on Register 0x00
   ds1307_addr[0]=ds1307_addr[0] & 0x7F;
   // Start the I2C Write Transmission
   i2c_start(DS1307_ID,DS1307_ADDR,TW_WRITE);
   // Start from Address 0x00
   i2c_write(0x00);
   // Write the data to the DS1307 address start at 0x00
   // DS1307 automatically will increase the Address.
   for (i=0; i<7; i++) {
     if (i == 2) {
  hour_format=dec2bcd(ds1307_addr[i]);
  if (hour_mode) {
    hour_format |= (1 << 6);
        if (ampm_mode)
      hour_format |= (1 << 5);
         else
      hour_format &= ~(1 << 5);
  } else {
    hour_format &= ~(1 << 6);
       }
  i2c_write(hour_format);
} else {
       i2c_write(dec2bcd(ds1307_addr[i]));
     }
   }
   // Stop I2C Transmission
   i2c_stop();
}


void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x0f;
 PORTD = 0x00;
 DDRD  = 0x00;
}


unsigned char digit_num=0;
const char segment_data[10] = {63, 6,91,79,102,109,125,39,127,103};
unsigned char display_num[4]={0,0,0,0};         // Seven segment 4자리 숫자 출력 버퍼
unsigned int FourDigit=1234;

int display_now = 0;

SIGNAL(SIG_OVERFLOW0)
{
    TCNT0 = 0x94; //reload counter value
display_now = 1;
}

void Display(void){        
display_num[0] = (FourDigit%10000)/1000;
    display_num[1] = (FourDigit%1000)/100;
    display_num[2] = (FourDigit%100)/10;
    display_num[3] = (FourDigit%10);
}



typedef unsigned char BYTE;

volatile BYTE RS_Char=0x00;


int SendByte(BYTE data)
{
// while (!((UCSRA) & (1<<UDRE)));
loop_until_bit_is_set(UCSRA,UDRE);
UDR = data;
return 0;
}


SIGNAL(SIG_UART_RECV) // UART0 수신 인터럽트
{
RS_Char = UDR;
SendByte(RS_Char);
}

void UART_Init(unsigned long BaudRate)
{
// Not Double mode, Not multi_communication
UCSRA = 0X00;
// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
UCSRB = 0X98;
UCSRC = 0X06;
// Setting BaudRate
UBRRH = 0X00;
UBRRL = (F_CPU/BaudRate/16 - 1);

}


int main()
{

asm volatile ("cli"); //disable all interrupts
  port_init();



  TCCR0A=0x00;                  // Normal Timer0 Operation
  TCCR0B=(1<<CS02)|(1<<CS00);   // Use maximum prescaller: Clk/1024
  TCNT0=0x94;                   // Start counter from 0x94, overflow at 10 mSec
  TIMSK=(1<<TOIE0);            // Enable Counter Overflow Interrupt


UART_Init(9600);


 // Initial ATMega168 TWI/I2C Peripheral
  TWSR = 0x00;   // Select Prescaler of 1
  // SCL frequency = 11059200 / (16 + 2 * 48 * 1) = 98.743 khz
  TWBR = 0x30;   // 48 Decimal


  asm volatile ("sei"); //re-enable interrupts

fdevopen(SendByte, 0);
 
while(1) {
    // Read DS1307
if(display_now) {
display_now = 0;
   Read_DS1307();   
printf("%d,%d,%d,%d,%d,%d,%d\r\n",ds1307_addr[0],ds1307_addr[1],ds1307_addr[2],ds1307_addr[3],ds1307_addr[4],ds1307_addr[5],ds1307_addr[6]);
}
}
return 1;
}

부스트 컨버터의 제작.

MC34063 칩을 이용하여 12V 입력을 170V 출력으로 바꿔주는 부스트 컨버터를 제작하였다.

원래 이렇게 많이 튀기는 건 효율상 쓰질 않으나 닉시관이 소모하는 전력이 크지 않아 무시하기로 하였다.

 

NIXIE 소켓용 PCB 제작..

NIXIE 관은 170V 라는 고전압으로 구동하기 때문에, 일반적인 MCU 출력 등으로는 제어할 수 없다.

원래에는 이런 닉시관을 on off 하기에 최적화된 74141 이라는 칩을 사용하던데, 이를 구할 수 없어서,

외부에 TR을 달았다.

내압 350V 짜리 TR 페어인 2N6517, 2N6520 을 사용하였다.
 
이를 보통의 4bit decoder 를 이용하여 제어할 생각이다. 

nixie

#include <SPI.h>

#define    SW1PIN    (3)
#define    SW2PIN    (4)
#define    SW3PIN    (5)

#define    DIGIT1PIN  (6)
#define    DIG2T1PIN  (7)
#define    DIG3T1PIN  (8)
#define    DIG4T1PIN  (9)

#define    DECODE1PIN  (10)
#define    DECODE2PIN  (10)
#define    DECODE3PIN  (10)
#define    DECODE4PIN  (10)

int hour, minute,second;

unsigned long cur_time, last_time;

void setup() 
{
  hour = 0;
  minute = 0;
  second = 0;
  pinMode(SW1PIN,INPUT);
  pinMode(SW2PIN,INPUT);
  pinMode(SW3PIN,INPUT);

  Serial.begin(9600);
  SPI.begin();
 
  last_time = millis() + 1000; 
  delay(100);
}


void loop() 
{
  if(digitalRead(SW1PIN) == LOW) {
    Serial.println("SW1 ..");
  }
  if(digitalRead(SW2PIN) == LOW) {
    Serial.println("SW2 ..");
  }
  if(digitalRead(SW3PIN) == LOW) {
    Serial.println("SW3 ..");
  }
  
  
  
  cur_time = milis();
  if(cur_time < last_time) return;
  last_time = cur_time + 1000;
  
  second = second + 1;
  if(second > 60)  {
    minute = minute + 1;
    second = 0;
    if(minute > 60) {
      hour = hour + 1;
      minute = 0;
    }
  }
}

prev 1 2 3 4 next