Anfängerfrage: Wie kann ich Portb und Portd zusammenfassen

OP #1179743
Lesenswert?

hallo, ich möchte wohl gerne 16 leds an meinen atmega32 anschließen. ich 
habe aber nur 8 ausgänge jeweils an portb oder portd wie kann ich die 
beiden ports zusammenfassen, damit ich auch zb. ein lauflicht über alle 
16 leds laufen lassen kann ???
schon mal im voraus danke
mfg
Gast #1179778
Lesenswert?

@ Stefan

>wie kann ich die beiden ports zusammenfassen, damit ich auch zb. ein >lauflicht 
über alle 16 leds laufen lassen kann ???

Deine Aufgabe als Programmierer ist genau die umgekehrte. Wie kannst Du 
die Bestandteile eines bestimmten Mikrocontrollers (hier die beiden 
Ports und noch einige Leds zusätzlich) so zusammensetzen, das sich sich 
ein 16 Led Lauflicht ergibt.

Das ist der Unterschied zwischen den Anforderungen eines "Kunden" und 
denen eines Programmierers. Der Kunde sieht 16 Leds die ein Lauflicht 
ergeben. Ob das nun 15 Controller und ein Heinzelmännchen sind weiss er 
nicht und es geht ihn in der Regel auch nichts an. Du bist derjenige der 
es in Materie giessen soll (und die Heinzelmännchen bei der Stange 
halten muss).

Wie einfach das manchmal ist, zeigt sich in Deiner Frage, die ja schon 
die Antwort enthält. Du hast zwei 8 Bit Ports die Du zusammenfassen 
willst. Sieh sie einmal als ein 16 Bit Port, der aus zwei 8 Bit Ports 
zusammengesetzt sind. Dann ergibt sich der Rest von allein.
Gast #1181125
Lesenswert?

Also wenn's nur darum geht die LEDs nacheinander als Lauflicht 
anzusteuern, braucht's nichtmal eine 16bit Variable, denn der Status 
wird ja durch die Ports selbst realisiert.
Also einfach alle Pins von PortB nacheinander ein/aus schalten und 
danach die von PortD, dazwischen sollte natürlich ein sleep sein, sonst 
sieht man nichts ;-)
Persönliche Seite #1181255
Lesenswert?

Es kommt drauf an, ob die LEDs nacheinander auf die Ports gelegt sind, 
oder kreuzquer (kann manchmal nötig sein, um das Layout einfacher zu 
machen).

Bei einfacher Verdrahtung kommt man zB so zum Lauflicht:
1
#include <avr/io.h>
2

3
void next_led (void)
4
{
5
    static uint16_t leds;
6

7
    // LEDs eins weiter schieben
8
    leds <<= 1;
9

10
    // Alle LEDs sind durch: neu anfangen
11
    if (leds == 0)
12
        leds = 1;
13

14
    // Ausgeben
15
    if (leds & 0xff)
16
        PORTB = leds;
17
    else
18
        PORTD = leds >> 8;
19
}

Johann

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