我正在尝试使用ADC从电位器读取一个值,然后用它来设置延迟的长度,该延迟将在一定的时间间隔内点亮不同的灯(取决于ADC的输入)。我可能犯了一个简单的错误。到目前为止代码如下:`
`初始化:
LDI R16, HIGH(RAMEND) ;Initializing the r16 register
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, 0xFF
OUT DDRB, R16 ;Initializes port B as output
LDI R16, 0x00
OUT DDRC, R16 ;Initializes port C as an input
LDI R16, 0b00000000; Initialize ADC port and reference voltage
STS ADMUX, R16
startADC:
LDI R16, 0b11000111
STS ADCSRA, R16 ;Begins converstion
KeepPolling:
LDI R16, ADCSRA
SBRS R16, 4 ;Checks if bit is set
RJMP KeepPolling ;If bit is not set, conversion continues
LDS R18, ADCL ;Loads ADCL value onto R16
LDS R16, ADCH ;Readvalue so resistor doesnt lock down
RCALL Green
Green:
MOV R16, R18 ;Load value of ADC to R24
SBI PORTB, 0b00000001 ;Output High to portb
RCALL loop
CBI PORTB, 0b00000001
RCALL Yellow ;Go to yellow if R24 is 0
Yellow:
MOV R16, R18 ;Load value of ADC to R24
LSR R16 ;Divide R24 by 2
SBI PORTB, 0b00000010 ;Output high to port B
CALL loop
CBI PORTB, 0b00000010
RCALL Red
Red:
MOV R16, R18
SBI PORTB, 0b00000011
RCALL loop
CBI PORTB, 0b00000011
RCALL startADC
loop:
MOV R20, R16
outer_loop:
LDI R24, 0
Add_Dec:
ADIW R24, 1
BRNE Add_Dec
DEC R20
BRNE outer_loop
RET任何帮助都将不胜感激。
发布于 2016-08-13 22:58:36
KeepPolling环路的第一行不能读取模数转换器状态寄存器:
LDI R16, ADCSRA也许你需要一个LDS的指导。根据AVR的不同,您也许可以使用SBI指令。
此外,startADC()调用Green(),后者调用Yellow(),后者调用Red(),后者调用startADC()。我想你很快就会用完堆栈空间。
而且,一旦打破了这个无限循环,Yellow()就会调用Red(),然后直接进入Red()。Green()落入Yellow()也是如此。
https://stackoverflow.com/questions/38933869
复制相似问题