我在将arduino网络中实现Atmega328计时器时遇到问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在将arduino网络中实现Atmega328计时器时遇到问题相关的知识,希望对你有一定的参考价值。

我正在尝试通过两个arduinos之间的r / f通信实现纠错。我尝试向其中添加一个计时器,以创建重发数据包,但是只要它超过了第一次发送,它就会开始打印垃圾广告无穷大,而不是进行计时器中断。

我尝试弄乱内部循环条件,并试图弄清楚计时器出了什么问题,但我无法弄清楚。该问题似乎发生在第一次串行打印附近,这很奇怪,因为该部分代码大部分未更改。(数据包是两个整数的结构)

#include <ELECHOUSE_CC1101.h>
#include "packets.h"

// These examples are from the Electronics Cookbook by Simon Monk
// Connections (for an Arduino Uno)
// Arduino          CC1101
// GND              GND
// 3.3V             VCC
// 10               CSN/SS   **** Must be level shifted to 3.3V
// 11               SI/MOSI  **** Must be level shifted to 3.3V
// 12               SO/MISO
// 13               SCK      **** Must be level shifted to 3.3V
// 2                GD0

const int n = 61;
unsigned short int sequence = 0;
byte buffer[n] = "";


void setup() 
  Serial.begin(9600);
  Serial.println("Set line ending to New Line in Serial Monitor.");
  Serial.println("Enter Message");
  ELECHOUSE_cc1101.Init(F_433); // set frequency - F_433, F_868, F_965 MHz
  // initialize timer1 

  noInterrupts();           // disable all interrupts

  TCCR1A = 0;

  TCCR1B = 0;

  TCNT1 = 0;


  OCR1A = 0xFFFF; // Max value for overflow for now

  TCCR1B |= (1 << CS12);    // 256 prescaler 



  interrupts();             // enable all interrupts


Packet pckt, recieve;

ISR(TIMER1_OVR_vect)          // timer compare interrupt service routine
    //Resend packet
    ELECHOUSE_cc1101.SendData(buffer, pckt.data + pckt.seqNum);
    int len = ELECHOUSE_cc1101.ReceiveData(buffer);
    buffer[len] = '\0';
    recieve.seqNum = buffer[n];
    Serial.println("Interrupt");





void loop() 
  if (Serial.available()) 
    pckt.data = Serial.readBytesUntil('\n', buffer, n);
    pckt.seqNum = sequence;
    buffer[pckt.data] = '\0';
    buffer[n-1] = pckt.seqNum;
    Serial.println((char *)buffer);

    ELECHOUSE_cc1101.SendData(buffer, pckt.data + pckt.seqNum);
    TCNT1 = 0; // clear timer
    TIMSK1 |= (1 << TOIE0);  // enable timer compare interrupt
    int len = ELECHOUSE_cc1101.ReceiveData(buffer);
    while (recieve.seqNum <= sequence) 

    
    TIMSK1 &= ~(1 << TOIE0); // turn off the timer interrupt

  

答案

发送数据对于中断而言花费的时间太长。您应该在loop()函数调用树中保留调用以发送和接收数据缓冲区。例如,以9600波特率通过UART发送12字节消息可能需要大约12ms。

以上是关于我在将arduino网络中实现Atmega328计时器时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Arduino Uno微控制器采用的是Atmel的ATmega328

ATMEGA328P(Arduino Pro Mini)超低运行功耗探索

Atmega328 模数转换器

用 arduino 切换 3 个双向通信通道的最佳方法

使用 UDRE 和 ATmega328P 的中断驱动 USART

ATMEGA328P使用内部8MRC振荡器(2015-07-05 19:50:49)