Hallo zusammen, hoffe bin hier richtig :) Ich mache momentan meine Abschlussarbeit. Dabei geht es darum meinen Mikrocontroller (atxmega128A1) über USART mit dem Computer zu verbinden. Dazu soll ich den Port D mappen damit ich diesen Port als serielle Schnittstelle verwenden kann. Nun meine Fragen: - Was genau ist Portmapping? - Wie programmiere ich diesen Portmapping? Programmiert wird das ganze mit Atmel Studio in C. Habe schon im Internet geschaut und nichts hilfreiches gefunden, daher würde ich mich über hilfreiche Antworten freuen. Danke schon mal im vorraus. PS: Bin im Internet auf diese befehle gestoßen: PORTCFG_VIRTMAP0_PORTC_gc; PORTCFG.VMAP0; PORTCFG_VIRTMAP0_PORTD_gc; PORTCFG.VMAP1; PORTCFG.VMAP1; PVIRT0.DIR = 0xFF; weiß aber nicht was mit anfangen.
Flo King schrieb: > Nun meine Fragen: > - Was genau ist Portmapping? > - Wie programmiere ich diesen Portmapping? Wer schreibt mir die Arbeit?
Hallo Hans, danke für die schnelle Antwort. Dies ist nur ein Bruchteil von meiner gesamten Arbeit. Ich muss zwei Motoren ansteuern die ihre Koordinaten über USART vom PC bekommen. Ich habe bereits die Motoransteuerung sowie die Sende- und Empfangsroutine, nur hänge ich mittlerweile seit fast zwei Wochen an dem Portmapping und kann daher mein komplettes Programm nicht testen. hoffe daher mir kann da jemand weiterhelfen :)
Flo King schrieb: > hoffe daher mir kann da jemand weiterhelfen :) hast du schon mal ins Datenblatt geschaut, darin steht eigentlich alles drin. Dafür braucht man nicht das Internet abzusuchen.
Hallo Peter, auch danke für deine Antwort. Ja habe ich. Aus dem Datenblatt (von Atmel) habe ich die oben genannten Befehle. Habe schon mehrmals probiert es mit diesen Befehlen zu programmieren.
Flo King schrieb: > Ja habe ich. Aus dem Datenblatt (von Atmel) habe ich die oben > genannten Befehle. > Habe schon mehrmals probiert es mit diesen Befehlen zu programmieren. ich sehen keine Befehle. Ich sehe maximal Register denen man einen Wert zuweisen kann, und welche Werte welche Auswirkung haben steht im Datenblatt.
Flo King schrieb: > Ich muss zwei Motoren ansteuern die ihre Koordinaten über USART vom PC > bekommen. Ich habe bereits die Motoransteuerung sowie die Sende- und > Empfangsroutine Na sicher. Nur hast du das bestimmt nicht selber erstellt. Wer sowas programmieren kann, der kann auch das DB lesen und scheitert sicher nicht am Portmapping. gruß cyblord
Hallo, na also sehr hilfreich war das hier bis jetzt nicht wirklich. Und doch ich habe die Motorsteuerung, Sende- und Empfangsroutine selber programmiert. Danke trotzdem.
Durch das Portmapping kannst du dir einen Virtuellen Port zusammenbauen. Z.B. ist das sinnvoll wenn du ein paralleln 8bit Input hast aber keinen ganzen Port mehr frei. Dann setzt du dir den Virtuellen Port aus zwei anderen Ports zusammen und brauchst dann nur einen Befehl um den Ausgang zu setzen. Wenn du das nicht brauchst würde ich ganz einfach bei den normalen Ports bleiben: ( PORTA.DIR | DIRSET | DIRCLR | DIRTGL ) ( PORTA.OUT | OUTSET | OUTCLR | OUTTGL ) ( PORTA.IN )
:
Bearbeitet durch User
Hallo Mikro Controller, Danke für deine Antwort, das heißt also ich kann auf dem Port D dann virtuell die TX und RX Pins von Port C (USB-Stecker) für die serielle Übertragung festlegen. OK habe ich vestanden :) und dann kann ich diesen virtuellen Port wie jeden anderen Port ansteuern?
Hallo Flo, du kannst einen PortA oder PortB etc auf Vports mappen, damit ist dein I/O Zugriff schneller. Hier ein Codeschnipsel, sollte selbsterkärend sein. //PORTC wird als Virtueller Port definiert PORTCFG.VPCTRLA |= PORTCFG_VP02MAP_PORTC_gc; //Der Virtuelle Port0 wird als Ausgang definiert VPORT0.DIR = PIN0_bm; Dann z.B. mit VPORT0.OUT = 0x00; den PortC auf 0 setzen, einzelne Bits geht natürlich auch. Ein Bit-Zugriff mittels VPORT ist wirklich eine SBI oder CBI Anweisung, wenn du einen normalen Port Zugriff verwendest, sind es drei einzelne Befehle. Grüße, Kai
Flo King schrieb: > Danke für deine Antwort, das heißt also ich kann auf dem Port D dann > virtuell die TX und RX Pins von Port C (USB-Stecker) für die serielle > Übertragung festlegen. Nein, das gilt nur für den IO Port. Ich bin mir nicht sicher ob es noch andere Einstellungen gibt wo man richtig multiplexen kann (jede Hardware an jeden Pin). Der Viruelle Port ist aber nur ein IO Port. Wenn du dir dieses DB anschaust: ATxmega64A1/128A1 Preliminary Da gibt es ein Unterpunkt Pinout and Pin Functions. Du schaust dir an an welchen Pins die serielle Verbindung hängt. Z.B. an PD6,7 dann siehst du im DB, dass du USART_D_1 benutzen musst. Wenn die Serielle an anderen Pins hängt an denen kein USART angegeben ist sieht es soweit ich weiß eher schlecht aus.
:
Bearbeitet durch User
Flo King schrieb: > Dazu soll ich den Port D mappen damit ich > diesen Port als serielle Schnittstelle verwenden kann. Die UART zu initialisieren hat nicht wirklich etwas mit "Port-Mapping" zu tun, schon gar nicht mit virtuellen Ports. Es werden hier lediglich die Pins der UART auf die betreffenden Portpins geschaltet und somit die Standard-I/Os überschrieben. Das war schon bei den Tinys und Megas so, nur dass bei den XMEGAs noch Funktionen dazugekommen sind. Um alle informationen für den XMEGA zu erhalten, benötigt man immer das Familien-Manual und das Datenblatt des betreffenden Controllers. Dann muss man nur noch lesen können ;-)
[off topic] @Flo King (Firma: Techniker) (mikroflo) Wie kommt man eigentlich auf die geniale Idee, in einem Mikrocontrollerforum einen Thread mit dem aussagekräftigen Betreff "Mikrocontroller" zu eröffnen? [/off topic]
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.