Ressourcen-Icon

SAM D21J17A im Modularen Board System 2017-06-18

Hallo Dirk
bin am testen mit deinem Programm. Keine Angst, ist kein Bus diesmal, das geht ganz hervorragend. s geht um dein erstes Programm mit dem toggeln der LED. Da finde icgh nicht so richtig was dazu an Erlärungen bzw. Anwendung.


CodeBox C
#define BUTTON_PIN       PIN_PB23    // Angabe Taster 4 auf P110
#define LED0_PIN       PIN_PA03   // Angabe LED 3 auf P110
#define LED0_ACTIVE       false
#define LED0_INACTIVE   !LED0_ACTIVE

#define LED_ON           port_pin_set_output_level(LED0_PIN, LED0_ACTIVE);
#define LED_OFF           port_pin_set_output_level(LED0_PIN, LED0_INACTIVE);
#define LED_TOGGLE       port_pin_toggle_output_level(LED0_PIN);   

du verwendest hier


CodeBox C
#define LED0_INACTIVE   !LED0_ACTIVE
#define LED_ON           port_pin_set_output_level(LED0_PIN, LED0_ACTIVE);

Bei port_pin_set_level sind mir zwei Angaben mit LED0_PIN und LED0_ACTIVE nicht klar. Warum zwei mal die Angabe?
Und der schöne Timer.


CodeBox C
void SysTick_Handler(void)           // Umschaltung LED on/off durch toggeln
  {
   static uint16_t delaycount = 0;   // Angabe Variable delaycount
   if (delaycount < 250)           // Abfrage delycount ob kleiner 250
     {                               // solange kleiner 250 erhöhen
       delaycount++;               // delaycount um eins erhöhen
     }
   else                           // wenn grösser gleich 250
     {
       delaycount = 0;               // delaycount auf 0
       LED_TOGGLE                   // LED umschalten
     }
  }

Im Vergleich mit einem AVR ist es soweit klar. Bei jedem Durchlazf wird delaycount hohgezählt. Bei =250 wir LED getoggelt.
Das Problem liegt in diesem Teil:


CodeBox C
static void configure_systick_handler(void)
  {
   SysTick->CTRL = 0;
   SysTick->LOAD = 8000; //48000; // 1ms Event (1ms/(1/48Mhz))  
   SysTick->VAL  = 0;
   SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
  }

In der Beschreibung zu ASF steht zu wenig was verstehe. Bisher habe ich verstanden das ein Timer eingeschaltet wird und der Wert für den Interrupt auf 8000 steht/auslöst. Mit den anderen Sachen werden Angaben dazu gemacht. Eingeschaltet bzw. Aufruf und Init erfolgt damit


CodeBox C
irq_initialize_vectors();
cpu_irq_enable();   

Ist komplizieter als beim AVR.
achim
 
Hallo Achim,
Bei port_pin_set_level sind mir zwei Angaben mit LED0_PIN und LED0_ACTIVE nicht klar. Warum zwei mal die Angabe?

der erste Parameter ist der Portpin welcher auf low oder high gesetzt werden soll, der zweite Parameter ist ein boolscher Wert.
True: der Pin wird auf high gesetzt
False: auf low

#define LED_ON port_pin_set_output_level(LED0_PIN, LED0_ACTIVE);

schreib einfach
port_pin_set_output_level(PIN_PA03, true); // high
port_pin_set_output_level(PIN_PA03, false); // low

---

Zum Systick Timer:
Der Timer befindet sich im Cortex M0+ Kern des Mikrocontrollers, er ist kein Periperiemodul des Atmel/Microchip Mikrocontrollers.
Du findest deshalb auch keine Info hierzu im Datenblatt des Mikrocontrollers, sondern bei ARM im Info Center.

LOAD ist das Register für den Nachladewert (Reload Value). Genau genommen sollte der Nachladewert oben 8000-1 sein. Wie man den Wert berechnet, findest du im ARM info Center.

Dirk :ciao:
 
Hallo Dirk
suche nach ein paar Erklärungen für den Timer bzw. Anwendung. Im Beispiel oben verwendest du ja den Timer. Wie wird die Zeit berechnet bzw. Eingestellt? Aus dem Datenblatt habe ich erfahren, das es mehr Timer gibt als beim AVR, so in 8 oder 16 oder 32 Bit.
Hast du was für mich?
achim
 
Hallo Achim,

der obere SysTick Timer läuft in der Regel mit dem CPU Takt. Der Timer wird dekrementiert. Wenn der Timer 0 erreicht, wird ein Interrupt ausgelöst und man kann den Timer dann mit einem Reload Wert wieder starten lassen. So erreicht man ein bestimmtes Intervall für den Interrupt.
Das entspricht etwa dem CTC Mode (Clear Timer on Compare Match) beim AVR. Im einen Fall läuft er vom Relaod Wert bis 0 im anderen Fall von 0 bis CompareWert.

Für die Timer/Counter TC (Peripherie des MC) schau mal ob du bei ASF hierzu Beispiele findest. Ansonsten ist eigentlich alles im Datenblatt des Mikrocontrollers erklärt.

Es gibt 8 und 16 Bit Timer/Counter,
zwei 16 Bit TC kann man koppeln, so dass man einen 32Bit TC erhält.

Es gibt viele viele Möglichkeiten, was man damit anstellen kann ...
u.a. Waveform generation (Frequenz erzeugen, PWM)
Input Capture (Event, Frequency, Pulse width)
Overflow- und Underflow Interrupt
Compare Interrupt

Schau dir vielleicht auch Anwendungsfälle bei AVR an und setz diese hier um. Es ist im Prinzip alles recht ähnlich.

Dirk :ciao:
 
Hallo Dirk
habe mir die Beispiel aus ASF vorgenommen. Wird relativ viel erklärt und ist scheinbar gut für mich geeignet. Leider bekomme ich eine Fehlermeldung, die ich so nicht verstehe. Habe schon auf den Seiten von Atmel gesucht. Leider ohne Erfolg.


CodeBox C
void configure_tc(void)             //setup of the configuration of the pins
  {
   struct tc_config config_tc;
   tc_get_config_defaults(&config_tc);      //generate a configure-structure and load the defaults
   
   config_tc.counter_size = TC_COUNTER_SIZE_8BIT;   //the counter size is 8 bit
   config_tc.clock_source = GCLK_GENERATOR_1;       //Timer should become the clock from GCLK1
   config_tc.clock_prescaler = TC_CLOCK_PRESCALER_DIV1024; //divide the clock-signal by 1024
   config_tc.counter_8_bit.period = 99;                      //overflow value
   config_tc.counter_8_bit.compare_capture_channel[0] = 33;  // value of the capture-channel0
   config_tc.counter_8_bit.compare_capture_channel[1] = 66;  // value of the capture-channel1
   
   tc_init(&tc_instance, TC0, &config_tc);      //initialize and enable TC0 with the configurations from the top
   
   tc_enable(&tc_instance);
}

Es wird die Zeile mit TC0 als Fehler angegeben.
Weiter oben steht das


CodeBox C
struct tc_module tc_instance;    //generate an instance-structure

Habe das folgende zusätzlich angegeben:
Port GPIO Pin Control
TC-TimerCounter Driver
Leider weiss ich nicht wo der Fehler herkommt. Hast du eine Idee?
achim
 
Hallo Achim,
Es wird die Zeile mit TC0 als Fehler angegeben.

der SAMD21 hat 5 Timer/Counter TC3 TC4 TC5 TC6 und TC7.

Verwende einen anderen Timer-Index.

Um dich richtig zu verwirren ;) ...
Es gibt die "Timer/ Counter for Control Applications" TCC0, TCC1 und TCC2.
Mit denen kann man noch mehr machen (Motor Control, Power Converter ...), die Module sind noch komplexer als ein TCn.

Dirk :ciao:
 
Du braust dich nicht anzustrengen. Verspüre der ersten Anzeichen eines beginnendes Wahnsinns schon einige Zeit. Das sind so Sachen wie bergessene Buchstaben, Probleme mit Lesen und Schreiben und besonders hat sich mein Kaffee und Bierverbrauch stark erhöht.
achim
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)