Skip to content

Update directADC #43

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 22, 2020
Merged

Update directADC #43

merged 1 commit into from
May 22, 2020

Conversation

VitSh7
Copy link
Contributor

@VitSh7 VitSh7 commented May 18, 2020

Основные изменения

  • Добавлена возможность поменять разрешение АЦП на 8-битное. Новые функции:
    • ADC_setResolution(uint8_t res) - выбрать разрешение 10 или 8 бит;
    • ADC_read8(void) - возвращает 8-битный результат;
    • ADC_read8WhenAvailable(void) - дождаться окончания и вернуть 8-битный результат.
  • Изменена склейка ADCL | (ADCH << 8) на ADC.

Комментарии
Для полного раскрытия возможностей АЦП атмеги328 необходимо все же добавить 8-битное разрешение, которое довольно юзабельно при высокой скорости оцифровки, для отсечения лишних шумов или более быстрой и емкой обработки результата (с 1 байтом попроще работать).

В оригинальной библиотеке результат АЦП возвращается как ADCL | (ADCH << 8) , что на самом деле лишнее и добавляет пару лишних ассемблерных команд. Для доступа к результату АЦП оптимальнее использовать ADC. Для сравнения привел ниже ассемблерный код с записью результата АЦП в переменную x.

x=ADCL | (ADCH << 8); 
000004B0  LDS R24,0x0078	Load direct from data space 
000004B2  LDS R18,0x0079	Load direct from data space 
000004B4  LDI R25,0x00		Load immediate 
000004B5  OR R25,R18		Logical OR
00000086  STS 0x0123,R25	Store direct to data space 
00000088  STS 0x0122,R24	Store direct to data space 

x=ADC; 
000004B0  LDS R24,0x0078		Load direct from data space 
000004B2  LDS R25,0x0079		Load direct from data space
00000086  STS 0x0123,R25		Store direct to data space 
00000088  STS 0x0122,R24		Store direct to data space

Добавлена возможность поменять разрешение АЦП на 8-битное. Новые функции:
ADC_setResolution(uint8_t res) - Выбрать разрешение 10 или 8;
ADC_read8(void) - возвращает 8-битный результат;
ADC_read8WhenAvailable(void) - дождаться окончания и вернуть 8-битный результат.

Изменена склейка ADCL | (ADCH << 8) на ADC.
@AlexGyver AlexGyver merged commit 77b41af into AlexGyver:master May 22, 2020
@AlexGyver
Copy link
Owner

Спасибо! Закоммитил

@VitSh7
Copy link
Contributor Author

VitSh7 commented May 22, 2020

По поводу чтения ADC регистра, я, к сожалению, все библиотеки не просмотрел, но в парочке тоже заметил чтение ADCH и ADCL по отдельности и последующую "склейку". Желательно бы пофиксить, хотя бы там, где наиболее важна скорость чтения, например в GyverCore. ADC регистр можно прочитать напрямую как x=ADC ( работает для avr-gcc комплитора) или x=ADCW (работает еще и для других компиляторов, но нас интересует только avr-gcc, поэтому это на всякий случай).

Если хочешь, могу взяться за это дело.

P.S. Странно, что даже в оригинальном ядре ардуины используют эту "склейку", может в этом есть какой-то сакральный смысл? или это все же просто недочет?

@AlexGyver
Copy link
Owner

Я думаю это недочёт или "шобы везде работало". Я в своем коде всегда использую сдвоенные регистры, а эту либу коллега писал, и часть с io в ядре тоже его работа)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants