Forum: Mikrocontroller und Digitale Elektronik Pin auf high setzen MKL26


von Arm'er Newbie (Gast)


Lesenswert?

Hallo zusammen,

ich versuche gerade einen einfachen Pin auf High (MCU: MKL26xxx) zu 
setzten, leider funktioniert das irgendwie nicht so einfach wie bei den 
AVR's.
Bin mir nicht sicher was ich falsch mache bzw. habe den Verdacht das ich 
generell irgendetwas bei ARM-Programmierung übersehe.
vllt könnt Ihr mir helfen wie ich ein einfachen Pin (hier PTC01) auf 
High setzte bzw. mich aufklären was ich Falsch mache...

Danke schon mal im Vorfeld für eure Unterstützung.

Nach dem Hauptprogramm hab ich noch Auszüge aus der Headerdatei MKL26Z4. 
eingefügt.

Hauptprogramm:

#include "system_MKL26Z4.h"
#include "MKL26Z4.h"

int  main (void){


  SystemInit();

  PORTC->PCR[1]|=(1<<8);     // Pin PTC01 auf Alternative 1 (GPIO)

  PTC->PDDR|=(1<<1);        //Pin PTC01 auf Ausgang
  PTC->PDOR|=(1<<1);        //Pin PTC01 auf High


  while(1){
  }
  return 0;
}




/* 
------------------------------------------------------------------------ 
----
   -- GPIO Peripheral Access Layer
   ------------------------------------------------------------------------ 
----  */

/*!
 * @addtogroup GPIO_Peripheral_Access_Layer GPIO Peripheral Access Layer
 * @{
 */

/** GPIO - Register Layout Typedef */
typedef struct {
  __IO uint32_t PDOR;                              /**< Port Data Output 
Register, offset: 0x0 */
  __O  uint32_t PSOR;                              /**< Port Set Output 
Register, offset: 0x4 */
  __O  uint32_t PCOR;                              /**< Port Clear 
Output Register, offset: 0x8 */
  __O  uint32_t PTOR;                              /**< Port Toggle 
Output Register, offset: 0xC */
  __I  uint32_t PDIR;                              /**< Port Data Input 
Register, offset: 0x10 */
  __IO uint32_t PDDR;                              /**< Port Data 
Direction Register, offset: 0x14 */
} GPIO_Type;

/* 
------------------------------------------------------------------------ 
----
   -- GPIO Register Masks


 ------------------------------------------------------------------------ 
----  */

/*!
 * @addtogroup GPIO_Register_Masks GPIO Register Masks
 * @{
 */

/* PDOR Bit Fields */
#define GPIO_PDOR_PDO_MASK                       0xFFFFFFFFu
#define GPIO_PDOR_PDO_SHIFT                      0
#define GPIO_PDOR_PDO(x) 
(((uint32_t)(((uint32_t)(x))<<GPIO_PDOR_PDO_SHIFT))&GPIO_PDOR_PDO_MASK)
/* PSOR Bit Fields */
#define GPIO_PSOR_PTSO_MASK                      0xFFFFFFFFu
#define GPIO_PSOR_PTSO_SHIFT                     0
#define GPIO_PSOR_PTSO(x) 
(((uint32_t)(((uint32_t)(x))<<GPIO_PSOR_PTSO_SHIFT))&GPIO_PSOR_PTSO_MASK 
)
/* PCOR Bit Fields */
#define GPIO_PCOR_PTCO_MASK                      0xFFFFFFFFu
#define GPIO_PCOR_PTCO_SHIFT                     0
#define GPIO_PCOR_PTCO(x) 
(((uint32_t)(((uint32_t)(x))<<GPIO_PCOR_PTCO_SHIFT))&GPIO_PCOR_PTCO_MASK 
)
/* PTOR Bit Fields */
#define GPIO_PTOR_PTTO_MASK                      0xFFFFFFFFu
#define GPIO_PTOR_PTTO_SHIFT                     0
#define GPIO_PTOR_PTTO(x) 
(((uint32_t)(((uint32_t)(x))<<GPIO_PTOR_PTTO_SHIFT))&GPIO_PTOR_PTTO_MASK 
)
/* PDIR Bit Fields */
#define GPIO_PDIR_PDI_MASK                       0xFFFFFFFFu
#define GPIO_PDIR_PDI_SHIFT                      0
#define GPIO_PDIR_PDI(x) 
(((uint32_t)(((uint32_t)(x))<<GPIO_PDIR_PDI_SHIFT))&GPIO_PDIR_PDI_MASK)
/* PDDR Bit Fields */
#define GPIO_PDDR_PDD_MASK                       0xFFFFFFFFu
#define GPIO_PDDR_PDD_SHIFT                      0
#define GPIO_PDDR_PDD(x) 
(((uint32_t)(((uint32_t)(x))<<GPIO_PDDR_PDD_SHIFT))&GPIO_PDDR_PDD_MASK)

/*!
 * @}
 */ /* end of group GPIO_Register_Masks */


/* GPIO - Peripheral instance base addresses */
/** Peripheral PTA base address */
#define PTA_BASE                                 (0x400FF000u)
/** Peripheral PTA base pointer */
#define PTA                                      ((GPIO_Type *)PTA_BASE)
/** Peripheral PTB base address */
#define PTB_BASE                                 (0x400FF040u)
/** Peripheral PTB base pointer */
#define PTB                                      ((GPIO_Type *)PTB_BASE)
/** Peripheral PTC base address */
#define PTC_BASE                                 (0x400FF080u)
/** Peripheral PTC base pointer */
#define PTC                                      ((GPIO_Type *)PTC_BASE)
/** Peripheral PTD base address */
#define PTD_BASE                                 (0x400FF0C0u)
/** Peripheral PTD base pointer */
#define PTD                                      ((GPIO_Type *)PTD_BASE)
/** Peripheral PTE base address */
#define PTE_BASE                                 (0x400FF100u)
/** Peripheral PTE base pointer */
#define PTE                                      ((GPIO_Type *)PTE_BASE)
/** Array initializer of GPIO peripheral base pointers */
#define GPIO_BASES                               { PTA, PTB, PTC, PTD, 
PTE }

/*!
 * @}
 */ /* end of group GPIO_Peripheral_Access_Layer */



/* 
------------------------------------------------------------------------ 
----
   -- PORT Peripheral Access Layer
   ------------------------------------------------------------------------ 
----  */

/*!
 * @addtogroup PORT_Peripheral_Access_Layer PORT Peripheral Access Layer
 * @{
 */

/** PORT - Register Layout Typedef */
typedef struct {
  __IO uint32_t PCR[32];                           /**< Pin Control 
Register n, array offset: 0x0, array step: 0x4 */
  __O  uint32_t GPCLR;                             /**< Global Pin 
Control Low Register, offset: 0x80 */
  __O  uint32_t GPCHR;                             /**< Global Pin 
Control High Register, offset: 0x84 */
       uint8_t RESERVED_0[24];
  __IO uint32_t ISFR;                              /**< Interrupt Status 
Flag Register, offset: 0xA0 */
} PORT_Type;

/* 
------------------------------------------------------------------------ 
----
   -- PORT Register Masks
   ------------------------------------------------------------------------ 
----  */

/*!
 * @addtogroup PORT_Register_Masks PORT Register Masks
 * @{
 */

/* PCR Bit Fields */
#define PORT_PCR_PS_MASK                         0x1u
#define PORT_PCR_PS_SHIFT                        0
#define PORT_PCR_PE_MASK                         0x2u
#define PORT_PCR_PE_SHIFT                        1
#define PORT_PCR_SRE_MASK                        0x4u
#define PORT_PCR_SRE_SHIFT                       2
#define PORT_PCR_PFE_MASK                        0x10u
#define PORT_PCR_PFE_SHIFT                       4
#define PORT_PCR_DSE_MASK                        0x40u
#define PORT_PCR_DSE_SHIFT                       6
#define PORT_PCR_MUX_MASK                        0x700u
#define PORT_PCR_MUX_SHIFT                       8
#define PORT_PCR_MUX(x) 
(((uint32_t)(((uint32_t)(x))<<PORT_PCR_MUX_SHIFT))&PORT_PCR_MUX_MASK)
#define PORT_PCR_IRQC_MASK                       0xF0000u
#define PORT_PCR_IRQC_SHIFT                      16
#define PORT_PCR_IRQC(x) 
(((uint32_t)(((uint32_t)(x))<<PORT_PCR_IRQC_SHIFT))&PORT_PCR_IRQC_MASK)
#define PORT_PCR_ISF_MASK                        0x1000000u
#define PORT_PCR_ISF_SHIFT                       24
/* GPCLR Bit Fields */
#define PORT_GPCLR_GPWD_MASK                     0xFFFFu
#define PORT_GPCLR_GPWD_SHIFT                    0
#define PORT_GPCLR_GPWD(x) 
(((uint32_t)(((uint32_t)(x))<<PORT_GPCLR_GPWD_SHIFT))&PORT_GPCLR_GPWD_MA 
SK)
#define PORT_GPCLR_GPWE_MASK                     0xFFFF0000u
#define PORT_GPCLR_GPWE_SHIFT                    16
#define PORT_GPCLR_GPWE(x) 
(((uint32_t)(((uint32_t)(x))<<PORT_GPCLR_GPWE_SHIFT))&PORT_GPCLR_GPWE_MA 
SK)
/* GPCHR Bit Fields */
#define PORT_GPCHR_GPWD_MASK                     0xFFFFu
#define PORT_GPCHR_GPWD_SHIFT                    0
#define PORT_GPCHR_GPWD(x) 
(((uint32_t)(((uint32_t)(x))<<PORT_GPCHR_GPWD_SHIFT))&PORT_GPCHR_GPWD_MA 
SK)
#define PORT_GPCHR_GPWE_MASK                     0xFFFF0000u
#define PORT_GPCHR_GPWE_SHIFT                    16
#define PORT_GPCHR_GPWE(x) 
(((uint32_t)(((uint32_t)(x))<<PORT_GPCHR_GPWE_SHIFT))&PORT_GPCHR_GPWE_MA 
SK)
/* ISFR Bit Fields */
#define PORT_ISFR_ISF_MASK                       0xFFFFFFFFu
#define PORT_ISFR_ISF_SHIFT                      0
#define PORT_ISFR_ISF(x) 
(((uint32_t)(((uint32_t)(x))<<PORT_ISFR_ISF_SHIFT))&PORT_ISFR_ISF_MASK)

/*!
 * @}
 */ /* end of group PORT_Register_Masks */


/* PORT - Peripheral instance base addresses */
/** Peripheral PORTA base address */
#define PORTA_BASE                               (0x40049000u)
/** Peripheral PORTA base pointer */
#define PORTA                                    ((PORT_Type 
*)PORTA_BASE)
/** Peripheral PORTB base address */
#define PORTB_BASE                               (0x4004A000u)
/** Peripheral PORTB base pointer */
#define PORTB                                    ((PORT_Type 
*)PORTB_BASE)
/** Peripheral PORTC base address */
#define PORTC_BASE                               (0x4004B000u)
/** Peripheral PORTC base pointer */
#define PORTC                                    ((PORT_Type 
*)PORTC_BASE)
/** Peripheral PORTD base address */
#define PORTD_BASE                               (0x4004C000u)
/** Peripheral PORTD base pointer */
#define PORTD                                    ((PORT_Type 
*)PORTD_BASE)
/** Peripheral PORTE base address */
#define PORTE_BASE                               (0x4004D000u)
/** Peripheral PORTE base pointer */
#define PORTE                                    ((PORT_Type 
*)PORTE_BASE)
/** Array initializer of PORT peripheral base pointers */
#define PORT_BASES                               { PORTA, PORTB, PORTC, 
PORTD, PORTE }

/*!
 * @}
 */ /* end of group PORT_Peripheral_Access_Layer */

von Arm'er Newbie (Gast)


Lesenswert?

help

von Arm'er Newbie (Gast)


Lesenswert?

keiner eine Idee?

von Bernd K. (prof7bit)


Lesenswert?

1.) Wie sieht Deine SystemInit() aus? Werden da die Clocks für die 
GPIO-Ports bereits eingeschaltet? Wenn nein dann mach das:

1
  // PORT C einschalten
2
  SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK;
3
4
  // Pin PTC01 auf Alternative 1 (GPIO)
5
  PORTC->PCR[1] = PORT_PCR_MUX(1);
6
7
  PTC->PDDR |= (1 << 1);        //Pin PTC01 auf Ausgang
8
  PTC->PDOR |= (1 << 1);        //Pin PTC01 auf High

Beachte daß ich das nicht ins PCR[1] Register reingeodert sondern 
reingeschrieben habe!

2.) Kannst Du mal nachschauen ob in Deinem Startup-Code die SystemInit() 
bereits vor der main() aufgerufen wird, wenn ja dann musst Du das nicht 
nochmal in main() tun.

3.) hier hab ich für den KL25 (Du hast den KL26) ein kleines 
Demo-Projekt, das ist zwar ein geringfügig anderer Prozessor aber sehr 
sehr ähnlich, teilweise fast gleich:

https://github.com/prof7bit/frdm-kl25z-minimal-usb-hid

Du kannst ja mal versuchen das auf den KL26 zu portieren (musst Startup 
anpassen (die Vektoren), Linker-Script anpassen, MKLxxZyy-Header 
austauschen, Ordner umbenennen, Makefile anpassen, schaun ob USB 
unverändert funktioniert (wahrscheinlich), wenn nicht Unterschied finden 
und entsprechend anpassen), das wäre eine nette Übung für den Einstieg.

: Bearbeitet durch User
von Arm'er Newbie (Gast)


Lesenswert?

Hallo Bernd K.

erstmal danke für deine Antwort...
nein ich ruf SystemInit() nicht davor auf.


mein SystemInit() sieht so aus:

#define DISABLE_WDOG    1

#define CLOCK_SETUP     1
/* Predefined clock setups
   0 ... Multipurpose Clock Generator (MCG) in FLL Engaged Internal 
(FEI) mode
         Reference clock source for MCG module is the slow internal 
clock source 32.768kHz
         Core clock = 41.94MHz, BusClock = 13.98MHz
   1 ... Multipurpose Clock Generator (MCG) in PLL Engaged External 
(PEE) mode
         Reference clock source for MCG module is an external crystal 
8MHz
         Core clock = 48MHz, BusClock = 24MHz
   2 ... Multipurpose Clock Generator (MCG) in Bypassed Low Power 
External (BLPE) mode
         Core clock/Bus clock derived directly from an external crystal 
8MHz with no multiplication
         Core clock = 8MHz, BusClock = 8MHz
*/

/*---------------------------------------------------------------------- 
------
  Define clock source values
 *----------------------------------------------------------------------- 
-----*/
#if (CLOCK_SETUP == 0)
    #define CPU_XTAL_CLK_HZ                 8000000u /* Value of the 
external crystal or oscillator clock frequency in Hz */
    #define CPU_INT_SLOW_CLK_HZ             32768u   /* Value of the 
slow internal oscillator clock frequency in Hz  */
    #define CPU_INT_FAST_CLK_HZ             4000000u /* Value of the 
fast internal oscillator clock frequency in Hz  */
    #define DEFAULT_SYSTEM_CLOCK            41943040u /* Default System 
clock value */
#elif (CLOCK_SETUP == 1)
    #define CPU_XTAL_CLK_HZ                 8000000u /* Value of the 
external crystal or oscillator clock frequency in Hz */
    #define CPU_INT_SLOW_CLK_HZ             32768u   /* Value of the 
slow internal oscillator clock frequency in Hz  */
    #define CPU_INT_FAST_CLK_HZ             4000000u /* Value of the 
fast internal oscillator clock frequency in Hz  */
    #define DEFAULT_SYSTEM_CLOCK            48000000u /* Default System 
clock value */
#elif (CLOCK_SETUP == 2)
    #define CPU_XTAL_CLK_HZ                 8000000u /* Value of the 
external crystal or oscillator clock frequency in Hz */
    #define CPU_INT_SLOW_CLK_HZ             32768u   /* Value of the 
slow internal oscillator clock frequency in Hz  */
    #define CPU_INT_FAST_CLK_HZ             4000000u /* Value of the 
fast internal oscillator clock frequency in Hz  */
    #define DEFAULT_SYSTEM_CLOCK            8000000u /* Default System 
clock value */
#endif /* (CLOCK_SETUP == 2) */


/* 
------------------------------------------------------------------------ 
----
   -- Core clock
   ------------------------------------------------------------------------ 
----  */

uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;

/* 
------------------------------------------------------------------------ 
----
   -- SystemInit()
   ------------------------------------------------------------------------ 
----  */




/* 
------------------------------------------------------------------------ 
----
   -- SystemInit()
   ------------------------------------------------------------------------ 
----  */

void SystemInit (void) {
#if (DISABLE_WDOG)
  /* Disable the WDOG module */
  /* SIM_COPC: COPT=0,COPCLKS=0,COPW=0 */
  SIM->COPC = (uint32_t)0x00u;
#endif /* (DISABLE_WDOG) */
#if (CLOCK_SETUP == 0)
  /* SIM->CLKDIV1: 
OUTDIV1=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=2,??=0,?? 
=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 
*/
  SIM->CLKDIV1 = (uint32_t)0x00020000UL; /* Update system prescalers */
  /* Switch to FEI Mode */
  /* MCG->C1: CLKS=0,FRDIV=0,IREFS=1,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x06U;
  /* MCG->C2: LOCRE0=0,RANGE0=0,HGO0=0,EREFS0=0,LP=0,IRCS=0 */
  MCG->C2 &= (uint8_t)~(uint8_t)0xBFU;
  /* MCG->C4: DMX32=0,DRST_DRS=1 */
  MCG->C4 = (uint8_t)((MCG->C4 & (uint8_t)~(uint8_t)0xC0U) | 
(uint8_t)0x20U);
  /* OSC0->CR: 
ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=0,SC4P=0,SC8P=0,SC16P=0 */
  OSC0->CR = (uint8_t)0x80U;
  /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0 */
  MCG->C5 = (uint8_t)0x00U;
  /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */
  MCG->C6 = (uint8_t)0x00U;
  while((MCG->S & MCG_S_IREFST_MASK) == 0x00U) { /* Check that the 
source of the FLL reference clock is the internal reference clock. */
  }
  while((MCG->S & 0x0CU) != 0x00U) {    /* Wait until output of the FLL 
is selected */
  }
#elif (CLOCK_SETUP == 1)
  /* SIM->SCGC5: PORTA=1 */
  SIM->SCGC5 |= (uint32_t)0x0200UL;     /* Enable clock gate for ports 
to enable pin routing */
  /* SIM->CLKDIV1: 
OUTDIV1=1,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=1,??=0,?? 
=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 
*/
  SIM->CLKDIV1 = (uint32_t)0x10010000UL; /* Update system prescalers */
  /* PORTA->PCR18: ISF=0,MUX=0 */
  PORTA->PCR[18] &= (uint32_t)~0x01000700UL;
  /* PORTA->PCR19: ISF=0,MUX=0 */
  PORTA->PCR[19] &= (uint32_t)~0x01000700UL;
  /* Switch to FBE Mode */
  /* MCG->C2: LOCRE0=0,RANGE0=2,HGO0=0,EREFS0=1,LP=0,IRCS=0 */
  MCG->C2 = (uint8_t)((MCG->C2 & (uint8_t)~(uint8_t)0x9BU) | 
(uint8_t)0x24U);
  /* OSC0->CR: 
ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=1,SC4P=0,SC8P=0,SC16P=0 */
  OSC0->CR = (uint8_t)0x80U;
  /* MCG_C1: CLKS=2,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x9AU;
  /* MCG->C4: DMX32=0,DRST_DRS=0 */
  MCG->C4 &= (uint8_t)~(uint8_t)0xE0U;
  /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=1 */
  MCG->C5 = (uint8_t)0x01U;
  /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */
  MCG->C6 = (uint8_t)0x00U;
  while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) { /* Check that the 
source of the FLL reference clock is the external reference clock. */
  }
  while((MCG->S & 0x0CU) != 0x08U) {    /* Wait until external reference 
clock is selected as MCG output */
  }
  /* Switch to PBE Mode */
  /* MCG->C6: LOLIE0=0,PLLS=1,CME0=0,VDIV0=0 */
  MCG->C6 = (uint8_t)0x40U;
  while((MCG->S & 0x0CU) != 0x08U) {    /* Wait until external reference 
clock is selected as MCG output */
  }
  while((MCG->S & MCG_S_LOCK0_MASK) == 0x00U) { /* Wait until locked */
  }
  /* Switch to PEE Mode */
  /* MCG->C1: CLKS=0,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x1AU;
  while((MCG->S & 0x0CU) != 0x0CU) {    /* Wait until output of the PLL 
is selected */
  }
#elif (CLOCK_SETUP == 2)
  /* SIM->SCGC5: PORTA=1 */
  SIM->SCGC5 |= (uint32_t)0x0200UL;     /* Enable clock gate for ports 
to enable pin routing */
  /* SIM->CLKDIV1: 
OUTDIV1=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,OUTDIV4=0,??=0,?? 
=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 
*/
  SIM->CLKDIV1 = (uint32_t)0x00000000UL; /* Update system prescalers */
  /* PORTA->PCR18: ISF=0,MUX=0 */
  PORTA->PCR[18] &= (uint32_t)~0x01000700UL;
  /* PORTA->PCR19: ISF=0,MUX=0 */
  PORTA->PCR[19] &= (uint32_t)~0x01000700UL;
  /* Switch to FBE Mode */
  /* MCG->C2: LOCRE0=0,??=0,RANGE0=2,HGO0=0,EREFS0=1,LP=0,IRCS=0 */
  MCG->C2 = (uint8_t)0x24U;
  /* OSC0->CR: 
ERCLKEN=1,??=0,EREFSTEN=0,??=0,SC2P=1,SC4P=0,SC8P=0,SC16P=0 */
  OSC0->CR = (uint8_t)0x80U;
  /* MCG->C1: CLKS=2,FRDIV=3,IREFS=0,IRCLKEN=1,IREFSTEN=0 */
  MCG->C1 = (uint8_t)0x9AU;
  /* MCG->C4: DMX32=0,DRST_DRS=0 */
  MCG->C4 &= (uint8_t)~(uint8_t)0xE0U;
  /* MCG->C5: ??=0,PLLCLKEN0=0,PLLSTEN0=0,PRDIV0=0 */
  MCG->C5 = (uint8_t)0x00U;
  /* MCG->C6: LOLIE0=0,PLLS=0,CME0=0,VDIV0=0 */
  MCG->C6 = (uint8_t)0x00U;
  while((MCG->S & MCG_S_IREFST_MASK) != 0x00U) { /* Check that the 
source of the FLL reference clock is the external reference clock. */
  }
  while((MCG->S & 0x0CU) != 0x08U) {    /* Wait until external reference 
clock is selected as MCG output */
  }
  /* Switch to BLPE Mode */
  /* MCG_C2: LOCRE0=0,RANGE0=2,HGO0=0,EREFS0=1,LP=1,IRCS=0 */
  MCG->C2 = (uint8_t)((MCG->C2 & (uint8_t)~(uint8_t)0x99U) | 
(uint8_t)0x26U);
  while((MCG->S & 0x0CU) != 0x08U) {    /* Wait until external reference 
clock is selected as MCG output */
  }
#endif /* (CLOCK_SETUP == 2) */
}

von Bernd K. (prof7bit)


Lesenswert?

Bitte poste Codeschnipsel im Forum mit den C-Tags, sonst bekommt man 
Kopfschmerzen, ganze Dateien kannst Du auch mit der endung .c oder .h 
als Anhang anhängen.
1
[c]
2
  code...
3
[/c]

von Bernd K. (prof7bit)


Lesenswert?

Dein SystemInit() schaltet nur PORTA ein, weil es im Zuge der 
Taktkonfiguration irgendwas an den Xtal Pins herumkonfiguriert.

Für jeden PORT (und für jedes andere Peripheriegerät ebenso gibt es in 
den SIM->SCGC4 (... bis SCGC7) Registern Bits zum Einschalten des Clocks 
und somit Einschalten der jeweiligen Peripherie. Per Default aus dem 
Reset heraus bekommen die erstmal keinen Clock aus Energiespargründen.

: Bearbeitet durch User
von Arm'er Newbie (Gast)


Lesenswert?

Ok danke, ich wusste gar nicht das ich davor noch ein Clock setzen muss.

wie ist den der Generelle Ablauf wenn ich den Microcontroller 
Initialisieren will und ein Pin setzen muss? bzw. Was muss ich davor 
beachten was gesetzt werden muss?

von Bernd K. (prof7bit)


Lesenswert?

Arm'er Newbie schrieb:
> Ok danke, ich wusste gar nicht das ich davor noch ein Clock setzen
> muss.
>
> wie ist den der Generelle Ablauf wenn ich den Microcontroller
> Initialisieren will und ein Pin setzen muss? bzw. Was muss ich davor
> beachten was gesetzt werden muss?

Das ist eigentlich schon alles.
* SCGC5 Bit setzen zum Einschalten
* PCR-Register für den jeweiligen Pin konfigurieren (dort befindet sich 
alternate-mux, evtl Interrupt, drive-strength, pullup) Kapitel 11.5.1 
(PORT->PCR)
* Ein-Ausgang konfigurieren wie oben bereits gemacht, Kapitel 42
* Lesen oder Ausgang Setzen wie oben bereits gemacht, Kapitel 42

Zum schnellen setzen und löschen kannst Du auch die PSOR und PCOR 
Register nehmen also statt
1
PTC->PDOR |= (1 << 1);

kannst Du schreiben:
1
// Pin 1 setzen (und alle anderen gleich lassen)
2
PTC->PSOR = (1 << 1);
3
4
// Pin 1 loeschen (und alle anderen gleich lassen)
5
PTC->PCOR = (1 << 1);

Beachte: Hier hab ich nicht geodert sondern einfach reingeschrieben, 
alle bits die 0 sind bewirken nichts, alle die 1 sind bewirken setzen 
oder löschen. Es gibt auch noch ein PTOR Register zum Toggeln.

Anstelle von PTA, PTB, PTC, PTD, PTE zum Setzen und Lesen in obigen 
Beispielen kannst Du auch FPTA, FPTB, FPTC, FPTD, FPTE verwenden, 
letztere gehen über einen anderen Bus, zeitgleich zum Instruction-Fetch 
und brauchen nur einen einzigen Taktzyklus. Nachteil ist letztere 
Adressen lassen sich nicht über den DMA erreichen.

Das sind übrigens die einzigen Register die im Reference Manual anders 
heißen als sie in den Headern benannt sind. Im Manual musst Du bei 
Kapitel 42 GPIO schauen und dort heißen sie GPIOx (oder FGPIOx), im 
Header heißen sie PTx (bzw FPTx für die schnelle Busanbindung).

Alle anderen Register heißen im Header genauso wie auch im Manual.

: Bearbeitet durch User
von Arm'er Newbie (Gast)


Lesenswert?

Verdammte scheiße, es funktioniert!!!!!!!!

Vielllen Dankeeeeeeeeeeee Bernd K.  du weist gar nicht wie sehr du mir 
geholfen hast, ich will gar nicht erzählen wie lange ich hier schon am 
verzweifeln bin....ich würde dich jetzt am liebsten Knuddel  :)

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.