Register erstellen mit vorhandenen Pins

#1446744
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
#1447073
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
Persönliche Seite #1447167
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
}

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