2015. május 31., vasárnap

Digitális dobókocka - A cikk végén videó

Sziasztok!

Mint ígértem ma, egy digitális dobókocka teljes leírásával fogok nektek kedveskedni.

Elkészítése egyszerű, gyors, kényelmes.
Kevés alkatrészt igényel és a már jól megismert PIC16F628-as mikrovezérlő hajtja.



A program lényege a MikroC -ben is ismert rand() függvény amely 0 és kb 33 ezer között generál egy random számot. Ezt aztán én elosztom 50-el majd 1000-el és így kicsit többet kapok mint 6. A megkapott eredményt részekre osztom, ha 1-nél kisebb, ha 2, 3, 4, 5 vagy ha 6-nál több.

Ezek után ezt egyszerűen megjeleníti 7 LED-en, természetesen a valódi Dobókockának megfelelő mintázatban.

A következőkben pedig a kód:

int result;
unsigned char ii, nn, mm, kk, ff, kiki;

/*
A rand() függvény 0 és 32767 között generál egy számot
*/

void beep(void) {
  for(nn=0; nn<=40; nn++) {
    PORTA.F0=0;
    Delay_us(200);
    PORTA.F0=1;
    Delay_us(200);
  }
}

void kijelzes(void) {
  if(result<=1){
    PORTB.F1=1;
    PORTB.F2=1;
    PORTB.F3=1;
    PORTB.F4=0;
    PORTB.F5=1;
    PORTB.F6=1;
    PORTB.F7=1;
  }
  else if(result==2){
    PORTB.F1=1;
    PORTB.F2=1;
    PORTB.F3=0;
    PORTB.F4=1;
    PORTB.F5=0;
    PORTB.F6=1;
    PORTB.F7=1;
  }
  else if(result==3){
    PORTB.F1=1;
    PORTB.F2=1;
    PORTB.F3=0;
    PORTB.F4=0;
    PORTB.F5=0;
    PORTB.F6=1;
    PORTB.F7=1;
  }
  else if(result==4){
    PORTB.F1=0;
    PORTB.F2=1;
    PORTB.F3=0;
    PORTB.F4=1;
    PORTB.F5=0;
    PORTB.F6=1;
    PORTB.F7=0;
  }
  else if(result==5){
    PORTB.F1=0;
    PORTB.F2=1;
    PORTB.F3=0;
    PORTB.F4=0;
    PORTB.F5=0;
    PORTB.F6=1;
    PORTB.F7=0;
  }
  else if(result>=6){
    PORTB.F1=0;
    PORTB.F2=0;
    PORTB.F3=0;
    PORTB.F4=1;
    PORTB.F5=0;
    PORTB.F6=0;
    PORTB.F7=0;
  }
}

void villogas(void) {
  for(ii=0; ii<=5; ii++) {
    PORTB.F1=1;
    PORTB.F2=1;
    PORTB.F3=1;
    PORTB.F4=1;
    PORTB.F5=1;
    PORTB.F6=1;
    PORTB.F7=1;
    Delay_ms(75);
    kijelzes();
    Delay_ms(150);
  }
}

void main() {

  TRISB0_bit=1;
  TRISB1_bit=0;     //bal-felso
  TRISB2_bit=0;     //bal-kozepso
  TRISB3_bit=0;     //bal-also
  TRISB4_bit=0;     //kozepso
  TRISB5_bit=0;     //jobb-felso
  TRISB6_bit=0;     //jobb-kozepso
  TRISB7_bit=0;     //jobb-also
  TRISA0_bit=0;     //hangszoro
  
  Delay_ms(100);
  dolgozok:
  PORTB.F1=0;
  PORTB.F2=0;
  PORTB.F3=0;
  PORTB.F4=0;
  PORTB.F5=0;
  PORTB.F6=0;
  PORTB.F7=0;
  
  beep();
  beep();
  beep();
  Delay_ms(75);
  beep();
  beep();
  beep();
  Delay_ms(75);
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();

  PORTB.F1=1;
  PORTB.F2=1;
  PORTB.F3=1;
  PORTB.F4=1;
  PORTB.F5=1;
  PORTB.F6=1;
  PORTB.F7=1;
  kk=0;
  
  while(PORTB.F0==0) {
    PORTB.F1=0;
    PORTB.F2=1;
    PORTB.F3=1;
    PORTB.F5=1;
    PORTB.F6=1;
    PORTB.F7=1;
    beep();
    Delay_ms(20);
    PORTB.F1=1;
    PORTB.F2=0;
    PORTB.F3=1;
    PORTB.F5=1;
    PORTB.F6=1;
    PORTB.F7=1;
    beep();
    Delay_ms(20);
    PORTB.F1=1;
    PORTB.F2=1;
    PORTB.F3=0;
    PORTB.F5=1;
    PORTB.F6=1;
    PORTB.F7=1;
    beep();
    Delay_ms(20);
    PORTB.F1=1;
    PORTB.F2=1;
    PORTB.F3=1;
    PORTB.F5=1;
    PORTB.F6=1;
    PORTB.F7=0;
    beep();
    Delay_ms(20);
    PORTB.F1=1;
    PORTB.F2=1;
    PORTB.F3=1;
    PORTB.F5=1;
    PORTB.F6=0;
    PORTB.F7=1;
    beep();
    Delay_ms(20);
    PORTB.F1=1;
    PORTB.F2=1;
    PORTB.F3=1;
    PORTB.F5=0;
    PORTB.F6=1;
    PORTB.F7=1;
    beep();
    Delay_ms(20);
  }
  
  while(1) {
    if(PORTB.F0==1) {
      while(PORTB.F0==1) {
        kk=kk+1;
        Delay_ms(10);
        if(kk==100) {
          goto szunya;
        }
      }
      kk=0;
      for(ii=0; ii<=40; ii++) {
        result = rand();
        result = result/100;
        result=result/50;
        kijelzes();
        beep();
        Delay_ms(20);
        if(ii>=15) {
          Delay_ms(2);
        }
        if(ii>=20) {
          Delay_ms(5);
        }
        if(ii>=24) {
          Delay_ms(5);
        }
        if(ii>=28) {
          Delay_ms(5);
        }
        if(ii>=32) {
          Delay_ms(5);
        }
        if(ii>=34) {
          Delay_ms(5);
        }
        if(ii>=36) {
          Delay_ms(5);
        }
        if(ii>=38) {
          Delay_ms(5);
        }
      }
      villogas();
    }
  }
  szunya:
  beep();
  beep();
  beep();
  beep();
  while(PORTB.F0==1) {}
  PORTB.F1=1;
  PORTB.F2=1;
  PORTB.F3=1;
  PORTB.F4=1;
  PORTB.F5=1;
  PORTB.F6=1;
  PORTB.F7=1;

  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  beep();
  Delay_ms(75);
  beep();
  beep();
  beep();
  Delay_ms(75);
  beep();
  beep();
  beep();
  
  PORTB.F1=0;
  PORTB.F2=0;
  PORTB.F3=0;
  PORTB.F4=0;
  PORTB.F5=0;
  PORTB.F6=0;
  PORTB.F7=0;
  ff = EEPROM_Read(0x00);
  ff+=1;
  EEPROM_Write(0x00,ff);
  while(1) {
    if(PORTB.F0==1) {
      while(PORTB.F0==1) {
        kiki=kiki+1;
        Delay_ms(10);
      }
      if(kiki>=50) {
        goto dolgozok;
      }
      else {
        kiki=0;
      }
    }
  }
}

Hosszú, nemde?

A hex fájl innen tölthető le.

A program teljesen saját fejlesztés.

A működéséről készített videó.

A kapcsolás:


Ha segítségre van szükséged a NYÁK megtervezésében, a program égetésében fordulj bátran hozzám a hovanhenrik1@gmail.com címen.
A következő cikkemben egy digitális voltmérő áramkört fogok nektek leírni majd megkezdem újabb nagy témámat, ami a makettezők ezen belül is a járműmakettezők számára lesz segítség.

Nincsenek megjegyzések:

Megjegyzés küldése