shiftregiszter beolvasás
shiftregiszter beolvasás
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);
}
}
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);
}
}
Re: shiftregiszter beolvasás
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
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
Re: shiftregiszter beolvasás
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
- 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
Re: shiftregiszter beolvasás
//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
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
Re: shiftregiszter beolvasás
Feljebb jól megkevertem a fogalmakat! Itt helyesbítek:
//A long 4 Bytes széles, de te ebből csak az alsó 3 Bytet kezeled
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);
Re: shiftregiszter beolvasás
egy kérdés:
miért nem töltöd 3 db 8bites változóba a 3 shiftreg tartalmát?
é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:
(c)csege
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
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();
Re: shiftregiszter beolvasás
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.
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.
Re: shiftregiszter beolvasás
Nagyon köszi a segítséget,