2016-08-13 97 views
0

我试图从电位器读取一个使用ADC的值,然后用它来设置我的延迟时间长度,这将在不同的时间间隔点亮不同的灯光(取决于输入来自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 

任何帮助将不胜感激。

回答

1

的KeepPolling循环的第一行不读取ADC状态寄存器:

LDI R16, ADCSRA 

也许你想要一个LDS指令有。根据AVR的不同,您可能可以使用SBI指令。

另外,startADC()调用Green(),其调用Yellow(),其调用Red(),其调用startADC()。我想你会很快耗尽堆栈空间。

此外,一旦你打破了无限循环,Yellow()调用Red(),然后直接进入Red()。与Green()相同,落入Yellow()

+0

我怎么可能改变代码,以便没有用完堆栈空间?你能否详细说明你评论的最后一部分,不太清楚我的理解是什么意思?谢谢 – HerculesDev