Forum: Compiler & IDEs Register erstellen mit vorhandenen Pins


von Patrick B. (p51d)


Lesenswert?

Hallo miteinander

Ich habe mitlerweile schon mehrmals das Problem gehabt, dass ich an 
einem "zusammengesetzten" Ausgang gerne normal einen Wert übergeben 
wollte.
Zum Beispiel PORTXYY=0x441 bei einem 12 Bit Port.
Kennt ihr eine möglichkeit so etwas über Defines zu lösen??
Bei einem ATMega644P habe ich zum Beispiel so etwas versucht:
1
#define PORTXYY ((PC0<<11)|(PC1<<9)|(PC2<<7)|(PC3<<5)|PORTA)
PORTCC0 ist hier MSB und PORTA0 LSB

Leider Funktioniert das nicht, denn wenn ich einen 12Bit Wert an PORTXYY 
anlege, kommt beim kompilieren immer Fehler: Wert ist zu gross...

Ich hoffe, ihr könnt da mir ein wenig auf die Sprünge helfen.

MFG
Berger

von Gast (Gast)


Lesenswert?

Hallo,
> Zum Beispiel PORTXYY=0x441 bei einem 12 Bit Port.
woher die Annahme das ein 664 digitale 12 Bit Ports hat?

MfG

von Patrick B. (p51d)


Lesenswert?

Annahme? Das habe ich nie gesagt.
Vielleicht habe ich mich nicht klar genug ausgedrückt:
Ich möchte einem Define einen Wert (0...32Bit) übergeben, der dan die 
Ausgänge schaltet.

Wenn man zum Beispiel 8 Leds hat, die aber nicht an einem komplettem 
Port angeschlossen sind, sondern aus PORTA0, PORTA3, PORTB4-PORTB7, 
PORTC0 undPORTC6 bestehen, und man ein Define LEDs hat, wäre es doch 
edel, dass man dem "LEDs" einfach einen 8Bit Wert zuweisen könnte.

In meinem Momentanen Problem müsste ich ein Define haben, dass ein 
Dummi-Port generiert, welches so aussieht:

(MSB)PORTC0,PORTC1,PORTC2,PORTC3,PORTA7,PORTA6,PORTA5,PORTA4,PORTA3,PORT 
A2,PORTA1,PORTA0(LSB)

Ich hoffe, dass jetzt mein Problem etwas klahrer ist, ansonsten einfach 
fragen.

Besten Dank für  die Hilfe
Berger

von Karl H. (kbuchegg)


Lesenswert?

Patrick B. schrieb:
> Annahme? Das habe ich nie gesagt.
> Vielleicht habe ich mich nicht klar genug ausgedrückt:
> Ich möchte einem Define einen Wert (0...32Bit) übergeben, der dan die
> Ausgänge schaltet.

Ich möchte auch viel.
So wie du dir das vorstellst geht das nicht

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du kannst dir ne Support-Funktion in einen Header pflanzen:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
static inline void set_xport (uint16_t val)
5
{
6
    // avoid race condition
7
    // ...oder über die atomic-Makros, deren Syntax man immer vergisst...
8
    uint8_t sreg = SREG;
9
    cli(); 
10
    PORTA = (uint8_t) val;
11
    if (val & (1 << 8))   PORTC |= (1 << 1)  else PORTC &= ~(1 << 1);
12
    if (val & (1 << 9))   PORTC |= (1 << 6)  else PORTC &= ~(1 << 6);
13
    if (val & (1 << 10))  PORTC |= (1 << 3)  else PORTC &= ~(1 << 3);
14
    if (val & (1 << 11))  PORTC |= (1 << 5)  else PORTC &= ~(1 << 5);
15
    SREG = sreg;
16
}

von Simon K. (simon) Benutzerseite


Lesenswert?

1
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
2
{
3
...
4
}

:-)

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.