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ペリフェラルって、どのマイコンも、なんでビット数をもちっと柔軟にできんのかな、、、
0 件のコメント:
コメントを投稿