Здравствуйте! Нужно реализовать АЦП на atmega8535.
Здравствуйте! Нужно реализовать АЦП на atmega8535.
Два канала: ADC0 и ADC7, АЦП пятиразрядное. На индикатор выводится сумма показаний двух каналов в восьмиричной системе счисления. Вот сама программа, но в ней где-то загвоздка, мешающая правильно работать. Помогите, пожалуйста.
.include "m8535def.inc" ; Подключить файл описаний, имён регистров портов ввода/вывода
.cseg
.org 0
rjmp reset
.org $00E
rjmp inADC_0 ;Вектор прерывания АЦП
.org $080
.org $100 ;Адрес начала программы
reset:
;Установка стека
ldi r16,low(RAMEND)
out spl,r16
ldi r16,high(RAMEND)
out sph,r16
;Установка портов: А на вход, С,D на выход
clr r16
out DDRA,r16
out PORTA,r16 ;подтягивающие резисторы порта А
ldi r16,0xFF
out DDRD,r16
out DDRC,r16
;Установка регистров
ldi r17,0b00100000 ;R17-Выравниваение по левому краю,ADC0
ldi r18,0b00100111 ;R18-Выравниваение по левому краю,ADC7
ldi r24,0x00
clr r25
ldi r31,0x02 ;R31-для флеш памяти
;Инициализация АЦП
out ADMUX,r17
ldi r16,0b11001111 ;Инициализация АЦП:разрешение и запуск
out ADCSRA,r16 ;циклического преобразования с предделителем 16
sei ;Общее разрешение прерываний
main:
rjmp main
inADC_0: ;Прерывание АЦП
ldi r16,0b11001111
out ADCSRA,r16 ;с предделителем 16
cpi r24,0x01 ;Поочередно считываем показания то с ADC0(*),
breq inADC_7 ;Перейти, если равно
inc r24 ;Счетчик
out ADMUX,r17 ;из регистра r17 - в первый канал АЦП
in r19,ADCL
in r19,ADCH ;Записываем показания с 1 потенциометра в R19
lsr r19 ;сдвигаем вправо на 3, чтобы получить 5 разрядов
lsr r19
lsr r19
andi r19,0b00011111
; mov r21,r19
;rjmp m1
reti ;Возврат из прерывания
inADC_7: ;(*)то с ADC7
clr r24 ;обнуляем cчетчик
out ADMUX,r18 ;из регистра r18 - вo второй канал АЦП
in r20,ADCL
in r20,ADCH ;Записываем показания со 2 потенциометра в R20
lsr r20 ;сдвигаем вправо на 3, чтобы получить 5 разрядов
lsr r20
lsr r20
andi r20,0b00011111
rjmp m1
m1:
mov r22,r19 ;Содержимое r19-и r22
add r22,r20 ;Считаем сумму показаний, результат записываем в R22
andi r22,0b00011111
odin:
mov r26,r22 ; перемещаем результат вычисления в r26
cpi r25,0x00 ; счетчик равен 0?
brne dva ; если нет, переходим на индикацию второй цифры
andi r26,0x07 ; маска (оставляем 3 младших бита)
mov r30,r26 ; перемещаем результат в r30
lpm ; берем значение цифры
out PORTD,r0 ;выводим его
ldi r23,0x01
out PORTC,r23 ;на первый индикатор
inc r25 ; инкрементируем счетчик
clr r26
clr r30
reti
dva:
cpi r25,0x01 ;счетчик равен 1?
mov r26,r22 ;перемещаем результат вычисления в r26
lsr r26 ;сдвигаем результат на 3 бита вправо
lsr r26 ;тем самым делим его на 8
lsr r26
andi r26,0x07 ;оставляем только 3 младших бита
mov r30,r26 ;перемещаем результат в r30
lpm ;берем значение цифры
out PORTD,r0 ;выводим его
ldi r23,0x02
out PORTC,r23 ;на второй индикатор
clr r25 ;обнуляем счетчик
reti
.db 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07 ;заполняем флеш (0...7)
.include "m8535def.inc" ; Подключить файл описаний, имён регистров портов ввода/вывода
.cseg
.org 0
rjmp reset
.org $00E
rjmp inADC_0 ;Вектор прерывания АЦП
.org $080
.org $100 ;Адрес начала программы
reset:
;Установка стека
ldi r16,low(RAMEND)
out spl,r16
ldi r16,high(RAMEND)
out sph,r16
;Установка портов: А на вход, С,D на выход
clr r16
out DDRA,r16
out PORTA,r16 ;подтягивающие резисторы порта А
ldi r16,0xFF
out DDRD,r16
out DDRC,r16
;Установка регистров
ldi r17,0b00100000 ;R17-Выравниваение по левому краю,ADC0
ldi r18,0b00100111 ;R18-Выравниваение по левому краю,ADC7
ldi r24,0x00
clr r25
ldi r31,0x02 ;R31-для флеш памяти
;Инициализация АЦП
out ADMUX,r17
ldi r16,0b11001111 ;Инициализация АЦП:разрешение и запуск
out ADCSRA,r16 ;циклического преобразования с предделителем 16
sei ;Общее разрешение прерываний
main:
rjmp main
inADC_0: ;Прерывание АЦП
ldi r16,0b11001111
out ADCSRA,r16 ;с предделителем 16
cpi r24,0x01 ;Поочередно считываем показания то с ADC0(*),
breq inADC_7 ;Перейти, если равно
inc r24 ;Счетчик
out ADMUX,r17 ;из регистра r17 - в первый канал АЦП
in r19,ADCL
in r19,ADCH ;Записываем показания с 1 потенциометра в R19
lsr r19 ;сдвигаем вправо на 3, чтобы получить 5 разрядов
lsr r19
lsr r19
andi r19,0b00011111
; mov r21,r19
;rjmp m1
reti ;Возврат из прерывания
inADC_7: ;(*)то с ADC7
clr r24 ;обнуляем cчетчик
out ADMUX,r18 ;из регистра r18 - вo второй канал АЦП
in r20,ADCL
in r20,ADCH ;Записываем показания со 2 потенциометра в R20
lsr r20 ;сдвигаем вправо на 3, чтобы получить 5 разрядов
lsr r20
lsr r20
andi r20,0b00011111
rjmp m1
m1:
mov r22,r19 ;Содержимое r19-и r22
add r22,r20 ;Считаем сумму показаний, результат записываем в R22
andi r22,0b00011111
odin:
mov r26,r22 ; перемещаем результат вычисления в r26
cpi r25,0x00 ; счетчик равен 0?
brne dva ; если нет, переходим на индикацию второй цифры
andi r26,0x07 ; маска (оставляем 3 младших бита)
mov r30,r26 ; перемещаем результат в r30
lpm ; берем значение цифры
out PORTD,r0 ;выводим его
ldi r23,0x01
out PORTC,r23 ;на первый индикатор
inc r25 ; инкрементируем счетчик
clr r26
clr r30
reti
dva:
cpi r25,0x01 ;счетчик равен 1?
mov r26,r22 ;перемещаем результат вычисления в r26
lsr r26 ;сдвигаем результат на 3 бита вправо
lsr r26 ;тем самым делим его на 8
lsr r26
andi r26,0x07 ;оставляем только 3 младших бита
mov r30,r26 ;перемещаем результат в r30
lpm ;берем значение цифры
out PORTD,r0 ;выводим его
ldi r23,0x02
out PORTC,r23 ;на второй индикатор
clr r25 ;обнуляем счетчик
reti
.db 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07 ;заполняем флеш (0...7)
- Реклама
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
Я канеш не спец но у тебя бесконечный цикл есть
После включения питания он у тебя на метку ресет прыгает и выполняет то что ты там написал а потом
если не прав поправьте
После включения питания он у тебя на метку ресет прыгает и выполняет то что ты там написал а потом
Код: Выделить всё
main:
rjmp main
В каждом из нас спит гений и бодрствует идиот
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
просто у него все выполняется в прерывании.
на мой взгляд - это не лучшее решение. ИМХО
я бы так никогда не стал делать.
на мой взгляд - это не лучшее решение. ИМХО
я бы так никогда не стал делать.
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
Я делаю всегда на подпрограммах даже если она вызывается один раз за всю работу 
В каждом из нас спит гений и бодрствует идиот
- К@Т
- Говорящий с текстолитом
- Сообщения: 1573
- Зарегистрирован: Сб окт 09, 2010 12:33:48
- Откуда: Незалежная
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
Это как?Это пока я спал новую СС прдумали?Ленин писал(а): в
восьмиричной системе
счисления.
У кошки 4 ноги и хвост-плюс,минус,вход,выход,а хвост-земля.....Надо переходить с китайской бурды на канифоль.......[url=http://infobar.hsdn.org/][img]http://static.hsdn.org/infobar/350x60.gif[/img][/url]
- Реклама
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
видать давно спишь
я так ее лет 30 тому назад изучал
я так ее лет 30 тому назад изучал
- К@Т
- Говорящий с текстолитом
- Сообщения: 1573
- Зарегистрирован: Сб окт 09, 2010 12:33:48
- Откуда: Незалежная
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
Сейчас распространены всего 3 СС-GP1 писал(а):видать давно спишь![]()
я так ее лет 30 тому назад изучал
Двоичная,
Десятичная,
Шеснадцатеричная!
Но я не отрицаю то что она была во времена динозавров и вымерла вместе с Алголом,селеновыми выпрямителями,радиолампами и т.д.
У кошки 4 ноги и хвост-плюс,минус,вход,выход,а хвост-земля.....Надо переходить с китайской бурды на канифоль.......[url=http://infobar.hsdn.org/][img]http://static.hsdn.org/infobar/350x60.gif[/img][/url]
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
Специалист должен разбираться в любой сс, хоть в одиннадцатиричной. Для этого такие задачи и существуют.
Docendo discimus
- К@Т
- Говорящий с текстолитом
- Сообщения: 1573
- Зарегистрирован: Сб окт 09, 2010 12:33:48
- Откуда: Незалежная
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
Ну тогда давайте проги писать на Алголе,в качестве памяти использовать магнитофонную ленту а в качестве исполнителя кода использовать радиолампы.Нужно тогда на таком 'мк' а не на меге собирать это устройство .pyzh_man писал(а):Специалист должен разбираться в любой сс, хоть в одиннадцатиричной. Для этого такие задачи и существуют.
У кошки 4 ноги и хвост-плюс,минус,вход,выход,а хвост-земля.....Надо переходить с китайской бурды на канифоль.......[url=http://infobar.hsdn.org/][img]http://static.hsdn.org/infobar/350x60.gif[/img][/url]
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
Или я недоходчиво выразил свою мысль, или уважаемый К@Т неверно понял. Я хотел сказать, что такими задачами прививается ширина кругозора, если можно так выразиться, создается база так сказать. В каменный век никто не смотрит. Хотя тоже как сказать - молотки-то оттуда.
Docendo discimus
- К@Т
- Говорящий с текстолитом
- Сообщения: 1573
- Зарегистрирован: Сб окт 09, 2010 12:33:48
- Откуда: Незалежная
Re: Здравствуйте! Нужно реализовать АЦП на atmega8535.
Теперь я вас понял.pyzh_man писал(а):Или я недоходчиво выразил свою мысль, или уважаемый К@Т неверно понял. Я хотел сказать, что такими задачами прививается ширина кругозора, если можно так выразиться, создается база так сказать. В каменный век никто не смотрит. Хотя тоже как сказать - молотки-то оттуда.
У кошки 4 ноги и хвост-плюс,минус,вход,выход,а хвост-земля.....Надо переходить с китайской бурды на канифоль.......[url=http://infobar.hsdn.org/][img]http://static.hsdn.org/infobar/350x60.gif[/img][/url]



