Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >是否可以将16位值与8位比较匹配ISR进行比较

是否可以将16位值与8位比较匹配ISR进行比较
EN

Stack Overflow用户
提问于 2015-06-10 12:46:36
回答 1查看 181关注 0票数 1

我正在尝试制作一个比ATtiny85 8位定时器/计数器具有更高分辨率的伺服控制器。到目前为止,我已经在21‘000µs的时间范围内在我的伺服上获得了大约2000个位置(1µs/step)。我还设法以不同的速度顺序移动了5个伺服,但现在我想同步移动它们。

我最大的问题是我不知道该怎么做!我已经查看了包括servo8bit库在内的其他伺服代码,并试图找到一种方法。似乎大多数示例都使用比较匹配ISR来“同时”移动伺服,我的问题是我想要比较一个16位整数。

有没有办法让我可以使用8位比较匹配ISR和我的16位整数?或者你们谁有其他的建议,关于如何在不使用compare match ISR的情况下同步移动我的伺服?

我希望我的问题有意义!

由于我实际上还没有任何代码可供显示(只有有缺陷的尝试,而不进行比较,这没有任何意义),所以如果有帮助,我会将链接发布到我的TinyServo代码。

编辑1:

这是我提到的代码的一部分,第一次没有发布:

代码语言:javascript
代码运行次数:0
复制
void servoMove(void)
{   
uint16_t nextPulse = hPulse[0];

timerSetup ();      //16-bit setup for counter

for (i = 0; i < sizeof(servo)/sizeof(servo[0]); i++)
{
    if ( (oTime > nextPulse) && (channel < sizeof(servo)/sizeof(servo[0])) )        //check if HIGH pulse (pos) is done
    {
        PORTB &= ~(1 << servo[channel]);

        if (i+1 < sizeof(hPulse)/sizeof(hPulse[0]))
        {
            nextPulse += hPulse[i+1];
        }

        channel++;
    }

    else
    {
        channel = 0;

        oTime = 0;      //resets 16-bit variable
        tot_overflow = 0;       //resets tot_overflow variable  
        TIFR |= (1 << TOV1);        // clear counter1 overflow-flag
        TCNT1 = 0;      //resets Timer/Counter1 
    }

}

for (i = 0; i < sizeof(servo)/sizeof(servo[0]); i++)
{
    if ( (oTime > tPulse - nextPulse) && (channel < sizeof(servo)/sizeof(servo[0]))   )         //check if LOW pulse (period) is done 
    {   
        PORTB |= (1 << servo[channel]);
        nextPulse -= hPulse[i];
        channel++;  
    }

}

}


void servoPosSet(volatile uint16_t pos[], uint8_t size)
{
     for (i = 0; i < size; i++)
     {
        hPulse[i] = pos[i];
     }

}


int main(void)
{       
TCCR1 |= (1 << CS12);   //set Timer/Counter1 prescaler to increment every 1 µs (PCK/8)

for (channel = 0; channel < size); channel++)
{
    DDRB |= (1 << servo[channel]);  //sets PB0-PB4 as output pins
}

channel = 0;

uint16_t pos[] = {2000, 1500, 1900, 1300, 1700};
uint8_t size = 5;

while(1)        
{
        servoPosSet(pos);

        servoMove();
}

}

编辑2:

这是我认为代码应该如何工作的一个例子:

...but它不会!

EN

回答 1

Stack Overflow用户

发布于 2015-06-15 12:30:52

如果您在脉冲期间没有其他事情可做,您可以使用忙循环而不是中断:

代码语言:javascript
代码运行次数:0
复制
#include <avr/io.h>
#include <util/delay_basic.h>

/* Send a pulse of width = 4*count cycles. */
void pulse(uint16_t count, uint8_t channel)
{
    uint8_t mask     = 1 << channel,
            old_port = PORTB,
            high     = old_port | mask,
            low      = old_port & ~mask;

    PORTB = high;
    _delay_loop_2(count);
    PORTB = low;
}

这将为您提供4个时钟周期的分辨率,或8 MHz时钟的0.5µs分辨率。

向5个伺服系统发送脉冲最多需要10毫秒。由于您每21毫秒重复一次脉冲序列,因此您只剩下11毫秒来计算下一组位置,这应该是足够的。你可以设置一个计时器,让你每隔21秒叫醒你一次,然后你的main()可能看起来像这样:

代码语言:javascript
代码运行次数:0
复制
int main(void)
{
    static uint16_t pos[] = {4000, 3000, 3800, 2600, 3400};
    uint8_t i;

    /* Wake up every 21 ms. */
    setup_timer();
    sleep_enable();

    for (;;) {
        /* Update the servos. */
        for (i = 0; i < 5; i++) pulse(pos[i], i);

        /* Compute the next set of positions. */
        ...

        /* Wait for timer interrupt. */
        sleep_cpu();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30756790

复制
相关文章
go 中 struct 是否可以比较?
今天来水一篇,最近比较忙,一直没有时间写 go 相关的,今天从一个小问题入手,来说说 struct 的比较问题。
LinkinStar
2022/09/01
8400
[Go] 结构体/结构体指针是否可以比较 与 operator == is not defined 错误
如果结构体的所有成员变量都是可比较的,那么结构体就可比较 如果结构体中存在不可比较的成员变量,那么结构体就不能比较
唯一Chat
2021/04/30
8400
[Go] 结构体/结构体指针是否可以比较 与 operator == is not defined 错误
DTO与值对象和POJO比较
本文想澄清DTO与Value Object与POCO的区别,其中DTO代表数据传输对象,而POCO是Plain Old CLR Object,在Java环境中也称为POJO。
lyb-geek
2018/12/24
2.2K0
如何对矩阵中的所有值进行比较?
需求相对比较明确,就是在矩阵中显示的值,需要进行整体比较,而不是单个字段值直接进行的比较。如图1所示,确认矩阵中最大值或者最小值。
逍遥之
2020/05/14
7.7K0
java Integer值比较
所有相同类型的包装类对象之间的值比较,应该使用equals方法比较。 –来自阿里巴巴java开发手册。 先看个简单实例: public static void main(String[] args)throws Exception{ Integer a = -121; Integer b = -121; Integer c = 345; Integer d = 345; System.out.println(a
IT云清
2019/01/22
1.8K0
利用反射比较两个对象字段值是否相等
import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;import org.apache.log4j.Logger;public class DomainEquals { /** * 日志操作类 */ private static Logger logger = Logger.getLogger(Domain
java达人
2018/01/31
3.6K0
ug与solidworks比较_如何比较
UG是想做什么就做什么,SW是能做什么就做什么。 SW无时不在向使用者表达这样一个信息:花这点钱,能用就行呗,要什么自行车。。
全栈程序员站长
2022/09/20
2.7K0
FreeMarker与JSP 2.0 + JSTL组合进行比较
FreeMarker与JSP 2.0 + JSTL组合进行比较。 FreeMarker优点: FreeMarker不受Servlet或网络/ Web的限制; 它只是一个类库通过将模板与Java对象(数据模型)合并来生成文本输出。您可以随时随地执行模板; 没有HTTP请求转发或类似的技巧,根本不需要Servlet环境。因此,您可以轻松地将其集成到任何系统中。 更简洁的语法 考虑这个JSP(假设 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jst
cfs
2018/03/08
5.5K0
==比较地址,equals比较值?错了!!【一文搞懂== 与equals 的底层区别】
最近有位小伙伴去一家互联网公司面试,结果被问:“你是如何理解==与equals的?” 他支支吾吾半天没回答到重点。结果可想而知了~~~
小黑同学
2022/05/10
8740
==比较地址,equals比较值?错了!!【一文搞懂== 与equals 的底层区别】
js原始值与对象的相等比较
let a = []; let b = “0”; // 1 console.log(a0); // true // 2 console.log(a!a);// true // 3 console.log(ab); // false // 4 console.log(b0); // true
马克社区
2022/07/01
2.2K0
String类型数字与Integer最大值比较[通俗易懂]
将String类型数字转为Integer类型时需要先判断范围是否超过Integer最大值,否则会报异常
全栈程序员站长
2022/10/04
7670
[Go] golang中接口值(interface)与nil比较或指针类型之间比较的注意问题
注意问题 , 当对interface变量进行判断是否为nil时 , 只有当动态类型和动态值都是nil , 这个变量才是nil
唯一Chat
2021/01/21
1.9K0
关于 Integer 值比较的问题
今天刚好遇到这样的问题,别的不说,先上代码 public class TestInteger { public static void main(final String[] args) { final Integer a = 500; final Integer b = 500; final Integer c = 100; final Integer d = 100; System.out.println("a=b
Dato
2018/04/17
1.2K0
整型包装类值的比较
当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的 Integer 对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。
黑洞代码
2021/01/14
1.2K0
整型包装类值的比较
当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的 Integer 对象缓存起来,
Vincent-yuan
2021/03/12
9740
Java字符串值比较
1 首先应该注意到作为成员变量的 name 是使用字面量直接赋值的 ( private String name ="abc"; ) 这种赋值的执行过程是先看字符串常量池中有没有 value 数组为 ['a', 'b', 'c'] 的 String 对象,如果没有的话就创建一个,有的话就拿到他的一个引用。
joshua317
2022/03/25
1.2K0
Java字符串值比较
ArrayList与Vector比较
这张图里的内容对我们学习Java来说,非常的重要,白色的部分是需要去了解的,黄色部分是我们要去重点了解的,不但要知道怎么去用,至少还需要读一次源码。绿色部分内容已经很少用了,但在面试题中有可能会问到,我们来看一个经常出现的面试题:Arraylist与Vector的区别是什么?
JavaEdge
2022/11/29
2580
ArrayList与Vector比较
Kafka与Redis比较
转一篇比较Kafa与Redis的文章,从日志聚合分析了二者的性能。 《Kafka vs. Redis: Log Aggregation Capabilities and Performance》
SeanCheney
2018/04/24
1.1K0
Kafka与Redis比较
MariaDB与MySQL比较
在MariaDB中,有如下针对MariaDB与MySQL两种数据库比较的官方说法:
从大数据到人工智能
2022/02/28
3.5K0
Java比较两个对象中属性值是否相同【使用反射实现】
在工作中,有些场景下,我们需要对比两个完全一样对象的属性值是否相等。比如接口替换的时候,需要比较新老接口在相同情况下返回的数据是否相同。这个时候,我们怎么处理呢?这里凯哥就使用Java的反射类实现。
凯哥Java
2022/12/16
3.6K0

相似问题

是否可以将Enum值与'if‘语句进行比较?

20

与0进行比较与与值进行比较是否更快?

145

是否可以将if语句与语句或for循环进行比较和比较?

34

对象深度比较是否可以与Spock框架进行比较?

41

是否可以将“in”子句中的值与多列进行比较?

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文