sunnuntai 22. tammikuuta 2017

KEHITYSTÄ II

Tässä sovelluksessa käytän kahta CMOS-piiriä (74HCT-165N), joissa kummassakin on kahdeksan (8) tuloa rinnan. Siis yhteensä 16 tuloa. Piirit on kytketty sarjaan siten, että toisen piirin sarjalähtö on kytketty toisen sarjatuloon. Piirien ulkoiset liitynnät luetaan bitti kerrallaan peräkkäin. Piireissä on kolme (3) liityntää Arduinon digitalipinneihin. 
     Ensimäinen on PL, minkä laskeva reuna aktivoi rinnakkaisrekistereissä olevan tiedon siirtymisen sarjarekisteriin. Tämä liityntä on kytketty rinnan molempien IC-piirien välillä. Toinen liityntä on CP, kellotus, minkä nouseva reuna siirtää bitti kerrallaan sarjarekisterin dataa lähtöön Q7. Kellotuskin on kytketty rinnan molempien IC-piirien välillä. Kolmas liityntä on data (1. piirin Q7 → 2. piirin Ds → Arduino IN). Toisin sanoen ensimmäisen piirin (alimmat bitit 0 .. 7) sarjalähtö (Q7) kytketään toisen piirin (ylimmät bitit 8 .. 15) sarjatuloon (Ds) ja toisen piirin sarjalähtö (Q7) Arduinon tuloon.
Piirin 74HCT-165N sisäinen rakenne.

On pidettävä tässä yhteydessä mielessä, että eniten merkitsevä (bitti 15) luetaan ensimmäiseksi ja vähiten merkitsevä (bitti 0) viimeisenä. Luentalauseet olen koonnut aliohjelmaksi, minkä löytämiskoodi on: SarjaIN_Ali_v1.No4Tam17. Aliohjelmassa määritellään myös tulot/lähdöt, joten pääohjelmasta kutsuttaessa parametreinä on ainoastaan liityntäpinnien numerot. Yhteistä pääohjelmalle ja tälle aliohjelmalle on 16 bitin taulukko (boolean Arr_DATA[16];), mihin aliohjelma kirjoittaa tulojen tilatiedot ohjelman jatkotoimenpitetä varten.


LCD-näyttöön tulevat tekstit olen valinnut siten, että sekä pienet että isot ääkköset tulevat mukaan. Siltä osin, kun tuo (void Fun_LCD(int start, int rivi, int paikka, int data){) näytön koodi on muuttunut, on tässä esityksessä mukana muuttuneet akeleet. Olen myös jättänyt mukaan tulostuksen aliohjelman, sillä sen avulla on havainnollisempaa tarkastella bittejä tietokoneen ja Arduinon työkaluohjelman avulla. Toiminnallisesti sillä ei ole merkitystä.
     Kuvassa mikropiirejä reunustavat ”mustat liuskat” ovat 8*10kohm vastus-hybridipiirejä. Vastuksilla on yksi (1) yhteinen maa. Tässä jokaiselle vastukselle ei ole käyttöä, koska tuloja on 16 kappaletta. Yläosassa näkyväll ”piuhalla” voi tökkiä eri tuloja. 
Kuvassa olin tökkäissyt pinniä no. 12.

OHJELMA 35
/**************************************
* Ohjelma 35
* 21.01.2017
* Rinnan sisään, sarjassa ulos
* 16 digitaalitulon toteutus
* kahdella 74HCT-165N CMOS-piirillä
**************************************/

// MÄÄRITTELYT:
// Kirjastomoduulit
   #include <LiquidCrystal.h>
   LiquidCrystal lcd(3, 2, 7,6,5,4);

// Bittitaulukko ja järjestysnumero
   boolean Arr_DATA[16];
   int Int_Numero = 0;

// Tulostuksen tahdistus
   const int Con_PrintViive = 1000;
   int Int_PrintViive = Con_PrintViive;

// ALIOHJELMAT
void Fun_Tulostus(){
//Serial.print("Teksti :"); Serial.println(Muuttuja);
for(int i; i < 16; i++){
Serial.print(Arr_DATA[i]);
}
Serial.println();
Serial.print("Tokkasit :"); Serial.println(Int_Numero);
} // Tulostus loppu

// Funktio Parallel IN serial OUT (Rinnan sisään, sarjassa ulos)
// SarjaIN_Ali_v1.No4Tam17
/****************************************************
void Fun_LueRsSu(int PL, int CP, int Data){
   pinMode(PL, OUTPUT); // pinnin numero kutsussa
   pinMode(CP, OUTPUT); // pinnin numero kutsussa
   pinMode(Data, INPUT);// pinnin numero kutsussa
// Rinnakkaisdatan siirto
   digitalWrite(PL, LOW);
   digitalWrite(PL, HIGH);
   for(int i = 0; i < 16; i ++){Arr_DATA[i] = 0;}// tyjennys
   for(int j = 0; j < 16; j++){ // luku
      Arr_DATA[j] = digitalRead(Data);
      digitalWrite(CP, HIGH);
      digitalWrite(CP, LOW);
   }// sarjaluennan loppu
   }// Funtion loppu

// LCD_AliOhjelma_v1 LCD_Ali_v1.No3Tam17
/****************************************************
case 1:
lcd.setCursor(paikka, rivi);
lcd.print("T");
i = 1; lcd.write(i); // Ö - kirjain
lcd.print("KK");
i = 0; lcd.write(i); // Ä - kirjain
i = 0; lcd.write(i); // Ä - kirjain
lcd.print(" ");
lcd.print("PINNI");
i = 0; lcd.write(i); // Ä - kirjain
 
case 2:
lcd.setCursor(paikka, rivi);
lcd.print("t");
lcd.write(opi); // ö - kirjain
lcd.print("kk");
lcd.write(api); // ä - kirjain
lcd.print("sit:");
 
case 11:
lcd.setCursor(paikka, rivi);
lcd.print("    ");
lcd.setCursor(paikka, rivi);
lcd.print(data);*/

// ASETUKSET:
void setup(){
   Serial.begin(9600);
   lcd.begin(20,2);
   lcd.clear();
   lcd.setCursor(0, 0);
   Fun_LCD(1,0,3,0); // Ylärivin kiinteä teksti
   Fun_LCD(2,1,0,0); // Alarivin kiinteä teksti
}// Asetuksen loppu

// PÄÄLOOPPI
void loop(){
   Fun_LueRsSu(8, 9, 10);
   for(int No = 0; No < 16; No++){
      if(Arr_DATA[15-No] == 1){
         Int_Numero = No + 1;
     }// if loppu
   }// for loppu

   Fun_LCD(11,1,10,Int_Numero);

   Int_PrintViive--;
   if(Int_PrintViive == 0){
      Fun_Tulostus();
      Int_PrintViive = Con_PrintViive;
   } // Tulostuskutsu loppu
delay(1);
} // Pääohjelma LOPPU

Ei kommentteja:

Lähetä kommentti