我在将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)超低运行功耗探索