Arduino UNO + 1 Shift register (74hc595) og 2 BCD 4511 + 2 styk 7 segment = c? (Læst 15590x)

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Hello World (Undskyld for den lange overskrift)

Sidder her og skal senere idag fremvise noget elektronik jeg har bikset sammen for en ven, og står i den situration at jeg simplenhen ikke kan få bikset en kode sammen, hverken i Arduino IDE programmet, eller via terminalen i Ubuntu med C kode.

Selve setup'et er fint, jeg har forbundet Arduino UNO til 1 shift register, og videre ud til 2 BCD (4511), som kontrollere 2 styk 7 Segment.

Problemet er igen, Koden.

Jeg prøvede tidligere at se om jeg kunne få Arduino IDE til at skyde med binær (Hvilket gav nogle mærkelige resultater)...

Nogen der kan hjælpe?

Det er dog et privat projekt en af mine venner har gang i, jeg hjælper bare :P

---

Information om udstyr:
Bruger en USB port, har Arduino UNO, koder i ren C, sidder på en Ubuntu 12.04 bærbar, og skal have det til at køre via terminalen.

HJÆLP!
Mvh. Danni Hansen.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Hej Danni,

Kan du sende koden, du har skrevet?

gerd

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Halløjsa Gerd.

Beklager, den er blevet slettet da den ikke fungerede... :(

Mvh. Danni.
Mvh. Danni Hansen.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Hej Danni,

Ok, start med 75HC595:

/OE (Output Enable) skal være LOW
/MR (Reset) skal  være HIGH
SHCP (shift clock) og STCP (storage clock) skal være LOW, når du starter.

Kode:
int SHCP = 13;
int STCP = 12;
int DS   = 11;

void setup() {               
  // initialize the digital pin as an output.
  pinMode(SHCP, OUTPUT);     
  pinMode(STCP, OUTPUT);   
  pinMode(DS, OUTPUT);

  digitalWrite(SHCP, LOW); // start with SHCP low
  digitalWrite(STCP, LOW); // start with SHCP low 
}


Du ønsker at have 01000011 på udgangen Q7,Q6,Q5..Q0.
Skriv 01000011 i en variabel.

Kode:
int temp = 0b01000011; // binary ... or ...
//int temp = 0x43;       // hexadecimal .. or ..
//int temp = 67;         // decimal

Du skal starte med Q7. Q7 er den venstre bit og er 0. Med:
Kode:
if (temp & 0b10000000)
du kan teste, hvis bit 7 er "1"

Det kode skrive bit 7 af temp på shift register:
Kode:
if (temp & 0b10000000)
  digitalWrite(DS, HIGH); // Q7 is set, so write a HIGH to the DS pin
else
  digitalWrite(DS, LOW); // Q7 is NOT set, so write a LOW to the DS pin

digitalWrite(SHCP, HIGH); // Take the DS into the shift register
digitalWrite(SHCP, LOW);

Nu skal du gøre det med Q6, Q5, Q4 ...
Det er lettest, hvis du "shift" alle bits til venstre. (Q6 -> Q7, Q5 -> Q6 ..):

Kode:
temp = temp << 1;
Nu kan du gentage det med Q7.
Gør det 8 gange for alle 8 bit:

Kode:
int i;

for (i=0; i<8; i++) {
  if (temp & 0b10000000)
    digitalWrite(DS, HIGH); // Q7 is set, so write a HIGH to the DS pin
  else
    digitalWrite(DS, LOW); // Q7 is NOT set, so write a LOW to the DS pin

  digitalWrite(SHCP, HIGH); // Take the DS into the shift register
  digitalWrite(SHCP, LOW);

  temp = temp << 1;
}

Nu skal du generere en puls for at kopiere den til udgangen:
Kode:
digitalWrite(STCP, HIGH); // Take the date of the shift register to the 8 outputs
digitalWrite(STCP, LOW);

Du har 2 BCD 4511 og du ønsker at have nummeret 42.

Kode:
int bcd1= 4;
int bcd2= 2;

Din shift register 74HC595 har 8 udgange. Q7 .. Q4 til BCD1 og Q3 .. Q0 til BCD2.
Med:
Kode:
temp = bcd1 << 4   |  bcd2;
du har nummer 4 på Q7..Q4 og nummer 2 på Q3..Q0.

Her er hele koden (jeg har ikke prøvet det):
Kode:
int SHCP = 13;
int STCP = 12;
int DS   = 11;

void setup() {               
  // initialize the digital pin as an output.
  pinMode(SHCP, OUTPUT);     
  pinMode(STCP, OUTPUT);   
  pinMode(DS, OUTPUT);

  digitalWrite(SHCP, LOW); // start with SHCP low
  digitalWrite(STCP, LOW); // start with SHCP low 
}

// Write 2 4-bit BCD values to the 8-bit shift register.
void setBCD(int bcd1, int bcd2) {
int temp;
int i;

  temp = bcd1 << 4 | bcd2;

  for (i=0; i<8; i++) {
    if (temp & 0b10000000)
      digitalWrite(DS, HIGH); // Q7 is set, so write a HIGH to the DS pin
    else
      digitalWrite(DS, LOW); // Q7 is NOT set, so write a LOW to the DS pin

    digitalWrite(SHCP, HIGH); // Take the DS into the shift register
    digitalWrite(SHCP, LOW);

    temp = temp << 1;
  }

  digitalWrite(STCP, HIGH); // Take the date of the shift register to the 8 outputs
  digitalWrite(STCP, LOW);
}

void loop() {
  setBCD(4,2); // Write a 42 to Dannis display
  delay(1000);  // wait for a second
}


gerd

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Hej Gerd.

Tak for hjælpen, kigger på det i morgen (Søndag)

Skal lige have lavet opstillingen igen.

Mvh. Danni.
Mvh. Danni Hansen.

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Hej Gerd.

Har du mulighed for at vise mig hvilken pins der skal sidde hvor?
Altså:

4511: a,b,c,d pins til hvilken Q1->Q8 pins.

Mvh. Danni.
Mvh. Danni Hansen.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Hej Danni,

>4511: a,b,c,d pins til hvilken Q1->Q8 pins.

Hvis du har pins Q1..Q8:
Q1 -> a (1)
Q2 -> b (1)
Q3 -> c (1)
Q4 -> d (1)
Q5 -> a (2)
Q6 -> b (2)
Q7 -> c (2)
Q8 -> d (2)

Hvis du har pins Q0..Q7:
Q0 -> a (1)
Q1 -> b (1)
Q2 -> c (1)
Q3 -> d (1)
Q4 -> a (2)
Q5 -> b (2)
Q6 -> c (2)
Q7 -> d (2)


gerd

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Hej Gerd.

Så fik jeg det nogenlunde til at vise rigtig..

Nu skal jeg bare have rettet "lidt" i koden..

Citér
int SHCP = 13;
int STCP = 12;
int DS   = 11;

void setup() {               
  // initialize the digital pin as an output.
  pinMode(SHCP, OUTPUT);     
  pinMode(STCP, OUTPUT);   
  pinMode(DS, OUTPUT);

  Serial.begin(9600);

  digitalWrite(SHCP, LOW); // start with SHCP low
  digitalWrite(STCP, LOW); // start with SHCP low
}

// Write 2 4-bit BCD values to the 8-bit shift register.
void setBCD(int bcd1, int bcd2) {
int temp;
int i;

  temp = bcd1 << 4 | bcd2;

  for (i=0; i<8; i++) {
    if (temp & 0b10000000)
      digitalWrite(DS, HIGH); // Q7 is set, so write a HIGH to the DS pin
    else
      digitalWrite(DS, LOW); // Q7 is NOT set, so write a LOW to the DS pin

    digitalWrite(SHCP, HIGH); // Take the DS into the shift register
    digitalWrite(SHCP, LOW);

    temp = temp << 1;   
  }

  digitalWrite(STCP, HIGH); // Take the date of the shift register to the 8 outputs
  digitalWrite(STCP, LOW);
}

void loop() {
 
int output[] = {0,1,2,3,4,5,6,7,8,9};
int outputten;
int outputtenn;

 if(Serial.available()>0){
  //setBCD(output[Serial.write(DEC)], output[Serial.write(DEC)]);   // Write a 42 to Dannis display
  delay(500);  // wait for a second
 }
 
}
Mvh. Danni Hansen.

 

Offline gerd

  • Administrator
  • µProcessoren
  • *****
  • Indlæg: 915
  • Antal brugbare Indlæg: 97
    • Vis profil
    • Hjemmeside med nogle af mine projekter
Hej Danni,

prøv det:

Kode:
void loop() {

int bcd1=0, bcd2=0;
char incomingByte;

 if(Serial.available()>0){
      incomingByte = Serial.read(); // read the character
      if ( ( incomingByte < '0' ) || ( incomingByte > '9' ) ) { // was it a number ?
           // No, it wasn't. It was an "ENTER" or something else.
           // So show it on Danni's display.
           setBCD(bcd1, bcd2 );
      }
      else {  // it was a number
           bcd1 = bcd2; // shift the last number to the left
           bcd2 = incomingByte - '0'; // convert the ASCII code
      }
 }



gerd