Atmega328p ADC组件无法转换

时间:2014-11-22 15:40:28

标签: assembly avr adc

这是我的代码。我需要在电路板上放一个上拉电阻,因此INT0标志会将我发送到转换,然后在PORTB上打印。我在PC0上使用ADC0但它无法正常工作。 PORTB上只打印了一个值。你能救我吗?

.include "m328pdef.inc"
.org 0x0000 jmp startProgram
.org 0x0002 jmp int0_int
.org 0x002A jmp adcComplete

startProgram:
    .org 0x0033

// Configuracion de Stack Pointer y Timer0
ldi R16, High(RAMEND)
out SPH, R16
ldi R16, Low(RAMEND)
out SPL, R16

// Configuracion INT0
ldi r16,    0x02
sts EICRA,  R16
ldi r16,    0x01
out EIMSK,  R16
sts EIFR,   R16

// Configuracion del ADC
ldi R16,    0x60
sts ADMUX,  R16
ldi r16,    0xFF
sts ADCSRA, R16
ldi r16,    0x02
sts ADCSRB, R16
ldi r16,    0x01
sts DIDR0,  R16
SEI

// Inicializando Puerto B
ldi R16,    0xFF
out DDRB,   R16
ldi R16,    0x04
out DDRD,   R16

// Rutina de espera del ADC
loop:
    rjmp loop

int0_int:
    reti

adcComplete:
    lds  R16, ADCH
    cpi  R16, 63
    brlo low_adc
    cpi  R16, 127
    brlo med_adc
    cpi  R16, 191
    brlo high_adc
    cpi  R16, 191
    brsh full_adc
    reti

low_adc:
    ldi R17,    0xFF
    out PORTB,  R17
    reti

med_adc:
    ldi R17,    0x3F
    out PORTB,  R17
    reti

high_adc:
    ldi R17,    0x0F
    out PORTB,  R17
    reti

full_adc:
    ldi R17,    0x03
    out PORTB,  R17
    reti

1 个答案:

答案 0 :(得分:0)

我认为sts EIFR, R16实际应该是out EIFR, R16

然后,您将PORTD.2(INT0)配置为输出,这会使其变为0并保持在那里。没有边沿,没有INT0,没有ADC触发器。

如果您有外部上拉使用

ldi R16,    0x00
out DDRD,   R16
out PIND,   R16

使用内部上拉使用

ldi R16,    0x00
out DDRD,   R16
ldi R16,    (1<<2)
out PIND,   R16