2016-08-13 5 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()を呼び出しRed()呼び出すYellow()呼び出すstartADC()通話Green()。私はあなたがかなり速くスタックスペースを使い果たすだろうと思う。

さらに、この無限ループを解除すると、Yellow()Red()を呼び出してからRed()に直接進みます。 Green()Yellow()に該当するのと同じです。

+0

スタックスペースが不足しないようにコードを変更するにはどうすればよいですか?そしてあなたのコメントの最後の部分を詳しく説明できますか?その意味を理解していないのですか?ありがとう – HerculesDev

関連する問題