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
Garnicht, d.h. Du musst die Ports selbst sinnvoll nacheinander ansprechen. Wo ist da das Problem?
@ 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.
>Wo ist da das Problem?
Das Problem ist, er weiß nicht wie man so etwas programmiert.
Also braucht er einen Denkanstoß von einem Spezialisten.
Sonst würder er ja nicht nachfragen.
ja genau so sieht das in der tat aus ;-) also ich kann ja mal versuchen ob ich das hinbekomme, wenn ich die Ports nacheinander schalten lasse mal gucken trotzdem danke
Aber im Grunde ist es sehr einfach. In deinem Programm machst du dir eine 16-Bit Variable, in der du dein Lauflicht realisierst. Wenn es Zeit wird, den Inhalt dieser Variablen tatsächlich auszugeben, splittest du die 16 Bit auf die Ports auf, so wie du es brauchst.
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 ;-)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.