【问题标题】:Atmel Studio AtTiny104 - Simple codeAtmel Studio AtTiny104 - 简单代码
【发布时间】:2016-05-21 10:04:30
【问题描述】:

我是 C 编程的初学者,对以下代码有一些问题:

我的项目很简单: 当输入 i2 高或 i3 高或 i4(模拟值)

我的代码:

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "iomacros.h"

int main(void) {

    // Change to 8MHz clock speed (Clock Division = 1)
    CCP = 0xD8;
    CLKPSR = 0x00;

    // Define pins
    #define OUTPUT_1 1,A
    #define INPUT_1 2,A
    #define INPUT_2 3,A
    #define INPUT_3 4,A

    // Set up the ADC
    ADCSRA |= (1 << ADEN) | (1 << ADPS2); // Enable ADC = 16
    ADMUX |= (1 << MUX1) | (1 << MUX0); // Connect ADC3 input on PA6
    DIDR0 |= (1 << ADC3D); // Power saving feature

    out(OUTPUT_1); // set OUTPUT_1 as an output

    inp(INPUT_1); // set INPUT_1 as an input
    pullup(INPUT_1); // activate pullup for INPUT_1

    inp(INPUT_2); // set INPUT_1 as an input
    pullup(INPUT_2); // activate pullup for INPUT_2

    inp(INPUT_3); // set INPUT_1 as an input
    pullup(INPUT_3); // activate pullup for INPUT_3
    on(OUTPUT_1);

    // forever loop
    while (1) {

        ADCSRA |= (1 << ADSC); // start single conversion
        while (ADCSRA & (1 << ADSC)) {} // wait until conversion is done
        uint16_t INPUT_4 = ADCL | (ADCH << 8); // Store in INPUT_4

        if (get(INPUT_2) == 1 || get(INPUT_3) == 1 || INPUT_4 > 800) {
            on(OUTPUT_1);
            } else {
            if (get(INPUT_1) == 1) {
                off(OUTPUT_1);
                } else {
                on(OUTPUT_1);
            }
        }
        _delay_ms(100);
    }

}

由于某种原因,即使 (get(INPUT_2) == 1 || get(INPUT_3) == 1 || INPUT_4 > 800) 为真,i1 也会在高电平时禁用 o1。一些帮助表示赞赏。谢谢!

【问题讨论】:

  • Shtap 与复合布尔表达式。对'get(INPUT_2) == 1'等的结果使用临时布尔值。然后在你的if语句中将临时值放在一起。然后在你的调试器下运行。然后看看哪个布尔值/s是/是不应该的。

标签: c input output adc atmelstudio


【解决方案1】:

此行中缺少括号:

如果 (get(INPUT_1)==1{

应该是:

如果 (get(INPUT_1)==1){

你的代码没有正确缩进,错误不容易被发现。

【讨论】:

  • 我很惊讶它编译:(
  • 这是代码的最后一次迭代,但我忘记添加括号了,在我在这里发布代码之前,括号就在那里,并且代码编译时没有错误或警告,我可以闪烁它.问题是即使 i2,i3,i4 很高,如果 i1 很高,i1 仍然会禁用 o1
  • 还有你会推荐什么样的方法。此设置每天将运行近 20 小时
  • 我也是。使用正确的编辑器应该可以正确缩进并消除大部分错误。
  • 有一个奇怪的行为,代码忽略 if (get(INPUT_2) == 1 || get(INPUT_3) == 1 || INPUT_4 > 800) 条件即使所有都为真(高)并跳转到 else
猜你喜欢
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多