shiftregiszter beolvasás

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
AMIki9
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2014. augusztus 12. kedd, 14:25

shiftregiszter beolvasás

Hozzászólás Szerző: AMIki9 »

Segítséget szeretnék kérni.
A feladatban be kell olvasni egy 3 db HCT165-ből álló láncon keresztül adatot (3 x 8bit), majd a tartalmát 3 byte-ként kinyomtatni a soros monitoron keresztül.
ehhez a következőt állítottam össze: de nem működik. Tudna valaki segíteni?
#define latchPinIn (2) //pin 13 on arduino goes to pin 1 of 74HC165
#define clockPinIn (3) //pin 12 on arduino goes to pin 2 of 74HC165
#define dataPinIn (4) //pin 11 on arduino goes to pin 9 of 74HC165
byte switchVar1 = 0; //input shift register 1 vaganyut kivalasztas
byte switchVar2 = 0; //input shift register 2 foglaltsag
byte switchVar3 = 0; //input shift register 3 valtoallas visszajelzes
void setup()
{
Serial.begin(9600); //PC kiolvasashoz

pinMode(latchPinIn, OUTPUT); //beallitas kimenet
pinMode(clockPinIn, OUTPUT); //beallitas kimenet
pinMode(dataPinIn, INPUT); //beallitas bemenet
digitalWrite(latchPinIn, HIGH);
digitalWrite(latchPinIn, LOW);
long switchVar;
int j;
{
//load logic bits from the DIP switches
digitalWrite(latchPinIn, LOW); //LOAD BITS
//reset "load" line, this freezes the internal buffer on both chips
digitalWrite(latchPinIn, HIGH);

for(j = 0 ; j < 24 ; j++)
{
switchVar = digitalRead(dataPinIn);

//read next "switch"
digitalWrite(clockPinIn, HIGH);
digitalWrite(clockPinIn, LOW);

//print switch's value
Serial.print(switchVar);
}
int switchVar1 = switchVar >> 8;
Serial.print(switchVar1);
}
}
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: shiftregiszter beolvasás

Hozzászólás Szerző: Robert »

Tipp:
a kapott adatot beolvasva (switchvar ez nálad):
- első byte: switchvar1=0
- második byte:
temp1long=switchvar and 00000000.11111111.00000000.0000000
temp1long = shiftelése jobbra 16-ot (vagy osztva 2^16)
switchvar2=temp1long
- harmadik byte:
temp1long=switchvar and 00000000.00000000.11111111.0000000
temp1long = shiftelése jobbra 8-at (vagy osztva 2^8)
switchvar3=temp1long
- negyedik byte:
temp1long=switchvar and 00000000.0000000.00000000.11111111
switchvar4=temp1long
AMIki9
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2014. augusztus 12. kedd, 14:25

Re: shiftregiszter beolvasás

Hozzászólás Szerző: AMIki9 »

Szia és köszi az ötletet, de tudásom hiányosságai miatt kérdezem, hogy:
- a feladatban a switchVar változó 24bit azaz 3 byte hosszú.
- az általad javasoltban viszont 4 byte szerepel? nem hiba ez?
- nem lehet már a beolvasás alatt az egyes byte-kból származó adatokat külön-külön a switchVar1...3-ban eltárolni?

Köszi :roll:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: shiftregiszter beolvasás

Hozzászólás Szerző: kapu48 »

//A beolvasás bitenként történik!

for(j = 0 ; j < 24 ; j++)
{
switchVar += digitalRead(dataPinIn); // hozzáadod az 1 beolvasott Bitet
switchVar <<= 1; // 1-el balra shiteled, a végére jöhet a következő Bite
//read next "switch"
digitalWrite(clockPinIn, HIGH);
digitalWrite(clockPinIn, LOW);

}
//print switch's value
Serial.print(switchVar);

//A long 4 Bites széles, de te ebből csak az alsó 3 Bites kezeled
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: shiftregiszter beolvasás

Hozzászólás Szerző: kapu48 »

Feljebb jól megkevertem a fogalmakat! Itt helyesbítek:

Kód: Egész kijelölése

//A beolvasás bitenként történik!
...
for(j = 0 ; j < 24 ; j++)
{

      switchVar += digitalRead(dataPinIn); // hozzáadod az 1 beolvasott Bitet

     //read next "switch"
     digitalWrite(clockPinIn, HIGH);
     digitalWrite(clockPinIn, LOW);
     switchVar <<= 1; // 1-el balra shiteled, a végére jöhet a következő Bit
}
switchVar >>= 1; // 1-el vissza jobbra
//print switch's value
Serial.print(switchVar);		// long
char switchVar1 = switchVar;	// Byte
Serial.print(switchVar1);
char switchVar2 =( switchVar >> 8);
Serial.print(switchVar2);
char switchVar3 = (switchVar >> 8);
Serial.print(switchVar3);

//A long 4 Bytes széles, de te ebből csak az alsó 3 Bytet kezeled
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: shiftregiszter beolvasás

Hozzászólás Szerző: csegebiga »

egy kérdés:
miért nem töltöd 3 db 8bites változóba a 3 shiftreg tartalmát?

Kód: Egész kijelölése

ciklus 1 
 beforgat 8 bitet az első byte változóba
ciklus1 vége
ciklus 2
 beforgat 8 bitet a második byte változóba
ciklus2 vége
ciklus 3
 beforgat 8 bitet a harmadik byte változóba
ciklus3 vége
és kész.
nem kell darabolni. kimaszkolni, helyiértékére tenni.
ha akarod, megírod függvénybe, és akkor még elegánsabban néz ki:

Kód: Egész kijelölése

forgató (byte){
  ciklus  
    beforgat 8 bitet a byte változóba
 ciklus vége
 visszaadja byte változót
}

elsoByte=forgato();
masodikByte=forgato();
harmadikByte=forgato();
(c)csege
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: shiftregiszter beolvasás

Hozzászólás Szerző: kapu48 »

Ezek 3db 8 bites shiftregiszterek sorba kötve, közösítve van a párhuzamos beolvasás lábuk 1 vezérlő jelkimenetre.

Tehát belép a beolvasó rutinba:
Pin CE >>L
Pin PE >>H, beíródik a 24 bemenet a 3 shift regiszterbe.
Pin PE >>L, engedélyezi a soros léptetés.
Pin CK-ra órajel közben sorban jön a 24 Bits.
Pin CE >>H

Most ha ezt szétbontod 3 felé, akkor 3 vezérlő pin helyet 9db kellene.

Nem olyan nehéz azt a Longot szétkapni 3 Bytre!
És nem is kel maszekolgatni csak a végéről mindig lecsípsz 1 Bytet.
AMIki9
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2014. augusztus 12. kedd, 14:25

Re: shiftregiszter beolvasás

Hozzászólás Szerző: AMIki9 »

Nagyon köszi a segítséget, :)
Válasz küldése