74hc 299 richtig anscheuern

Gast #1575589
Lesenswert?

nur ne kurze frage: bin ich soweit richtig?


ob das 1 bit nun IO-0 oder IO-7 ist, ist mir egal
1
program Expander;
2

3
var
4
   LED    : sbit at PORTC0_bit;   LED_dd : sbit at DDC0_bit;
5

6
   // Schreiberegister für die Relais      // S0 = L; S1 = H; -Cler = H
7
   is_Out : sbit at PORTC1_bit;   is_Out_dd : sbit at DDC1_bit; // Beide -OE bei beiden
8
   Out_dat: sbit at PORTC2_bit;   Out_dat_dd: sbit at DDC2_bit; // SR (Chip2.sr = Chip1.q7)
9
   Out_Cl : sbit at PORTC3_bit;   Out_cl_dd : sbit at DDC3_bit; // Clock
10
   
11
   Relai  : word;
12

13
procedure set_Out;
14
var Low, Hig : Byte;
15
    i        : Byte;
16
begin
17
    Low := Lo(Relai);
18
    Hig := Hi(Relai);
19

20
    is_Out := 1; // OE am chip = false
21

22
    for I := 0 to 7 do // zweite 8 Relais (links)
23
     begin
24
         Out_cl := 0;
25
         Out_dat:= ( Low > 126);
26
         Low    := Low * 2;
27
         Out_Cl := 1;
28
     end;
29
     
30
    for I := 0 to 7 do // erste 8 Relais (Rechts)
31
     begin             // Low wird weitergeschoben
32
         Out_cl := 0;
33
         Out_dat:= ( Hig > 126);
34
         Low    := Hig * 2;
35
         Out_Cl := 1;
36
     end;
37
     
38
    is_Out := 0; // OE am chip = true;
39
end;
40

41

42
begin
43
  repeat
44
       set_Out;
45
  until false;
46
end.
#1575616
Lesenswert?

Warum nimmst Du nicht, wie alle Leute den 74HC595?

Die Relais werden wohl nicht gleich abfallen, aber sie werden Geräusche 
machen beim Schieben.

Ich würde erstmal ne Routine für ein Byte schreiben und die zweimal 
aufrufen.
Ich mag kein Copy&Paste (Dir ist dabei schon ein Fehler passiert), 
sondern Schleifen.

Die 126 mußt Du mir mal erklären.
Kann Deine Programmiersprache keine Hex- oder bin-Darstellung?


Peter
Gast #1575636
Lesenswert?

mit der 126 ist ne alte Angewohnheit.

der 74HC595 ist natürlich eine bessere Lösung... deswegen frag ich ja 
erst.

die änderungen wären dann nur:

SCK = Clock
Serin = SR
Serout= zum 2'ten
-G = immer auf lo

mit RCK läd man alles in Output


ich möchte auch 16 bit einlesen... gibt es da auch einen besseren Chip
#1575663
Lesenswert?

Ronni schrieb:
> leider ja...

Deshalb schreiben C-Programmierer:
1
  bit_var = !!(byte_var & (1<<7));
oder:
1
  bit_var = !!(byte_var & 0x80);

Dezimalschreibweise sollte man nur für numerische Werte nehmen, nicht 
für Bitmasken.


Hier mal ein C-Beispiel:
1
void spi_wr8( uint8_t val )     // write a byte to software SPI
2
{
3
  for( uint8_t i = 8; i; i-- ){
4
    SCK = 0;
5
    SER = 0;
6
    if( val & 0x80 )            // MSB first
7
      SER = 1;
8
    val <<= 1;
9
    SCK = 1;
10
  }
11
}
12

13
void spi_wr16( uint16_t val )   // write to two cascaded 74HC595
14
{
15
  RCK = 0;
16
  spi_wr8( val >> 8 );
17
  spi_wr8( val );
18
  RCK = 1;
19
}


Peter
Gast #1575723
Lesenswert?

naja ich hab so meine Probleme mit C++...

es gibt auch hier eine Funktion um Bits zu testen aber die ist mir 
gerade nicht eingefallen.

das werde ich schon hin bekommen. ist ja einfacher als mir den 299.
Gast #1576078
Lesenswert?

wenn es noch interessiert... es geht auch viel einfacher
1
procedure set_Out;
2
var Output : word;
3
    i      : Byte;
4
begin
5
   Output  := Relai;
6

7
   for I := 0 to 15 do
8
       begin
9
            Out_Cl  := 0;
10
            Out_dat := (Output and 0x01);
11
            Output  := Output div 2;
12
            Out_cl  := 1; // FIRST STAGE OF S.R. BECOMES Out_dat OTHER STAGES STORE THE DATA OF PREVIOUS STAGE, RESPECTIVELY
13
       end;
14
   Out_RCK  := 1; nop; nop; nop;
15
   Out_RCK  := 0; // S.R. DATA IS STORED INTO STORAGE REGISTER
16
end;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren