AVR128DB28のタイマーをローレベルに動かしてみる
AVR128DB28のタイマーはちょっと前(https://sunday-engineer.jimdofree.com/2024/08/12/avr128db28%E3%81%A7arduino-5/)にいじってみたけど、もちっとローレベルな動かし方でやってみる。やっぱり8ビットマイコンはこういう動かし方だよね的な。
で、実は参考になるサイトが少なすぎるのと、Atmega328Pで最初何をみてやってたのか思い出せずにちょっと苦労した。
で、結局、こんなところによい参考があった。
で、いろいろ要らなそうな記述やら消したり、ピンへの出力は自前でやるってことでその辺を変更したりして、こうなる。-
/*========================================================================
-
study6.ino
-
2024.10.14 Sunday Engineer
-
SWD access tool study
-
Board: "AVR DB-series (Optiboot)"
-
Board: "AVR128DB28"
-
Clock Speed: "16 MHz crystal"
-
millis()/micros() timer: "TCB2 (recommended)"
-
BOD level if enabled (Bootload burn req'd): "1.9V"
-
BOD Mode Active/Sleeping (Bootload burn req'd): "Disabled/Disabled"
-
WDT Timeout (Bootload burn req'd): "Disabled (recommended)"
-
WDT "window" (Bootload burn req'd): "No delay before window "opens""
-
Reset pin function (Bootload burn req'd): "PF6: Reset (default boot entry on reset pin & SW resets, 1 sec timeout)
-
Startup Time: "64ms"
-
Bootloader Serial Port (Bootload burn req'd): "USART0 (alt): TX PA4, RX PA5"
-
Bootloader Entry Condition (Bootload burn req'd): "Default (see documentation)"
-
MultiVoltage I/O (MVIO) (Bootload burn req'd): "Enabled (burn bootloader req'd)"
-
attachInterrupt() Version: "On all pins, with new implementation."
-
printf(): "Default (doesn't print floats, 1.4k flash use)"
-
Wire (Wire.h/I2C) Library mode: "1x Wire, Master or Slave (least Flash & RAM)"
-
How to set FLMAP: "Use last FLMAP section, lock FLMAP, provide PROGMEM_MAPPED"
-
========================================================================*/
-
/*
-
F_PER=16000000Hz
-
CLKSEL=111(=DIV1024)
-
F_TIM=15625Hz
-
T_TIM=64us
-
*/
-
uint16_t per_set=15625;
-
void setup() {
-
pinMode(LED_BUILTIN, OUTPUT);
-
digitalWrite(LED_BUILTIN,HIGH);
-
takeOverTCA0();
-
TCA0.SINGLE.CTRLB = 0x10;
-
TCA0.SINGLE.PER = per_set;
-
TCA0.SINGLE.CMP0 = (per_set>>1);
-
TCA0.SINGLE.INTCTRL = 0x11;
-
TCA0.SINGLE.CTRLA = 0x0F;
-
}
-
void loop() {
-
}
-
ISR(TCA0_OVF_vect) {
-
TCA0.SINGLE.INTFLAGS = 0x01;
-
digitalWrite(LED_BUILTIN,HIGH);
-
}
-
ISR(TCA0_CMP0_vect){
-
TCA0.SINGLE.INTFLAGS = 0x10;
-
digitalWrite(LED_BUILTIN,LOW);
-
}
で、こんなもんで限界。
-
uint16_t per_set=64;
-
void setup() {
-
PORTC.DIR|=0x01;
-
VPORTC.DIR|=0x01;
-
VPORTC.OUT=0x01;
-
takeOverTCA0();
-
TCA0.SINGLE.CTRLB = 0x10;
-
TCA0.SINGLE.PER = per_set;
-
TCA0.SINGLE.CMP0 = (per_set>>1);
-
TCA0.SINGLE.INTCTRL = 0x11;
-
TCA0.SINGLE.CTRLA = 0x01;
-
}
-
void loop() {
-
}
-
ISR(TCA0_OVF_vect) {
-
TCA0.SINGLE.INTFLAGS = 0x01;
-
VPORTC.OUT|=0x01;
-
}
-
ISR(TCA0_CMP0_vect){
-
TCA0.SINGLE.INTFLAGS = 0x10;
-
VPORTC.OUT&=~0x01;
-
}
まぁ、コードでトグルしてたんじゃこんなもんよな、、、
ちなみに今回の目的はARMのSWDにアクセスするスタンドアロンツールを作るためなんやけど、SWDってSPIとほぼ同じなので、SPIモジュールでやればもっと早くできる。が、SWDは微妙なビット数の時があるので、こまるんよね。SPIペリフェラルって、どのマイコンも、なんでビット数をもちっと柔軟にできんのかな、、、
コメントをお書きください