Hallo zusammen,
die Schaltung im Anhang zeigt zwei 74HC595 in Reihe geschaltet, der Code
unten steuert die beiden an.
Das erste Schieberegister verhält sich wie erwartet, beim zweiten sind
alle bits um eins nach "hinten" verschoben, d. h. QB hat das bit,
welches in QA sein sollte.
"SER" im Schaltbild: DataPin, DataPort im Code
"SCK" im Schaltbild: ClockPin, ClockPort im Code
"RCK" im Schaltbild: LatchPin, LatchPort im Code
Einen einfachen Hardwarefehler á la Übersprechen oder Vertauschung halte
ich für unwahrscheinlich, der obere Baustein läuft wie geschrieben
perfekt und eine geringere Geschwindigkeit verändert nichts.
Findet jemand von euch den Fehler?
Vielen Dank
Bernhard
DL1BG
1 | bool CTuner::WriteBitMasktoDevice(void)
|
2 | {
|
3 | uint32_t loc_ui32_BitCount;
|
4 | uint32_t loc_ui32_BitStream = prv_ui32_NominalBitMask;
|
5 |
|
6 | diag_printf("write tuner %lX\n", prv_ui32_NominalBitMask);
|
7 |
|
8 | for(loc_ui32_BitCount = 0; loc_ui32_BitCount < 16; loc_ui32_BitCount++)
|
9 | {
|
10 | WriteBitToDevice(loc_ui32_BitStream & 0x8000);
|
11 | loc_ui32_BitStream <<= 1;
|
12 | }
|
13 |
|
14 | PulseLatch();
|
15 |
|
16 | GPIO_ResetBits(prv_pui32_DataPort, prv_ui32_DataPin);
|
17 |
|
18 | return true;
|
19 | }
|
20 |
|
21 | void CTuner::WriteBitToDevice(bool par_ui01_Bit)
|
22 | {
|
23 | if(true == par_ui01_Bit)
|
24 | {
|
25 | GPIO_SetBits(prv_pui32_DataPort, prv_ui32_DataPin);
|
26 | }
|
27 | else
|
28 | {
|
29 | GPIO_ResetBits(prv_pui32_DataPort, prv_ui32_DataPin);
|
30 | }
|
31 | HAL_DELAY_US(5);
|
32 | GPIO_SetBits(prv_pui32_ClockPort, prv_ui32_ClockPin);
|
33 | HAL_DELAY_US(5);
|
34 | GPIO_ResetBits(prv_pui32_ClockPort, prv_ui32_ClockPin);
|
35 | }
|
36 |
|
37 | void CTuner::PulseLatch(void)
|
38 | {
|
39 | GPIO_SetBits(prv_pui32_LatchPort, prv_ui32_LatchPin);
|
40 | HAL_DELAY_US(5);
|
41 | GPIO_ResetBits(prv_pui32_LatchPort, prv_ui32_LatchPin);
|
42 | }
|