Forum: Mikrocontroller und Digitale Elektronik 74hc 299 richtig anscheuern


von Ronni (Gast)


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.

von Peter D. (peda)


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

von Ronni (Gast)


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

von Peter D. (peda)


Lesenswert?

Ronni schrieb:
> mit der 126 ist ne alte Angewohnheit.

Warum, machst Du den Fehler immer wieder?


> ich möchte auch 16 bit einlesen... gibt es da auch einen besseren Chip

74HC165


Peter

von Ronni (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ronni schrieb:
>> mit der 126 ist ne alte Angewohnheit.
>
> Warum, machst Du den Fehler immer wieder?

leider ja...

aber wenn man wieder in der Materie ist legt es sich

von Peter D. (peda)


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

von Ronni (Gast)


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.

von Ronni (Gast)


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;

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.