Forum: Mikrocontroller und Digitale Elektronik SPI für langsame Takte


von Dietmar P. (dietmar2)


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ß

von Jo Kurt (Gast)


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.

von Dietmar P. (dietmar2)


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?

von Wolfgang (Gast)


Lesenswert?

Dietmar P. schrieb:
> Ist das richtig?
Ja.
Falls du Sorgen mit Sauberkeit der Signale hast, kannst du auch 
RS422-Treiber o.ä. dazwischen schalten. Wenn du nicht in völlig 
gestörter Umgebung bist, sollte das aber nicht nötig sein.

von Jo Kurt (Gast)


Lesenswert?

>dass der Takt bei einer Frequenz des Atmega von 1 MHz viel zu hoch wird.

Die Schieberegister arbeiten locker bis 30 MHz. So schnell kann ein 
normaler ATMEGA den SPI gar nicht takten.

von Dietmar P. (dietmar2)


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.

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Du kannst gerne mit 500Hz Takt arbeiten, aber wenn Störungen auf den 
langen Leitungen einstreuen (Leuchtstofflampe einschalten), dann kann 
der schnelle empfindliche Baustein alles möglich machen...

Lange Leitungen sind nichts für SPI oder I2C  !!!!

von Wolfgang (Gast)


Lesenswert?

Bernd Rüter schrieb:
> Lange Leitungen sind nichts für SPI oder I2C  !!!!

Darum SPI über RS422 Treiber. Wenn's ganz ernst wird, kann man damit 
sogar über Lichtleiter gehen. I2C ist da wegen der bidirektionalen 
Datenleitung unhandlicher.

von Dietmar P. (dietmar2)


Angehängte Dateien:

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?

von Peter D. (peda)


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

von Peter D. (peda)


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

von Dietmar P. (dietmar2)


Lesenswert?

@ Peter:

Danke für die Alternative, muss ich mal näher einsteigen.

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

von Peter D. (peda)


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

von Dietmar P. (dietmar2)


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

von Peter D. (peda)


Lesenswert?

Dietmar P. schrieb:
> Damit könnte ich ein Flimmern der LED vermeiden.

Mit der UART flimmert nichts. Jedes Byte bleibt bis zum nächsten 
Telegramm gültig.


Peter

von Dietmar P. (dietmar2)


Lesenswert?

ok, danke.

Dietmar

von Dietmar P. (dietmar2)


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ß

von MCUA (Gast)


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)

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.