Forum: Mikrocontroller und Digitale Elektronik ATSAMD10D14 - Timer/Interrupt


von Hannes (taurus16)


Lesenswert?

Moin,

ich habe bisher nur mit AVR 8-Bittern gearbeitet und bin in diesen auch 
sehr gut unterwegs. (Datenblätter sind schon ins Gehirn gebrannt)

Nun ist bei der Arbeit aktuell ein bisschen Luft und ich habe mir einen 
ATSAMD10D14am gekauft und erstmal auf ein kleines PCB aufgebracht. Das 
umstellen des Takts auf interne 48MHz und togglen eines Kanals klappt 
auch schon.

Mir fällt es allerdings ziemlich schwer, Beispiel Code zu finden, so 
auch beim Timer Kapitel.

Die Unterlagen bei Microchip z.B.:

https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42256-SAM-Timer-Counter-for-Control-Applications-TCC-Driver_ApplicationNote_AT07058.pdf

Gelten bei den Examples dann nicht für den D10 sondern nur für die D21. 
Die genutzen Structs/Enum etc. sind obsolet.

Suche ich falsch oder ist es einfach schwierig für D10 etwas zur 
Anwendung zu finden?

Ich möchte als nächstes einen Timer laufen lassen und im 
Millisekundentakt einen Interrupt auslösen.

Ich wäre froh, wenn jemand von euch einen Tipp zu Application Notes hat, 
die auch wirklich für den D10 gedacht sind oder andere Quellen wo es um 
den Timer geht.

Gruß
Hannes

von Peter M. (peterdermeter87)


Lesenswert?

Man findet da relativ wenig.

Ich habe bei dem immer das ASF3 benutzt und dazu das Datasheet mit den 
Registern und man bekommt das schon zum laufen.

Mit ASF funktioniert Peripherie in Betrieb nehmen immer recht gleich. 
Standardwerte in ein Struct -> Parameter verändern -> Init aufrufen -> 
Peripherie aktivieren -> eventuell ISR starten.

Ich hab leider gerade keinen Code für deine Anwendung.
Hiermit aber rufe ich nach einer Zeit die ISR auf. Die läuft aber nur 1 
mal ab. Allerdings sollte es recht einfach sein die umzubauen.
Es wird vom ASF dies benutzt: 
https://asf.microchip.com/docs/latest/samd10/html/group__asfdoc__sam0__tc__group.html

Benutzt wird TC1 nicht TCC aber ich meine TCC war ähnlich kann aber 
bisschen mehr.
1
  
2
// Init
3
        struct tc_module tc_instance;
4
  struct tc_config config_tc;
5
  tc_get_config_defaults(&config_tc);
6
  config_tc.clock_source = GCLK_GENERATOR_0;
7
  config_tc.clock_prescaler = TC_CLOCK_PRESCALER_DIV1;
8
  config_tc.counter_size    = TC_COUNTER_SIZE_16BIT;
9
  config_tc.wave_generation = TC_CTRLA_WAVEGEN_MFRQ;
10
  config_tc.counter_16_bit.compare_capture_channel[0] =((48000000UL/1000000UL)*100); // 100us
11
  config_tc.oneshot = 1;
12
  tc_init(&tc_instance, TC1, &config_tc);
13
  TC1->COUNT16.INTENSET.bit.OVF = 1; // Overflow Interrupt aktivieren
14
  system_interrupt_enable(TC1_IRQn);
15
  tc_enable(&tc_instance);
16
17
// Interrupt
18
void TC1_Handler(void){
19
20
// Code
21
  return;
22
}

: Bearbeitet durch User
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.