2016-08-13 4 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 

어떤 도움을 이해할 수있을 것이다.

LDI R16, ADCSRA 

어쩌면 당신이 거기 LDS 명령을 원하는 :

답변

1

KeepPolling 루프의 첫 번째 줄은 하지는 ADC의 상태 레지스터를 읽을 않습니다. AVR에 따라 SBI 명령을 사용할 수 있습니다.

또한, startADC()를 호출 Red() 호출 Yellow() 호출 startADC() 전화 Green(). 나는 당신이 꽤 빨리 스택 공간을 다 써 버릴 것이라고 생각한다.

또한 무한 루프를 깨면 Yellow()Red()으로 전화를 걸어 Red()으로 바로 이어집니다. Green()Yellow()으로 떨어지는 것과 같습니다.

+0

스택 공간이 부족하지 않도록 코드를 어떻게 변경할 수 있습니까? 그리고 당신이 당신의 코멘트의 마지막 부분에 대해 자세히 설명해 주실 수 있습니까? 감사 – HerculesDev

관련 문제