mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 74hc 299 richtig anscheuern


Autor: Ronni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nur ne kurze frage: bin ich soweit richtig?


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

var
   LED    : sbit at PORTC0_bit;   LED_dd : sbit at DDC0_bit;

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

procedure set_Out;
var Low, Hig : Byte;
    i        : Byte;
begin
    Low := Lo(Relai);
    Hig := Hi(Relai);

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

    for I := 0 to 7 do // zweite 8 Relais (links)
     begin
         Out_cl := 0;
         Out_dat:= ( Low > 126);
         Low    := Low * 2;
         Out_Cl := 1;
     end;
     
    for I := 0 to 7 do // erste 8 Relais (Rechts)
     begin             // Low wird weitergeschoben
         Out_cl := 0;
         Out_dat:= ( Hig > 126);
         Low    := Hig * 2;
         Out_Cl := 1;
     end;
     
    is_Out := 0; // OE am chip = true;
end;


begin
  repeat
       set_Out;
  until false;
end.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ronni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ronni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ronni schrieb:
> leider ja...

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

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


Hier mal ein C-Beispiel:
void spi_wr8( uint8_t val )     // write a byte to software SPI
{
  for( uint8_t i = 8; i; i-- ){
    SCK = 0;
    SER = 0;
    if( val & 0x80 )            // MSB first
      SER = 1;
    val <<= 1;
    SCK = 1;
  }
}

void spi_wr16( uint16_t val )   // write to two cascaded 74HC595
{
  RCK = 0;
  spi_wr8( val >> 8 );
  spi_wr8( val );
  RCK = 1;
}


Peter

Autor: Ronni (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ronni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn es noch interessiert... es geht auch viel einfacher
procedure set_Out;
var Output : word;
    i      : Byte;
begin
   Output  := Relai;

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.