SPI für langsame Takte

OP #2567550
Lesenswert?

Hallo,

für eine Schaltung Abfrage von Leitungszuständen und Anzeige über LED's 
suchen ich Bauteile für langsame Takte.

Die Leitungen sind wenn geschlossen auf low oder wenn offen über einen 
pullup-Widerstand auf high. Die Anzeige soll direkt über LED's 
("Spar"-LED mit 2 mA) permanent erfolgen. Zustand der LED: Leitung offen 
LED leuchtet, Leitung geschlossen LED aus.
Zwischen dem Ende der Leitungen und der LED-Anzeige besteht eine 
räumliche Entfernung von ca. 1,5 m, überbrückt mit einer Telefonleitung 
(4-paarig).

Habe mich bereits intensiv mit den Bauteilen für SPI 74HC165 und 74HC595 
beschäftigt. Diese sind nicht geeignet für größere Entfernungen und 
eingentlich nur für die gleiche Platine gedacht. Ferner ist der Takt für 
meine Anwendung zu hoch.

Gibt es Bauteile die so etwas auch können und mit der Entfernung, sowie 
mit einem Takt von 500 Hz bis 2 kHz arbeiten können?

Danke für Eure Hilfe!

Gruß
Gast #2567567
Lesenswert?

>Ferner ist der Takt für meine Anwendung zu hoch.

Welcher Takt? Sowohl 74HC165 und 74HC595 arbeiten mit Taktfrequenz ab 
DC, das dürfte doch wohl langsam genug sein? Die von dir genannten 
Bauteile haben keinen eigenen Takt, den musst du schon selber mit 
geeigneter Schaltung erzeugen.

Im übrigen sind das keine SPI-Bauteile, das sind nackte Schieberegister. 
Wenn du eine Datenübertragung parallel-seriell-parallel machen willst, 
brauchst du schon ein paar Bauteile zusätzlich.


Die 1,5m sollten mit geschirmter Leitung kein Problem sein.
OP #2567592
Lesenswert?

Da war ich etwas unvollständig!

Ja sicher brauche ich eine Steuerung, die übernimmt ein Atmega32. Dieser 
hat ja die entsprechenden Anschlüsse auf Port B (SCK, MOSI, MISO, SS).

Nur habe ich nach Durchsicht der Datenblätter Atmega und 74HC165 / 
74HC595 angenommen, dass der Takt bei einer Frequenz des Atmega von 1 
MHz viel zu hoch wird.

Wenn die 74HC165 und 74HC595 auch mit einer niedrigen Takt gesteuert 
werden können, so könnte ich ja die entsprechenden Impulse im Atmega per 
C-Programm selber erzeugen.
Ist das richtig?
OP #2567627
Lesenswert?

Danke Euch für die Infos.

@ Wolfgang:

Mir genügt ein Takte mit ca. 500 Hz.
Nachdem es da mit den den 74HCxx scheinbar keine Probleme gibt, werde 
ich es mit den selbst gesteuerten Signalen probieren.
Den RS422 werde ich wohl besser gleich einbauen.

@ Jo Kurt:

Habe aber gelesen, dass bei diesen hohen Frequenzen und einer längeren 
Leitung es zu Störungen im ASgnalverlauf kommen kann, weil die Leitung 
die Eingang-Impedanzehn der Bautele verändert.
OP #2568204
Lesenswert?

Nochmals Danke für die weiterhgehenden Informationen.

@Wolfgang:

Wegen der Einstreuung von Störungen will ich ja mit dem Takt runter.
Bei meiner jetzigen Lösung mit Mux/Demux-Bausteinen (Dateianhang) habe 
ich das Problem bei einem Takt von 2 kHz. Eine Auswertung der 
Leitungsinformationen im Atmega bringt kein sauberes Ergebnis. Ein 
weiterer Nachteil ist die aufwändige Steuerung der LED mit dem 
Halte-Elko. Deshalb kam ich auf die 74HCxx-Bauteile.

Ich würde jeweils einen RS422 (AM26LS31CN - Reichelt) auf die "Sender-" 
und "Empfänger"-Platine setzen und die Signale (SCK, MOSI, MISO, SS im 
µC per C-Prog.) über die Treiber versuchen möglichst störsicher zu 
machen.

So ok?
Angehängte Dateien:
#2568230
Lesenswert?

Warum so kompliziert?

Nimm doch auf beiden Seiten einen MC.
Dann brauchst Du nur einen IC und eine Leitung.

Z.B. der ATmega162 hat 35 IOs.
An den einen hängst Du bis zu 34 Taster ran und überträgst per UART 
(5Byte).
Der andere empfängt und schaltet bis zu 34 LEDs an.
Dazu nur noch ein bischen Software (<100 Byte), fertig.


Peter
#2568401
Lesenswert?

Hier mal ein Beispiel für den Sender:
1
                        // Target: ATmega162
2
#include <avr/io.h>
3

4

5
#define F_CPU           1e6             // 1MHz
6
#define BAUD            1200
7
#define BAUDDIVIDER     (uint16_t)(F_CPU / BAUD / 16 - 0.5)
8

9

10
void uputchar( uint8_t c )
11
{
12
  UCSR0A = UCSR0A;                      // clear interrupt flag
13
  UDR0 = c;
14
  while( (UCSR0A & 1<<TXC0) == 0 );
15
}
16

17

18
int main()
19
{
20
  UBRR0H = BAUDDIVIDER >> 8;
21
  UBRR0L = BAUDDIVIDER;                         // set baud rate
22
  UCSR0B = 1<<TXEN0 | 1<<UCSZ02;                // Tx only, 9bit
23
  UCSR0C = 1<<URSEL0 | 1<<UCSZ01 | 1<<UCSZ00;   // 9bit
24

25
  for(;;){
26
    UCSR0B |= 1<<TXB80;                 // 1 = first byte
27
    uputchar( PINA );
28
    UCSR0B &= ~(1<<TXB80);              // 0 = next bytes
29
    uputchar( PINB );
30
    uputchar( PINC );
31
    uputchar( PIND );
32
    uputchar( PINE );
33
  }
34
}

Das Protokoll ist ganz einfach, das erste Byte wird durch 9.Bit = 1 
gekennzeichnet.
Ohne Startup-Code ist das Programm 54 Byte groß.


Peter
#2569030
Lesenswert?

Dietmar P. schrieb:
> Meinen Atmega32 kann ich ja trotzdem für die Auswertung der Leitungen
> hinsichtlich eines Alarms und für die Steuerung der LCD-Anzeige
> verwenden.

Ist durch die UART ja auch ganz einfach.
Bei Verwendung der UART sollten beide MC einen Quarz benutzen.

Wenn Du die 32 LEDs als 4*8 Matrix im Timerinterrupt multiplext, kann er 
auch die LEDs mit ansteuern.


Peter
OP #2569117
Lesenswert?

Hi Peter

Der Standardstatus ist Leitung geschlossen, LED = aus.

Mein Gedanke ist, dass ich die Ausgänge am Atmega16 ("Empfänger"), z.B. 
PB0-7 usw. auf low setze (LED aus), wenn die Leitung geschlossen ist und 
wenn die Leitung offen ist dann den Ausgang auf high LED = an setzte.
Damit könnte ich ein Flimmern der LED vermeiden.

Wäre das auch ein Weg?

Gruß
Dietmar
OP #2610022
Lesenswert?

@ Wolfgang:

Nach einigen Tests habe ich letztlich die Schaltung doch mit 74HC165 und 
74HC595 realisiert (@Peter: Passte so am Besten in die bereits 
vorhandene Umgebung).

Da der Treiber RS422 relativ viel Strom zieht habe ich 74HC00 verwendet. 
Am Ende der Übertragungsleitung in beide Richtungen (CLK und Parallel 
shift bzw. MISO) wird das Signal damit doppelt invertiert und ist recht 
sauber und stabil.

Gruß
Gast #2610501
Lesenswert?

>Wegen der Einstreuung von Störungen will ich ja mit dem Takt runter.
Bringt nichts.
Massgebend ist die max Geschwindigkeit der Bausteine (ca 30MHz), nicht 
die von deinem vorgegebenem Takt. Da musst Du Filter dran setzen, damit 
schnelle Störflanken "nicht rein kommen", oder, wie geschrieben 
Diff-Sign-ICs benutzen (oder steinzeitiche uralte ICs benutzen, die 
extrem langsam sind)

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