질문게시판 > 정수선언에 대해 문의 드립니다

TODAY2,120 TOTAL2,173,319
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 정수선언에 대해 문의 드립니다

페이지 정보

작성자 지니아빠 작성일2019-07-17 00:05 조회16,126회 댓글6건

본문

	

정수형 함수를 콜할때 

int형은 16비트로 32768 까지 처리되고

long형은 32비트로 2147483648까지 처리되네요

 

많은 보턴으로 키값을 받아오는데 int형은 보턴 16개 long형은 32개까지만 들어오고

나머지는 처리가(보턴을 눌러도 무반응) 되지 않습니다

 

33번째 보턴부터는 어떻게 처리되야 하나요

 

아래는 소스일부분입니다

 

#include "MIDIUSB.h"
#define NUMBER_OF_SHIFT_CHIPS   5
#define DATA_WIDTH   NUMBER_OF_SHIFT_CHIPS * 8
#define PULSE_WIDTH_USEC   5
#define POLL_DELAY_MSEC   1


#define BYTES_VAL_T unsigned int     //여기서 선언되어야하는데
#define BYTES_VAL_X unsigned long  //      "

 

int ploadPin        = 3;  // Connects to Parallel load pin the 165
int clockEnablePin  = 5;  // Connects to Clock Enable pin the 165
int dataPin         = 7; // Connects to the Q7 pin the 165
int clockPin        = 9; // Connects to the Clock pin the 165

 

BYTES_VAL_X pinValues;
BYTES_VAL_X oldPinValues;

 

BYTES_VAL_X read_shift_regs()      //현재는 long으로 잡았습니다
{

    long bitVal = 0;
    BYTES_VAL_X  bytesVal = 0;

 

    digitalWrite(clockEnablePin, HIGH);
    digitalWrite(ploadPin, LOW);
    delayMicroseconds(PULSE_WIDTH_USEC);
    digitalWrite(ploadPin, HIGH);
    digitalWrite(clockEnablePin, LOW);

 

    for(int i = 0; i < DATA_WIDTH; i++)
    {
        bitVal = digitalRead(dataPin);
        bytesVal |= (bitVal << ((DATA_WIDTH-1) - i));
        digitalWrite(clockPin, HIGH);
        delayMicroseconds(PULSE_WIDTH_USEC);
        digitalWrite(clockPin, LOW);
    }
    return(bytesVal);
}
 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 6

조회수 16,126

master님의 댓글

master 작성일

회로도 첨부해보세요

지니아빠님의 댓글

지니아빠 작성일

죄송합니다. 회로도는 따로 없고 74HC165 5개를 1,2,15번핀은 같은핀끼리 연결하였고
9번과10번핀은 10번핀을 다음 165 9번으로보내고 10번은 다시 다름 9번으로 보내고
마지막 다섯번째 10번에서 아두이노로 연결하였습니다.
165 4개(32버튼) 까지는 잘됩니다. 어떤것이던 1개를 빼고 4개만으로는 다 동작하니 회로는 정상적인것 같네요

master님의 댓글

master 댓글의 댓글 작성일

전체 소스코드가 아니라서 구체적인 조언을 해드릴 수는 없고
대충만 적어드리죠
함수의 리턴형으로 받지말고 전역변수를 사용하세요
for()문에서 8비트를 읽고있죠?
byte d[5];
for(int k=0;k<5;k++){ // 5바이트 읽기
  for(){ // 8비트 읽기 // 생략된 코드가 있습니다.
    d[k] |= (bitVal << ((DATA_WIDTH-1) - i));
  }
}

지니아빠님의 댓글

지니아빠 작성일

지금은 멀리 나와있어 폰으로 글 적습니다
사용하는 부품은 74hc165 5개를 하나당 버튼 8개씩해서 총 40개를 사용하고 있습니다.
그리고 for문을 0에서 40보다 작을때까 돌립니다.
그러다보니 버튼하나당 이진수 하나해서 40자리까지가니 long의 범위를 벗어나더군요,
전체소스는 저녁에 집에 들어가서 올려볼께요

master님의 댓글

master 댓글의 댓글 작성일

40비트를 한번에 돌리지말고
답변처럼 이중루프를 돌리세요

지니아빠님의 댓글

지니아빠 댓글의 댓글 작성일

#include "MIDIUSB.h"
#define NUMBER_OF_SHIFT_CHIPS  5
#define DATA_WIDTH  NUMBER_OF_SHIFT_CHIPS * 8
#define PULSE_WIDTH_USEC  5
#define POLL_DELAY_MSEC  1
#define BYTES_VAL_T unsigned int
#define BYTES_VAL_X unsigned long

int ploadPin        = 3;  // Connects to Parallel load pin the 165
int clockEnablePin  = 5;  // Connects to Clock Enable pin the 165
int dataPin        = 7; // Connects to the Q7 pin the 165
int clockPin        = 9; // Connects to the Clock pin the 165

BYTES_VAL_X pinValues;
BYTES_VAL_X oldPinValues;
BYTES_VAL_T shift1, shift2, shift3, Oldshift1, Oldshift2, Oldshift3;

BYTES_VAL_X read_shift_regs()
{
    long bitVal = 0;
    BYTES_VAL_X  bytesVal = 0;

    digitalWrite(clockEnablePin, HIGH);
    digitalWrite(ploadPin, LOW);
    delayMicroseconds(PULSE_WIDTH_USEC);
    digitalWrite(ploadPin, HIGH);
    digitalWrite(clockEnablePin, LOW);

    for(int i = 0; i < DATA_WIDTH; i++)
    {
        bitVal = digitalRead(dataPin);
        bytesVal |= (bitVal << ((DATA_WIDTH-1) - i));
        digitalWrite(clockPin, HIGH);
        delayMicroseconds(PULSE_WIDTH_USEC);
        digitalWrite(clockPin, LOW);
    }
    return(bytesVal);
}

void display_pin_values()
{
  Oldshift1 = pinValues & 0x04;
  if (Oldshift1 != 0 ) {
    shift1 = Oldshift1;
    shift2 = 0;
    shift3 = 0;
  }

  Oldshift2 = pinValues & 0x08;
  if (Oldshift2 != 0 ) {
    shift1 = 0;
    shift2 = Oldshift2;
    shift3 = 0;
  }


  byte pitch;

    for(int i = 0; i < DATA_WIDTH; i++)
    {
        Serial.print(pinValues);
        Serial.print("\r\n");
      if((pinValues >> i) & 1) {
//        Serial.print(i);
//        Serial.print("\r\n");
        switch (i) {

          case 0:
            pitch = i + 1;
            noteOn(0, pitch, 64);  //Channel 0, middle C, normal velocity
            MidiUSB.flush();
            delay(200);
         
            noteOff(0, pitch, 64);  //Channel 0, middle C, normal velocity
            MidiUSB.flush();
            delay(200);

            break;
 
          case 1:
.
.
          case 40:
            pitch = i + 1;
            noteOn(0, pitch, 64);  //Channel 0, middle C, normal velocity
            MidiUSB.flush();
            delay(200);
         
            noteOff(0, pitch, 64);  //Channel 0, middle C, normal velocity
            MidiUSB.flush();
            delay(200);

            break;
                     
          default:
            break;
          }
      }   
    }
}

void setup()
{
    Serial.begin(9600);

    pinMode(ploadPin, OUTPUT);
    pinMode(clockEnablePin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, INPUT);

    digitalWrite(clockPin, LOW);
    digitalWrite(ploadPin, HIGH);
}

void loop()
{
    pinValues = read_shift_regs();

    if(pinValues != 0) {
      if(pinValues != oldPinValues) {
          display_pin_values();
          oldPinValues = pinValues;
      }
    }
    delay(POLL_DELAY_MSEC);
}

void noteOn(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
}
 
void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 9689
공지 사이트 이용 안내댓글[24] master 17-10-29 29809
질문 아두이노 api 질문댓글[1] 새글첨부파일 리니어 19:19 16
질문 atmega128 키패드 입력 오류에 대하여 질문 있습니다.댓글[2] 새글 마프하나 16:07 35
질문 초음파센싱을 통한 리니어벨트 (스텝모터사용) 조건문댓글[1] 새글 아두이노대학 15:01 17
질문 아트메가128/ srf05 초음파센서를 이용한 타이머 인터럽트 질문입니다 새글 아트메가넘어려워 14:10 20
답변 답변글 답변 : 아트메가128/ srf05 초음파센서를 이용한 타이머 인터럽트 질문입니다 새글 master 14:56 16
질문 atmega128에서 스위치1개는LED, 스위치 1개는 세그먼트의 동작하게 하려는데.. 새글 aasdw 06:28 34
답변 답변글 답변 : atmega128에서 스위치1개는LED, 스위치 1개는 세그먼트의 동작하게 하려는데..댓글[1] 새글 master 14:09 24
질문 Atmega128 블루투스 오류 질문 새글 yhj2644 01:35 25
답변 답변글 답변 : Atmega128 블루투스 오류 질문 새글 master 13:51 20
질문 아두이노 간단한 프로그램 새글 행복지수업 22-05-25 26
답변 답변글 답변 : 아두이노 간단한 프로그램 새글 master 12:06 15
질문 atmega128 타이머 작성시 키패트 입력으로 인터럽트 사용에 대하여 질문이 있습니다.댓글[1] 이미지새글 마프하나 22-05-25 37
질문 로드셀 무게 센서 질문드립니다.댓글[2] 새글 제비고기 22-05-25 37
질문 adc, uart dma댓글[3] 새글첨부파일 hiㅡO3O 22-05-25 27
질문 ADC,uart DMA댓글[1] 이미지새글첨부파일 hiㅡO3O 22-05-25 26
질문 아두이노 스텝모터 리미트 문의드립니다.댓글[4] 이미지첨부파일 스트렌져 22-05-24 40
질문 진동센서와 서보모터 연결 코드 질문입니다!댓글[1] 제리 22-05-24 29
질문 atmega128 GPS,블루투스 질문드립니다.댓글[1] 코딩초보1 22-05-24 37
질문 서보모터 제어에 관하여 궁금합니다댓글[3] 이미지첨부파일 오소로롯 22-05-24 58
질문 atmega 128 타이머 작성 중 질문 드립니다.댓글[8] 이미지 마프하나 22-05-23 77
질문 아두이노와 휴대폰을 HC-06으로 연결시켜서 블루투스연결이 끊기면 부저에서 소리가 나게 할려하는데 어떻게 해…댓글[1] 졸작부수다 22-05-23 240
답변 답변글 답변 : 아두이노와 휴대폰을 HC-06으로 연결시켜서 블루투스연결이 끊기면 부저에서 소리가 나게 할려하는데 … master 22-05-24 32
질문 보드레이트 질문댓글[1] 죠르디 22-05-23 34
질문 atmega 128 블루투스 질문 입니다댓글[1] yhj2644 22-05-23 56
질문 아트메가 공부중에 질문있습니다..댓글[1] suid82 22-05-23 42
질문 Atmega128 UART통신 echo 반복 질문댓글[2] ming2ming 22-05-23 66
질문 아두이노의 지속 시간에 대해 질문합니다. merry 22-05-23 56
답변 답변글 답변 : 아두이노의 지속 시간에 대해 질문합니다. master 22-05-23 41
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기