Forum: Mikrocontroller und Digitale Elektronik Serielle Ausgabe an einem Pin


von S. N. (sp00ky-n1)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ah, du willst sowas wie ein Software-UART implementieren. Dazu gibt es 
auch eine Application Note von Atmel, in der das Verfahren beschrieben 
ist.

http://www.google.de/search?hl=de&q=software+uart+atmel&meta=

von S. N. (sp00ky-n1)


Lesenswert?

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...

von Vollhorst (Gast)


Lesenswert?

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

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.