Register erstellen mit vorhandenen Pins

OP #1446744
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
OP
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
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
Persönliche Seite
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.