Zeile 12: | Zeile 12: | ||
;Nachteile | ;Nachteile | ||
* bei dieser Version nur Ausgabe möglich | * bei dieser Version nur Ausgabe möglich | ||
+ | |||
+ | =Schaltplan= | ||
[[Bild:Portexpander_74595_an_AVR.png]] | [[Bild:Portexpander_74595_an_AVR.png]] | ||
+ | |||
+ | =C-Code= | ||
+ | Der folgende C-Code ist Pseudocode, was setzen der Ports angeht. Die entsprechenden Befehle sind durch die richtigen C-Befehle für diese Ports zu ersetzen. | ||
+ | ;MAKE_OUT (X): Schaltet X als Ausgang (DDR-Register) | ||
+ | ;SET (X): Setzt Ausgang X auf HIGH (PORT-Register) | ||
+ | ;CLR (X): Setzt Ausgang X auf LOW (PORT-Register) | ||
+ | |||
+ | == Mit SPI-Hardware == | ||
+ | == Ohne SPI-Hardware == | ||
+ | |||
+ | '''serpa.h''' | ||
+ | <pre> | ||
+ | #ifndef _SERPA_H_ | ||
+ | #define _SERPA_H_ | ||
+ | |||
+ | /* 4 Bytes (32 Ports) */ | ||
+ | #define SERPA_SIZE 4 | ||
+ | |||
+ | extern unsigned char serpa[]; | ||
+ | extern void serpa_out(); | ||
+ | extern void serpa_init(); | ||
+ | |||
+ | #endif /* _SERPA_H_ */ | ||
+ | </pre> | ||
+ | |||
+ | '''serpa.c''' | ||
+ | <pre> | ||
+ | /* SERiell nach PArallel (serpa) via Software */ | ||
+ | #include "serpa.h" | ||
+ | |||
+ | // Array für die Daten | ||
+ | unsigned char serpa[SERPA_SIZE]; | ||
+ | |||
+ | void serpa_init () | ||
+ | { | ||
+ | // Verwendete Ports auf OUT | ||
+ | MAKE_OUT (PORT_SER); | ||
+ | MAKE_OUT (PORT_SCK); | ||
+ | MAKE_OUT (PORT_RCK); | ||
+ | |||
+ | // SCR und RCK auf definierten Level HIGH | ||
+ | SET (PORT_SCK); | ||
+ | SET (PORT_RCK); | ||
+ | } | ||
+ | |||
+ | void serpa_out () | ||
+ | { | ||
+ | unsigned char anz = SERPA_SIZE; | ||
+ | unsigned char* serp = serpa+SERPA_SIZE; | ||
+ | |||
+ | do | ||
+ | { | ||
+ | unsigned char bits; | ||
+ | unsigned char data = *--serp; | ||
+ | |||
+ | // 8 Bits pro Byte rausschieben | ||
+ | for (bits = 8; bits > 0; bits--) | ||
+ | { | ||
+ | CLR (PORT_SER); | ||
+ | if (data & 0x80) | ||
+ | { | ||
+ | SET (PORT_SER); | ||
+ | } | ||
+ | |||
+ | data <<= 1; | ||
+ | // Strobe an SCK schiebt Daten im Gänsemarsch | ||
+ | // um 1 Position weiter durch alle Schieberegister | ||
+ | CLR (PORT_SCK); | ||
+ | SET (PORT_SCK); | ||
+ | } | ||
+ | } | ||
+ | while (--anz > 0); | ||
+ | |||
+ | // Strobe an RCK bringt die Daten von den Schieberegistern in die Latches | ||
+ | CLR (PORT_RCK); | ||
+ | SET (PORT_RCK); | ||
+ | } | ||
+ | </pre> | ||
[[Kategorie:Praxis]] | [[Kategorie:Praxis]] | ||
[[Kategorie:Quellcode C]] | [[Kategorie:Quellcode C]] |
Version vom 9. Januar 2006, 19:47 Uhr
An diesem Artikel arbeitet gerade Mitglied SprinterSB.
Am besten momentan noch keine gravierenden Ergänzungen / Änderungen vornehmen. Dieser Hinweis verschwindet wenn der Autor soweit ist. Sollte dieser Hinweis länger als drei Tage auf einer Seite sein, bitte beim Autor SprinterSB per PM / Mail oder Forum nachfragen ob er vergessen wurde. |
- Vorteile
- schnell
- preiswert
- einfach anzusteuern (auch ohne Hardware-Unterstützung)
- modular aufgebaut und erweiterbar
- alle Ports können gleichzeitig geschaltet werden, auch 100 Stück
- SPI-Interface und ISP-Pins können verwendet werden
- Bus hat nur 3 Leitungen, dadurch kein kompliziertes Layout mit vielen Leitungen
- Nachteile
- bei dieser Version nur Ausgabe möglich
Inhaltsverzeichnis
Schaltplan
C-Code
Der folgende C-Code ist Pseudocode, was setzen der Ports angeht. Die entsprechenden Befehle sind durch die richtigen C-Befehle für diese Ports zu ersetzen.
- MAKE_OUT (X)
- Schaltet X als Ausgang (DDR-Register)
- SET (X)
- Setzt Ausgang X auf HIGH (PORT-Register)
- CLR (X)
- Setzt Ausgang X auf LOW (PORT-Register)
Mit SPI-Hardware
Ohne SPI-Hardware
serpa.h
#ifndef _SERPA_H_ #define _SERPA_H_ /* 4 Bytes (32 Ports) */ #define SERPA_SIZE 4 extern unsigned char serpa[]; extern void serpa_out(); extern void serpa_init(); #endif /* _SERPA_H_ */
serpa.c
/* SERiell nach PArallel (serpa) via Software */ #include "serpa.h" // Array für die Daten unsigned char serpa[SERPA_SIZE]; void serpa_init () { // Verwendete Ports auf OUT MAKE_OUT (PORT_SER); MAKE_OUT (PORT_SCK); MAKE_OUT (PORT_RCK); // SCR und RCK auf definierten Level HIGH SET (PORT_SCK); SET (PORT_RCK); } void serpa_out () { unsigned char anz = SERPA_SIZE; unsigned char* serp = serpa+SERPA_SIZE; do { unsigned char bits; unsigned char data = *--serp; // 8 Bits pro Byte rausschieben for (bits = 8; bits > 0; bits--) { CLR (PORT_SER); if (data & 0x80) { SET (PORT_SER); } data <<= 1; // Strobe an SCK schiebt Daten im Gänsemarsch // um 1 Position weiter durch alle Schieberegister CLR (PORT_SCK); SET (PORT_SCK); } } while (--anz > 0); // Strobe an RCK bringt die Daten von den Schieberegistern in die Latches CLR (PORT_RCK); SET (PORT_RCK); }