assembly 从通道3获取数据,并将最少8位发送到端口B

ni65a41a  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(69)

从通道3获取数据,并将最少的8位发送到端口B。
同时将数据从PINC传输到端口D。

  • 预缩放= 32
  • Vref = 5V
  • ADLAR = 1

这是一个与AVR微控制器中的ADC有关的问题。我试着解决它,但我就是不明白如何发送最少8位到端口B。我假设这个过程将涉及使用某种移位或旋转指令?我已经将ADMUX设置为0x63。ADCSRA在转换开始前为0x85,转换开始后为0xC5。
有人能帮我一下吗?

pqwbnv8z

pqwbnv8z1#

ADMUX=0x63设置似乎是正确的。您正在从通道ADC3阅读数据。ADCSRA可以配置两种不同的模式。数据可以在轮询或中断时显示为红色,例如:

轮询

#include <avr/io.h>

int main(void)
{
  // Configure some port for output:
  DDRB = 0xFF;

  // Setup ADC
  // Channel 3
  // Left adjustment
  // 5V reference
  ADMUX = (1<<REFS0) | (1<<ADLAR) | (1<<MUX1) | (1<<MUX0);

  // Enable ADC with prescaler 32
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0);

  while(1)
  {
     // Start single conversion
     ADCSRA |= (1<<ADEN) | (1<<ADSC);
            
     // Wait until conversion is in progress
     while(ADCSRA & (1<<ADSC))
       asm volatile("NOP");
     
     // Not necessary you can only read ADCH
     unsigned char ADC_LOW = ADCL;   // Save ADC LOW value to variable
     unsigned char ADC_HIGH = ADCH;  // Save ADC HIGH value to variable
            
     // Return ADC high value (MSB10:LSB2) to a PORT
     PORTB = ADC_HIGH;
  }
}

中断控制

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(ADC_vect)
{
  PORTB = ADCH;
}

int main(void)
{
  // Configure some port for output:
  DDRB = 0xFF;

  // Setup ADC
  // Channel 3
  // Left adjustment
  // 5V reference
  ADMUX = (1<<REFS0) | (1<<ADLAR) | (1<<MUX1) | (1<<MUX0);

  // Enable ADC with prescaler 32
  ADCSRA = (1<<ADEN) | (1<<ADATE) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS0);

  // Enable interrupts globally
  sei();

  while(1)
  {
  }
}

目前我没有平台来测试代码。

相关问题