Tag: avr

基于ATMega8的计算器使用AVRstudi

关于计算器: 基本上这个计算器用于计算环境温度下铜和铝线的电阻,使用公式R2 = R1 *(1 + alpha(T-25)) 这里R2将是输出,R1将是用户使用4×4矩阵键盘输入的值(包括十进制值,如12.5等),T是温度传感器LM35记录的摄氏度温度。 铜的α=0.0039α,铝= 0.0042 它应该如何工作: 基本上温度将由计算器记录,该计算器将给出输入T.25℃的电阻值将由用户使用键盘输入。 现在键0-9和“。” 用于输入值。 在此之后当用户按下键盘上的“+”时,它应该实现铜的公式并在LCD上显示结果,类似地,当用户按下“ – ”时,它应该实现铝的公式。 让我们暂时保留“*”“/”和“=”按钮作为备用按钮。 进展到现在: 使用我在此附件中发送给您的代码,我能够正确地获得屏幕上的温度,我能够看到R1的值(即25°C时的电阻值)现在我无法弄清楚如何使用这些获取输出的值。 请帮我解决一下这个。 🙂 谢谢和问候,Mohit Goyal #define F_CPU 1000000UL #include #include #include #include #include “lcd.h” #include “lcd.c” #include #define KB_PORT_OUT PORTB #define KB_PORT_IN PINB void port_init(void) { DDRB = 0x0f; //Key-board port, higer nibble – input, lower […]

UART寄存器未调试到终端

这是两个atmega328p控制器之间的UART传输。 我试图通过从接收控制器上的数据结构中打印变量来确认数据是否正确传递。 我的终端没有显示任何信息。 我只能确认从我的LED调用到达代码,我启用了portB。 我很确定我的BAUD率是正确的(51为8mhz)。 同时确信硬件正确连接。 有关如何进一步调试以找到问题的任何建议? 我是AVR开发的新手,所以也许对其他人来说很明显。 传递 #include #include typedef struct { uint8_t data; uint8_t timestamp; } tData; //Waits until bits are set to grab data char readChar() { while (! (UCSR0A & (1 << RXC0)) ); return UDR0; } //Waits until buffer is empty void writeChar(char data) { while(!(UCSR0A & (1<<UDRE0))); UDR0 […]

MicroController上的CRC-32(Atmel)

我目前正在尝试在ATMEGA1280上为传入的数据流(串行通信)实现CRC-32而且我有点迷失在C中的嵌入式端如何执行此操作….如果有人能指出我正确的方向和/或无论如何帮助我会非常感激…

avr睡眠模式并唤醒

我正试图让我的AtTiny 13进入睡眠状态并通过中断将其唤醒。 它确实会睡觉,但它永远不会醒来。 整个代码: #include #include #include #include #define RED (1<<PB4) #define RED_HIGH PORTB |=RED #define RED_LOW PORTB &= ~RED #define RED_TOG PORTB ^= RED #define BUTTON 1<<PB1 volatile static bool is_sleeping; ISR(INT0_vect) { RED_TOG; is_sleeping = true; } int main(void){ GIMSK |= 1<<INT0; MCUCR |= 0<<ISC00 | 1<<ISC01; sei(); DDRB |= RED; DDRB &= […]

avr gcc内联asm变量输入操作数

我希望能够在运行时确定内联asm函数的端口寄存器 asm(“”::”I” (_SFR_IO_ADDR(PORTD))); _SFR_IO_ADDR只接受常量 我找到了这些选项,但似乎无法从变量传递寄存器。 asm(“”::”m” (PORTD)); asm(“”::”n” (&PORTD)); 认为这将是一个常见的问题/请求,但似乎无法找到任何答案

收到一个字符串

如何在uart中接收字符串。 我正在使用avr studio 5和brays终端这样的 和这张图片一样,我使用9600的波特率。我尝试输入”abcdef” ,它只出现”abcf” 。 我的代码是这样的—> #include void serial_init(void) { UBRRH = 0x00; UBRRL = 95; //baudrate 9600 and F_CPU 14745600UL UCSRB = (1 << RXEN) | (1 << TXEN) | (1<<RXCIE); UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0)|(1 << UCSZ1); } unsigned long long Usart_Receive(void) { while((UCSRA & (1 << RXC)) == 0) {}; return UDR; […]

编译时asm中不可能的约束

在我的Atmel ASF项目中,我正在尝试构建以下内联asm代码。 但是我在编译时遇到了不可能的限制。 编译器指向此行__asm__ __volatile__ ,我错过了什么? #define OUTPORT PORTD #define OUTBIT 3 // PD.3 uint8_t rport ,rbits; uint8_t *buf = message; asm volatile( “in __tmp_reg__, __SREG__ \n\t” // 1 Save SREG for later “cli \n\t” // 1 Clear interrupts “in %[rport], %[port] \n\t” // 1 Move PORTB adress to rport : //Outputs [rport] “=&r” (rport) […]

C未定义的参考

我有以下代码: main.c中 #include “checksum.h” void main() { char *Buf =”GPGGA204502.005106.9813N11402.2921W1090.91065.02M-16.27M”; checksum(Buf); } checksum.c #include #include checksum(char *Buff) { int i; unsigned char XOR; unsigned long iLen = strlen(Buff); printf(“Calculating checksum…\n”); for (XOR = 0, i = 0; i < iLen; i++) XOR ^= (unsigned char)Buff[i]; printf("%X \n",XOR); } checksum.h #ifndef CHECKSUM_H_INCLUDED #define CHECKSUM_H_INCLUDED void checksum(char […]

PID反馈和位置控制器,带直流电机/编码器

我很难让PID反馈和定位同时运行。 我计算RPM的想法是: 启动定时器并使用中断计数编码器脉冲。 使用一些简单的数学转换为RPM。 重置变量使用并重新开始。 我可以计算RPM,但之后我只能在计算后调用我的PID控制器(不管我想等多长时间才能获得良好的分辨率。)这会导致代码非常混乱。 是否有更简单的方法或我缺少的东西? 关于我的应用的信息:我正在使用直流电机/双磁编码器对Atmel ATmega328P进行编程,每转约600个脉冲(在齿轮箱之后)。 我想调用GoToTarget(#)并让电机在更新PID参数时转到该位置。 此外,它必须双向进行。

如何在C中为AVR-Studio编写自定义reset()函数?

所以我被分配了为AVR编译编写自定义reset()函数的任务。 我得到了这个信息 – “Atmega128和Pic24e在程序地址0x0处有复位中断。写一个函数reset()来复位程序。我也听说过强制系统重启的一种简单方法就是发送它进入无限循环。 叫我疯了,但这就像写作一样简单: function reset(){ goto 0x00000000; } 不确定你是否可以这样做,而不是寻找一个复杂的解释,因为我很确定这是一个通用的问题。 简短而甜蜜,如果你能:)