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

TODAY1,000 TOTAL604,546
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

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


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

페이지 정보

작성자 지니아빠 작성일2019-07-17 00:05 조회75회 댓글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

조회수 75

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 592
공지 사이트 이용 안내댓글[8] master 17-10-29 7619
공지 [무료 공개] 소스코드 하이라이트 v2.0 beta [2013.02.07]댓글[1] 이미지첨부파일 master 18-01-23 2838
질문 atmega128a 카운터/타이머 출력비교 질문이요댓글[1] 새글 초짜 00:54 7
질문 모터드라이버 병렬 연결댓글[3] 새글 박준2 19-08-16 11
질문 서로 다른전원(5v 12v) 제어방법 질문 새글 master 19-08-16 8
질문 모터드라이버 관련 질문 드립니다.댓글[4] 박준이 19-08-15 14
질문 Atmega128, 초음파센서 ,부저 gksl 19-08-14 13
답변 답변글 답변 : Atmega128, 초음파센서 ,부저댓글[1] master 19-08-15 14
질문 led 전력소모에 관하여,,,댓글[9] 슬레a 19-08-14 33
질문 알고리즘 문의댓글[1] 벅바 19-08-13 15
질문 블루투스가 한번 작동하고 그 다음부터 작동을 하지 않습니다.댓글[1] 아야어여 19-08-13 18
질문 아두이노 코딩 질문입니다 너무 급해요 ㅠㅠ댓글[3] 전민결 19-08-12 37
질문 코딩 작성좀 부탁드립니다. 너무 급합니다 ㅠㅠ댓글[1] 아두이노보초 19-08-10 59
질문 stm32f1 계열에서 USB로 스마트폰 연결 방법(CDC)댓글[2] 에르테르 19-08-08 33
질문 코딩을 합치고 싶습니다.. 알려주세요 19-08-08 36
답변 답변글 답변 : 코딩을 합치고 싶습니다.. master 19-08-08 37
질문 금속센서를 이용한 서보모터 돌리기댓글[1] 후우 19-08-07 43
질문 아두이노로 빛 파장 계산하기 이미지 master 19-08-07 33
질문 ISP 질문이요댓글[2] 초짜 19-08-06 31
질문 atmega128a 다시 질문이요~댓글[4] 이미지첨부파일 초짜 19-08-05 46
질문 atmega128a SCK 질문이요댓글[1] 초짜 19-08-04 36
답변 답변글 답변 : atmega128a SCK 질문이요 master 19-08-04 28
질문 A4988 모터드라이버 발열에 대해...댓글[1] 이미지첨부파일 눈티이 19-07-30 61
질문 아두이노 코딩 질문댓글[1] 119min 19-07-27 73
질문 아두이노 코딩질문 붕붕 19-07-26 60
답변 답변글 답변 : 아두이노 코딩질문댓글[6] master 19-07-26 144
질문 적외선 센서 송수신 코딩 알려주세요댓글[3] 이미지첨부파일 뱀비 19-07-22 107
질문 BLDC 모터 정역회전 알고리즘대로 코딩 이미지첨부파일 CIE18 19-07-21 71
답변 답변글 답변 : BLDC 모터 정역회전 알고리즘대로 코딩 master 19-07-21 66
게시물 검색

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 ⓒ 2017
모바일버전으로보기