Сборка датчика освещенности в Ардуино - PullRequest
0 голосов
/ 25 мая 2018

Я делаю проект автоматизации дома с Ardoino UNO.Мне нужно использовать датчик освещенности, однако, поскольку в сборке нет функции аналога READ (), я должен ее запрограммировать.Я уже читал документацию AVR и Atmel об АЦП, MUX и его выборе, но мне не ясно, как он запрограммирован или как он работает.

Я мог бы использовать объяснение следующего кода, который былпереданный мне коллегой, который говорит мне, что значения определенного PIN-кода хранятся в ADCL и ADCH.У меня вопрос, не будет ли кто-нибудь так любезно объяснить мне код и то, что происходит в ADC MUX.Это 328p

.equ F_CPU = 16000000;
.DEF rmp = R16 
.DEF tmp = R17
.DEF tmp2 = R18
.DEF reg1 = r20 
.DEF reg2 = r21
.EQU ALFA=250
.DSEG
.ORG  0X0100
.CSEG

.ORG $0000

jmp Main 

Main:

ldi rmp, HIGH(RAMEND) ; Init MSB stack
out SPH,rmp
ldi rmp, LOW(RAMEND) ; Init LSB stack
out SPL,rmp
; Init Port B
ldi rmp,0xff ; DIRECCION DEL Port B
out DDRB,rmp
rcall ad ; Call ADC Initialization
; [Add all other init routines here]
ldi rmp,1<<SE ; 
out MCUCR,rmp
sei 

Loop:

rcall adcRead
out PORTB,r18
rjmp loop ; go back to loop

ad: 

ldi rmp, (1<<REFS0) 
sts ADMUX, rmp 
ldi rmp, (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
sts ADCSRA, rmp 
ret 

adcRead: 

lds rmp, ADCSRA    
ori rmp, (1<<ADSC) 
sts ADCSRA, rmp    

loopx:

lds  rmp, ADCSRA
sbrc rmp,ADSC
rjmp loopx     
lds r17,ADCL 
lds r18,ADCH 
ret

1 Ответ

0 голосов
/ 26 мая 2018

Аналого-цифровой преобразователь запускается установкой бита ADSC (ADc Start Conversion) в регистре управления ADCSRA на 1. Это делается линиями

    lds rmp, ADCSRA
    ori rmp, (1<<ADSC)
    sts ADCSRA, rmp

.бит остается на 1, пока происходит преобразование.Как только преобразование выполнено, АЦП устанавливает бит в 0, чтобы обозначить этот факт.

Затем программа проверяет этот бит, чтобы узнать, когда преобразование завершено.Это цель цикла loopx:

loopx:                ; start of loop
    lds  rmp, ADCSRA  ; load ADCSRA into register rmp
    sbrc rmp, ADSC    ; conditionnally skip next instruction
    rjmp loopx        ; jump back to the start of the loop

Инструкция sbrc (Пропустить, если бит в регистре сброшен) проверяет бит 6 (это значение ADSC) регистра rmp,Если этот бит равен нулю, он пропускает следующую инструкцию rjmp, тем самым выходя из цикла.Таким образом, цикл завершается, когда преобразование АЦП завершено.

Может быть несколько причин, по которым это не работает в вашей настройке.Если вы используете эмулятор, возможно, он неправильно эмулирует работу АЦП.Затем, если вы установите бит ADSC в 1, он останется равным 1, что делает цикл бесконечным.

Другая возможность состоит в том, что вы не подождали достаточно долго.Первое преобразование после включения АЦП занимает 3200 циклов ЦП с вашими настройками.Это 640 итераций цикла.Если вы выполняете отдельные шаги в отладчике, это может быть слишком долго для вашего терпения.

...