我正在尝试修改此代码,以使其适用于Arduino Mega.我对C很陌生,所以我可能犯了一些重大错误.顺便说一下,这是一个自平衡滑板.
这段代码取自ATmega32(来自这里),我试图让它在Arduino Mega上运行.
此代码是为ATmega32开发板编写的.
我做了一些修改(纠正了一些错误),但最后,我遇到了:
在函数'int main()'中:
错误:'int main()的重新定义
这是完整的代码:
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <math.h>
#define CLOCK_SPEED 16000000
#define OCR1_MAX 1023
typedef unsigned char u8;
void set_motor_idle(void);
void InitPorts(void);
float level=0;
float Throttle_pedal;
float aa;
float accelraw;
float x_acc;
float accsum;
float x_accdeg;
float gyrosum;
float gangleratedeg;
float gangleraterads;
float ti = 2.2;
float overallgain;
float gaincontrol;
float batteryvolts = 24;
float gyroangledt;
float angle;
float anglerads;
float balance_torque;
float softstart;
float …Run Code Online (Sandbox Code Playgroud) 我有一些代码需要每2分钟运行一次,看起来很简单.问题似乎是从计时器中触发一个长时间运行的进程导致计时器摇摆不定?有什么建议.
我的C知识不是很好,所以请帮我解决一些基本想法.MCU是Atmel Mega128L
长时间运行的过程是通过Telit GSM设备(通过UART1)的http呼叫,这本身很好用,但需要在主循环中运行,因为它需要监视其他进程.
我正在为atmega168a编写C代码。我attempt to use poisoned "SIG_OUTPUT_COMPARE0A和attempt to use poisoned "SIG_OUTPUT_COMPARE0B我编译下面的代码错误。但是我ISR在http://www.protostack.com/blog/2010/09/timer-interrupts-on-an-atmega168/上看到了类似的功能用法,如果有人可以告诉我我做错了什么,我将不胜感激。我正在使用atmel studio 6.0及其gcc在Windows 7 pc上编译代码。
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iomx8.h>
volatile int new_msg;
volatile int new_msg_available = 0;
volatile int message = 0xFFFF;
int main(void)
{
DDRB = 0xFF;
TIMSK0 = _BV(OCIE0A) | _BV(OCIE0B); // Enable Interrupt TimerCounter0 Compare Match A & B // #define OCIE0A 1... (1<<1);
TCCR0A = _BV(WGM01); // Mode = CTC ... #define WGM01 1 ... mode 2
TCCR0B …Run Code Online (Sandbox Code Playgroud) 我想在ATMEGA32中进行串行通信,我有一个问题:
在异步串行通信中,两者UBRRH和UCSRC寄存器具有相同的位置 我不知道该位置将作为UBRRH哪个条件以及哪些条件,它将充当UCSRC.根据分配给这些寄存器的工作,我需要为每个寄存器提供不同的值
在数据表中,他们已经提到在URSEL两个寄存器之间使用位进行选择,但不知怎的,我没有得到它.
我有一个avr程序,我想使用指向方法的指针.但为什么使用函数指针超过正常调用几乎慢4倍?我该如何加快速度呢?
我有:
void simple_call(){ PORTB |= _BV(1); }
void (*simple)() = &simple_call;
Run Code Online (Sandbox Code Playgroud)
然后如果我用-O3编译并调用:
simple_call()
Run Code Online (Sandbox Code Playgroud)
完成需要250ns.如果我改为打电话:
simple()
Run Code Online (Sandbox Code Playgroud)
完成需要960ns!
我怎样才能让它更快?
如果需要具体说明:我在询问ATmega328P芯片。模拟引脚PortC在该芯片上。
我知道digitalWrite可以使用out和digitalRead使用来完成in。
但是我该怎么办analogRead?? 请解释。我是新来的。
额外:如果您也显示analogWrite(在PWM的意义上),这将很有帮助。
我使用AVR作为微控制器,使用ATMEGA8作为处理器(在微控制器内部).具有微控制器的板有4个LED.我能够刻录程序并点亮LED.但我无法达到特定的目的.
L1 L2 L3 L4
Run Code Online (Sandbox Code Playgroud)
这些是4个LED.在第一轮中,每个LED在3秒的间隙后亮起.最后一个LED(L4)在第一轮之后保持点亮.当第三轮开始时,每个LED以3秒的间隙点亮,当L4也是L3时,L3保持点亮照明,它继续......直到L1.
L1 L2 L3 L4
On
On On
On On On
On On On On
Run Code Online (Sandbox Code Playgroud)
但我无法做到这一点.因为我设置一个LED ON其他关闭.我甚至尝试添加一个小的时间间隔为10毫秒.我该怎么做呢 ?这就是我现在所拥有的:
#include<avr/io.h>
#include<util/delay.h>
DDRB = 0xFF; // input
//PORTB = 0xFF;
// ob00011110 --> on all --> binary
int i=0;
while(i<1) {
PORTB = 0b00010000; // first led on
_delay_ms(3000);
PORTB = 0b00001000; // second led on
_delay_ms(3000);
PORTB = 0b00000100; // third on
_delay_ms(3000);
PORTB = 0b00000010; // fourth on
_delay_ms(3000);
i += …Run Code Online (Sandbox Code Playgroud) 我正在编程微控制器atmega168(8位).
我想做的事情如下:
float A = cos(- (2/3) * M_PI);
Run Code Online (Sandbox Code Playgroud)
当然包括math.h(#define M_PI 3.14159265358979323846)
结果,而不是-0.5,我得到1.
我使用串行通信检查结果到我的电脑,我确信它也适用于浮点数,因为如果我设置
A= -0.50;
Run Code Online (Sandbox Code Playgroud)
我收到了正确的结果.
PS.我不能使用双...也因为我没有看到这样做的原因
请帮帮我!
请帮忙.我的程序只运行一次while循环:(
我不知道问题是什么.我在python中编写了同样的东西,并且在那里工作得很好.
我是C的初学者,我正在使用Atmel的AtMega8微处理器.
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
DDRD = 0xFF;
int world[9];
int nextworld[9];
//from 1 to 8
//some random start values
world[1] = 1;
world[2] = 1;
world[3] = 1;
world[6] = 1;
world[7] = 1;
world[8] = 1;
for (int i = 0; i < 9; i++) {
nextworld[i] = world[i];
}
int binworld = 0;
int tiles = 0;
//=============================
if (world[1] == 1) {
binworld = binworld + 128;
} …Run Code Online (Sandbox Code Playgroud) 该线定义了avr微控制器中DDRD寄存器的地址
#define myDDRD *((volatile unsigned char* const) 0x31)
Run Code Online (Sandbox Code Playgroud)
你能澄清一下如何在上面的行中使用指针吗?为什么我们需要第一个星号?不应该第二个足以指向地址0x31?
我不确定在专门分配变量时是否会发生这种情况,但是在调试汇编代码时,编译器会RJMP $+0000在挂起程序的地方执行。
编辑:如果相关,我添加了包含的库
#define __DELAY_BACKWARD_COMPATIBLE__
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/delay.h>
#include <stdint.h>
void ReadTemp(uint8_t address){
ADCSRA = ADCSRA | 0b10000111; //enable ADC, CLK/128 conversion speed
ADMUX = ADMUX | 0b01000000; //Use internal 2.56V Vref and PA0 as input, right-hand justified
ADCSRA |= (1 << ADSC); //start conversion
while(!(ADCSRA & (1 << ADIF))) {} // wait until process is finished;
uint8_t low_value = ADC & 0x00FF;
// or low_value = ADCL;
uint8_t high_value = ADC & 0xFF00; …Run Code Online (Sandbox Code Playgroud) 我一直在尝试通过按下相应的按钮来让我的 Arduino 上的 LED 亮起和熄灭。
我正在使用中断来实现它并且按钮按下确实被注册,但由于某种原因它没有改变全局变量的值(int button_pressed1,...);
应该发生的是,当我按下按钮 1 时,LED 1 应该亮起和熄灭,与按钮 2 和按钮 3 相同。
我真的很感谢你看一看,中断对我来说很新,所以这可能是一个小问题。<3
*我省略了按钮 2 和 3 的代码。如果我能让 LED 点亮按钮 1,我就能让它们点亮其他按钮。
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"
#define LED_DDR DDRB
#define LED_PORT PORTB
#define BUTTON_DDR DDRC
#define BUTTON_PORT PORTC
#define BUTTON_PIN PINC
int button_pressed1 = 0; //globale variabele to turn on functions
ISR(PCINT1_vect)
{
if (bit_is_clear(BUTTON_PIN, PC1))
{
_delay_us(500); //debounce
if (bit_is_clear(BUTTON_PIN, PC1))
{
button_pressed1 = 1;
printf("button 1 pressed\n");
}
}
}
int …Run Code Online (Sandbox Code Playgroud) 我试图使用if语句在Arduino Uno板上使用C控制电机.但是,当我设置为当传感器的PIN等于0时,电机将运行,它根本不起作用.我也尝试将PIN设置为不等于0和1,两者都正常工作.你们可以给它一张支票吗?非常感谢你.
int MotorL=11;
int DirectionR=12;
int MotorR=10;
int DirectionL=13;
int SensorM=0;
#include <avr/io.h>
#include <util/delay.h>
void setup() {
pinMode(DirectionL,OUTPUT);
pinMode(DirectionR,OUTPUT);
pinMode(SensorM,INPUT);
digitalWrite(DirectionL,HIGH);
digitalWrite(DirectionR,HIGH);
analogWrite(MotorL,0);
analogWrite(MotorR,0);
}
void loop() {
if(PIND &_BV(PD6)==0){ //General movement: forward
analogWrite(MotorL,84);
analogWrite(MotorR,97);
}else{
analogWrite(MotorL,0);
analogWrite(MotorR,0);
}
}
Run Code Online (Sandbox Code Playgroud)