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.
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.
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=
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.