Serielle Ausgabe an einem Pin

OP #881632
Hallo,

ich habe hier einen ATMega 169 und würde gerne seriell Daten an einzelne 
Pins von Port F schreiben. Das Problem ist, das ich leider keine Ahnung 
habe, wie ich die parallelen Daten in serielle Daten bekomme?
Hab im Datenblatt geschaut, ob es so was wie ein Schieberegister gibt, 
hab aber keins gefunden. Das einzige was ich gefunden hab, war die 
USART-Schnittstelle...
Daher meine Frage: Kann ich die USART benutzen, um meine parallele Daten 
seriell an einen Pin von Port F auszugeben? Und wenn ja, wie bekomme ich 
die seriellen Daten dann auch wirklich an Port F? Im Datenblatt habe ich 
da noch net wirklich was zu finden können...

Über Antworten wäre ich sehr dankbar.
Gruß,
Sebastian.
#881650
Das USART-Interface hat fest zugeordnete Pins, was aber aus dem 
Datenblatt klar hervorgeht.

Wenn Du ein Soft-UART machen willst, dann findest Du hier im Forum 
einige Beiträge zum Thema (Suche...). Ein Schieberegister kann man sich 
auch bequem in Software machen.
OP #882059
Ok, habe mir jetzt ein Schieberegister in Software programmiert. Es wird 
mit jedem Takt ein neuer Wert an den entsprechenden Pin des Ports 
geschoben.
Das zweite, immer noch ungelöste Problem ist, dass ich leider nicht 
wirklich weiß, wie ich auf einen anderen Pin nun noch meinen Systemtakt 
legen kann.

PS: Das ganze dient dem Ansteuern einer 7-Segment Anzeige über einen 
CPLD. Der ist mit drei Pins am Port mit meinem µC verbunden. Ich schiebe 
also die Daten fröhlich auf den entsprechenden Pin, das bringt mir aber 
nix, solang ich keinen Takt an dem entsprechenden anderen Pin habe...
Gast #882244
Tag.

Du musst ja nicht zwingend den Systemtakt nehmen, ein geringerer Tuts 
wahrscheinlich auch. Also einfach den CLK Pin des CPLD von Hand 
Toggeln...



Wenn das ding bei steigender und fallender Flanke die Daten übernimmt:

void send_byte(unsigned char data)
{
  pinCLK = 0;
  pin1 = data&0x01;
  pinCLK = !pinCLK;
  pin1 = (data>>1)&0x01;
  pinCLK = !pinCLK;
  pin1 = (data>>2)&0x01;
  pinCLK = !pinCLK;
  etc.
}

Wenn nur bei steigender:

void send_byte(unsigned char data)
{
  pinCLK = 0;
  pin1 = data&0x01;
  pinCLK = 1;
  pinCLK = 0;
  pin1 = (data>>1)&0x01;
  pinCLK = 1;
  pinCLK = 0;
  pin1 = (data>>2)&0x01;
  pinCLK = 1;
  pinCLK = 0;
  etc.
}

Für alle könner: NICHT SCHÖN ABER ES FUNKTIONIERT! :)

grüße

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 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.