Belegung der I/O Bereiche
-
Hallo erstmal, hoffe ihr könnt mir weiterhelfen,
habe folgendes Problem, studiere zurzeit und mache nebenbei ein Praktikum und muss hier nun c programmieren, nunja, habe nicht wirklich eine ahnugn davon....jedenfalls nicht in der art womit meine aufgabe zu tun hat.
bin mich da noch seitenweise am einlesen.also ich sollte zuerst die belegung der I/O bereiche festlegen und wäre sher dankbar wenn mir dabei jemand helfen kann damit ich etws vor mir habe und darauf aufbauen kann.
der microcontroller: infineon xc161cj
ich muss nun sämtliche ports des prozessors im programm definieren.
hier ein beispiel eines ports:
Port: P0L.0
I/O: O
Funktion: Shutdown_V_INT
Konfiguration/Werte: Ausgang, Open Drain
0 = 3.3v Spannungsregler für Shape und Signal
Detectors eingeschaltet.
1 = 3.3v Spannungsregler für Shape und Signal
Detectors ausgeschaltetwie kann ich das in c realisieren?
vielen dank im voraus..
-
Hallo,
ich hatte auch mal mit einem infineon-contorller zu tun. Dabei handelte es sich um den c167.Die Ports liesen sich über header-dateien direkt ansprechen, also
#include <reg167.h> #include <intrins.h> void main(void) { P7_1=0; while (1) { P7_1=~P7_1; //gibt abwechselnd high und low am port 7.1 aus } }
Werte wie Referenzspannungen für AD-Wandler etc... sollten sich über die compiler-software einstellen lassen. Wir arbeiteten mit dem tool dave von infineon. Such dir am besten ne beschreibung zur compiler software oder frag die leute in deiner abteilung.
bash0r
-
folgende hilfmittel hab ich heute noch bekommen:
Keil uVision 3
Keil Ulink
Dave 2.1kann nun die einstellungen über dave tätigen und den code nachher im uvison 3 compilieren und auf den controller laden...
hat mir viel arbeit genommen...
nungut bin immernoch an den einstellungen im dave,
UART
TxD
RxD
CAPIN
T3EUD
T4IN
T3IN
T2IN
SSI
MRST
MTSR
SCLK
CLKOUTwas bedeutet das genau?
-
T2 - T4IN sind vermutlich, aber höchstwahrscheinlich die inputports für die Timer 2 - 4, die müssen mit irgendwelchen ports auf dem controller-board verbunden sein.
Mit ihnen kann der Timer durch externe signale hochgezählt werden.mhm, die anderen pins kommen mir jetzt so auf die schnelle unbekannt vor. CLKOUT ist der Pin, an dem ein Ausgangstakt abgegriffen werden kann. Ob dieser der Ursprungstakt des Controllers ist oder schon durch Frequenzteiler gelaufen ist, kann ich dir nicht sagen.
Ich würde vorschlagen, du suchst mal selbst und zwar auf http://www.keil.com/dd/chip/3320.htmcu
bash0r
-
Wenn keine Definitionen vorliegen, kann man das auch selbst machen, hab' mal exemplarisch Abschnitte aus einem M16C- Header (sfr62.h) geholt:
1. Adresse definieren
#pragma ADDRESS p6_addr 03ecH /* Port P6 */ #pragma ADDRESS pd6_addr 03eeH /* Port P6 direction register */
2. Zugriffsstrukturen anlegen
Damit man entweder als char oder bitweise auf den Port zugreifen kann, werden entsprehende union und struct gebaut:/******************************************************** * declare SFR bit * ********************************************************/ struct bit_def { char b0:1; char b1:1; char b2:1; char b3:1; char b4:1; char b5:1; char b6:1; char b7:1; }; union byte_def{ struct bit_def bit; char byte; };
3. Port definieren
Jetzt werden die Portbezeichner an der passenden Adresse erzeugt/*------------------------------------------------------ Port P6 bit ------------------------------------------------------*/ union byte_def p6_addr; #define p6 p6_addr.byte #define p6_0 p6_addr.bit.b0 /* Port P6 bit0 */ #define p6_1 p6_addr.bit.b1 /* Port P6 bit1 */ #define p6_2 p6_addr.bit.b2 /* Port P6 bit2 */ #define p6_3 p6_addr.bit.b3 /* Port P6 bit3 */ #define p6_4 p6_addr.bit.b4 /* Port P6 bit4 */ #define p6_5 p6_addr.bit.b5 /* Port P6 bit5 */ #define p6_6 p6_addr.bit.b6 /* Port P6 bit6 */ #define p6_7 p6_addr.bit.b7 /* Port P6 bit7 */ /*------------------------------------------------------ Port P6 direction register bit ------------------------------------------------------*/ union byte_def pd6_addr; #define pd6 pd6_addr.byte #define pd6_0 pd6_addr.bit.b0 /* P6 direction register bit0 */ #define pd6_1 pd6_addr.bit.b1 /* P6 direction register bit1 */ #define pd6_2 pd6_addr.bit.b2 /* P6 direction register bit2 */ #define pd6_3 pd6_addr.bit.b3 /* P6 direction register bit3 */ #define pd6_4 pd6_addr.bit.b4 /* P6 direction register bit4 */ #define pd6_5 pd6_addr.bit.b5 /* P6 direction register bit5 */ #define pd6_6 pd6_addr.bit.b6 /* P6 direction register bit6 */ #define pd6_7 pd6_addr.bit.b7 /* P6 direction register bit7 */
Natürlich liegen die Adressen beim Infineon anders, aber bei linear adressierten Controllern funktioniert die Methode immer - weiß zwar nicht, ob das wirklich ANSI- konform ist
, aber damit wird nach so einer copy&paste- Orgie die Handhabung einzelner Bits freundlicher:
4. Gebrauch im Programm
#include "sfr62.h" /* header mit Definition einlesen */ ... int main(void() { pd6_6 = 0x01 /* Pin6 auf Port 6 als Ausgang schalten */ p6_6 = 0x01 /* Pin6, Port 6 auf High setzen */ p6_6 = 0x00 /* Pin6, Port 6 auf Low setzen */ }
Natürlich geht's auch mit Masken, aber Embedded- Compiler erzeugen so immer schnelleren Code ... hoffe geholfen zu haben
-
Vergessene Strichpunkte bitte selbst einstreuen!
-
Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
vielen dank für die rasche hilfe, hat mir sehr geholfen...
mein nächsten problem steht schon vor der tür...mehr dazu ine in einem anderen topic