Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Rasenmaehroboter fuer schwierige und grosse Gaerten im Test

 
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

Baustelle.gif 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

Schaltplan

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

#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);
}

LiFePO4 Speicher Test