0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
1

Atmega32A и АЦП

01.07.2013, 20:28. Показов 14126. Ответов 23
Метки нет (Все метки)

Подскажите, где у меня ошибка в инициализации? Пытаюсь настроить АЦП в режим непрерывного преобразования. Так он мне болты прописывает. В симуляторе первый раз прерывание вызывается, а потом нет!

Код
   ldi  temp,  (1<<REFS0)|(1<<ADLAR)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0)   ; Разрешение АЦП на PA7 (ADC7) со сдвигом результата в старший байт регистра данных и внешним питанием от кондера
out  ADMUX, temp
ldi  temp,  (1<<ADIM)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)   ; коэффициент деления частоты 128 при 16МГц ~ 9250 выборок в секунду, бит ADATE разрешает выбор режима преобразования в регистре SFIOR
out  ADCSRA,temp
in   temp,  SFIOR   ; Задаем режим непрерывного преобразования ADTS2=0, ADTS1=0, ADTS0=0 это 3 старших бита 7й, 6й и 5й
omdi temp,  0b00011111
out  SFIOR, temp
in   temp,  ADCSRA
sbr  temp,  1<<ADSC      ; Запускаем АЦП
out  ADCSRA,temp
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2013, 20:28
Ответы с готовыми решениями:

ATmega8a, ATmega32a и т.д.
Доброго времени суток! Компания атмель вместо родных нам мег восьмых, шестнадцатых и т.д. стала...

atmega32A Timer1
возможно ли получить две разных частоты (меиндр) на выводах OC1A и OC1B? чего-то туплю, как для...

Atmega32A, где ошибка?
Есть вот такая схема, на Atmega8 порт В нормально работал, но здесь,на Atmego32A, почему-то не...

Atmega32A - чем программировать?
Всем привет! Имею программатор USB ASP, Amego32A, AVR Studyo 4.19. При создании проекта Atmega с...

23
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
01.07.2013, 21:55 2
В обработчике прерывания, наверно, напортачили. Покажите ISR.
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
01.07.2013, 22:18 3
Цитата Сообщение от OtyxPM
В обработчике прерывания, наверно, напортачили. Покажите ISR.
Ну вот обработчик, в регистры АЦП он вообще никак не лезет кроме прочитать ADCH
Код
A_D_C:
push temp
in   temp, SREG
push temp

in   temp, ADCH            ; Читаем АЦП интересен старший байт (нужно выставить ADLAR бит)
cpi  temp, 150
brsh m2               ; Если значение АЦП больше 150 идем на m2
cpi  t_count, 1
brsh m3
m1:
yms  t_count            ; Увеличиваем счетчик
cpi  t_count, 100
brlo m4               ; Если счетчик меньше 100 идем на конец прерывания
sbr  flags, rele_enable         ; иначе разрешаем работу реле
rjmp m4
m2:
cpi  t_count, 254
brlo m1               ; Если счетчик меньше 254 идем на m1
m3:
dec  t_count            ; иначе увеличиваем счетчик
cpi  t_count, 100
brsh m4               ; Если счетчик больше 100 идем на конец прерывания
cbr  flags, rele_enable         ; иначе запрещаем работу реле
m4:

pop  temp
out  SREG, temp
pop  temp
reti
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
01.07.2013, 23:36 4
Я просто тащусь с этих разработчиков! Как оказывается опять все дело в симуляторе. Для одних микроконтроллерах нормально работает один симулятор AVR symulator, для других другой AVR symulator 2!
Получается что для Atmego32A корректно симулирет AVR symulator 2, а у AVR symulator глюки с АЦП!
Ранее выяснил, что для Attiny2313 наоборот корректно симулирет AVR symulator, а у AVR symulator 2 глюки с UART!
Короче я в ауте от таких раскладов... слов нет.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
02.07.2013, 00:24 5
Цитата Сообщение от wypuk
Для одних микроконтроллерах нормально работает один симулятор AVR symulator, для других другой AVR symulator 2!
Получается что для Atmego32A корректно симулирет AVR symulator 2, а у AVR symulator глюки с АЦП!
Ранее выяснил, что для Attiny2313 наоборот корректно симулирет AVR symulator, а у AVR symulator 2 глюки с UART!
Короче я в ауте от таких раскладов... слов нет.
Для грамотных Студия серым по белому пишет: какой из двух симуляторов желательно выбрать. Вы специально зажмуриваетесь на этом экране и выбор делаете вслепую? :-)
Понятное же дело, что новый Simulator-2 может не поддерживать старые чипы, а старый Simulator-1 (а он реально старый: ещё с прошлого века) может не справляться с новыми чипами. В Хелпе тоже это всё разжёвано.
Некоторым чипам повезло быть совместимыми с обоими Симуляторами - опять же, Студия это показывает в списке при создании проекта.
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
08.07.2013, 00:31 6
Цитата Сообщение от OtyxPM
Для грамотных Студия серым по белому пишет: какой из двух симуляторов желательно выбрать. Вы специально зажмуриваетесь на этом экране и выбор делаете вслепую? :-)
Понятное же дело, что новый Simulator-2 может не поддерживать старые чипы, а старый Simulator-1 (а он реально старый: ещё с прошлого века) может не справляться с новыми чипами. В Хелпе тоже это всё разжёвано.
Некоторым чипам повезло быть совместимыми с обоими Симуляторами - опять же, Студия это показывает в списке при создании проекта.
Да, студия серым выделяет те контроллеры которые не поддерживает данный симулятор. Но в моем случае Atmego32A выделен черным в обоих симуляторах. И причем оба они работают с косяками. Во 2м не работает симуляция UART, а в 1-ом не работает симуляция АЦП.
Кстати без нормальной симуляции не получается программу отладить. Не могу ошибку найти в коде. На устройстве почему-то UART сначала обменивается данными какое-то время, а потом затыкается и хоть ты тресни работать начинает только после ресета, опять же до поры до времени.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
08.07.2013, 00:37 7
Цитата Сообщение от wypuk
без нормальной симуляции не получается программу отладить. Не могу ошибку найти в коде.
Попробуйте другой симулятор - VMLAB, например. Может, с ним повезёт.

А ещё можно в реальном ATmego32A вести лог в EEPROM или/и SROM, благо они у этого МК довольно большие. Я так делал, отлаживал сложные реалтаймовые проблемы и непонятности со специфическими периферийными железками (которые симуляторами не поддерживаются). Лог потом из EEPROM читается программатором.
0
0 / 0 / 0
Регистрация: 25.05.2013
Сообщений: 157
08.07.2013, 01:26 8
Цитата Сообщение от wypuk
Я просто тащусь с этих разработчиков!
Тащитесь.
Скажите, а Вы пробовали в прерывании, кроме ADCH читать еще и ADCL?
Ну, как-то для разнообразия?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
08.07.2013, 01:33 9
Цитата Сообщение от ZIvS
Скажите, а Вы пробовали в прерывании, кроме ADCH читать еще и ADCL?
Ну, как-то для разнообразия?
Так он же с ADLARом читает. Вроде нормально только ADCH в этом случае читать (8 бит АЦП, зато частоту можно сильно увеличить).
0
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,379
08.07.2013, 10:30 10
Симулятор - штука очень специфическая, и вообще-то предназначен для исследования стека, вызовов, пошагового исполнения, профилирования, отладки КА, и прочего связанного с вычислительным ядром. Для отладки работы с периферией гораздо больше подходит отладчик, потому что редкий симулятор достоверно воспроизводит работу периферии (в Keil для некоторых чипов есть счастливое исключение).
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
08.07.2013, 11:51 11
Цитата Сообщение от okotimiv
Для отладки работы с периферией гораздо больше подходит отладчик, потому что редкий симулятор достоверно воспроизводит работу периферии (в Keil для некоторых чипов есть счастливое исключение).
Какой отладчик? Имеешь ввиду JTAG?
0
0 / 0 / 0
Регистрация: 25.05.2013
Сообщений: 157
09.07.2013, 14:11 12
Цитата Сообщение от OtyxPM
Так он же с ADLARом читает. Вроде нормально только ADCH в этом случае читать (8 бит АЦП, зато частоту можно сильно увеличить).
И что, что с ADLAR`ом?

Ознакомьтесь (всего один абзац): http://www.gaw.ru/html.cgi/txt/doc/micr ... 3_58_6.htm
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
09.07.2013, 14:16 13
Цитата Сообщение от ZIvS
И что, что с ADLAR`ом?
Ознакомьтесь (всего один абзац)
Фиговый это абзац, для домохозяек :-)
Хотите ознакомиться с datasheet и AppNote про использование AVR ADC? Когда нужна не точность, а скорость, то устанавливают восьмибитный режим с ADLAR и читают только один регистр ADCH.
0
0 / 0 / 0
Регистрация: 25.05.2013
Сообщений: 157
09.07.2013, 14:28 14
Цитата Сообщение от OtyxPM
Цитата Сообщение от ZIvS
И что, что с ADLAR`ом?
Ознакомьтесь (всего один абзац)
Фиговый это абзац, для домохозяек :-)
Хотите ознакомиться с datasheet и AppNote про использование AVR ADC? Когда нужна не точность, а скорость, то устанавливают восьмибитный режим с ADLAR и читают только один регистр ADCH.

На железе - да. На дебагере не работает ;) Сам два года назад камни из-за этого перепаивал.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
09.07.2013, 14:33 15
Цитата Сообщение от ZIvS
На железе - да. На дебагере не работает ;) Сам два года назад камни из-за этого перепаивал.
В AVR Studyo не помню как это выглядело (может, работало, а может быть и нет), но в VMLAB отлаживал АЦП в восьмибитном режиме - всё работало.
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
09.07.2013, 19:48 16
Ну с АЦП вопросы отпали, на камне свою функцию выполняет и мне достаточно, а вот UART артачится... и на камне нормально не работает и в симуляторе отстой. А с ВМЛАБ что-то пока туго. Там что, нужно реальную схему текстом прописывать? Можно как-то по быстрому просто прогнать прогу как в авр студии, просто кликая по нужным битам в периферии?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
09.07.2013, 19:57 17
Цитата Сообщение от wypuk
Ну с АЦП вопросы отпали, на камне свою функцию выполняет и мне достаточно, а вот UART артачится... и на камне нормально не работает и в симуляторе отстой. А с ВМЛАБ что-то пока туго. Там что, нужно реальную схему текстом прописывать? Можно как-то по быстрому просто прогнать прогу как в авр студии, просто кликая по нужным битам в периферии?
UART со стороны компьютера там добавляется как готовый компонент. А периферия, регистры, переменные, память и т.п. - есть в отдельных окошках так же, как и в Студии. Всё кликается (read и write).

А что за проблема с UART? Вот эта всё ещё?
На устройстве почему-то UART сначала обменивается данными какое-то время, а потом затыкается и хоть ты тресни работать начинает только после ресета, опять же до поры до времени.
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
09.07.2013, 20:29 18
Цитата Сообщение от OtyxPM
Цитата Сообщение от wypuk
Ну с АЦП вопросы отпали, на камне свою функцию выполняет и мне достаточно, а вот UART артачится... и на камне нормально не работает и в симуляторе отстой. А с ВМЛАБ что-то пока туго. Там что, нужно реальную схему текстом прописывать? Можно как-то по быстрому просто прогнать прогу как в авр студии, просто кликая по нужным битам в периферии?
UART со стороны компьютера там добавляется как готовый компонент. А периферия, регистры, переменные, память и т.п. - есть в отдельных окошках так же, как и в Студии. Всё кликается (read и write).

А что за проблема с UART? Вот эта всё ещё?
На устройстве почему-то UART сначала обменивается данными какое-то время, а потом затыкается и хоть ты тресни работать начинает только после ресета, опять же до поры до времени.
Да, она самая! На осциллографе смотрю, сначала какое-то время все передается и принимается, а потом ноль реакции... вот код если что, может разглядите свежим взглядом
Код
.include "m32Adef.yms"

.def flags_of_errors   = r4
.def data_byte_9bit      = r5
.def RX_Data         = r6
.def n_count         = r7
.def temp            = r16
.def t_count         = r19         ; Счетчик АЦП
.def flags            = r20
.def data_byte_TX      = r21
.def TX_address         = r22

.equ rele_enable      = 0
.equ error            = 1
.DSEG

NO_failure_transmitter: .byte 1
stek_1:               .byte 1
reception_error:          .byte 1
number_chek:            .byte 1
data_byte:            .byte 2

.CSEG

;*************************
;* Объявление прерываний *
;*************************

.ORG $000   jmp Riset                     ; (RESIT)
.ORG $002   reti                        ; (INT0) External Ymtirrupt Request 0
.ORG $004   reti                        ; (INT1) External Ymtirrupt Request 1
.ORG $006   reti                        ; (INT2) External Ymtirrupt Request 2
.ORG $008   reti                        ; (TIMER2 COMP) Timer/Counter2 Compare Match
.ORG $00A   reti                        ; (TIMER2 OVF)  Timer/Counter2 Overflow
.ORG $00C   reti                        ; (TIMER1 CAPT)   Timer/Counter1 Capture Ivimt
.ORG $00E   reti ;jmp TYM1_COMPA                  ; (TIMER1 COMPA)  Timer/Counter1 Compare Match A
.ORG $010   reti                        ; (TIMER1 COMPB)  Timer/Counter1 Compare Match B
.ORG $012   reti                        ; (TIMER1 OVF)    Timer/Counter1 Overflow
.ORG $014   jmp TIM0_COMP                  ; (TIMER0 COMP) Timer/Counter0 Compare Match
.ORG $016   reti                        ; (TIMER0 OVF)  Timer/Counter0 Overflow
.ORG $018   reti                        ; (SPI,STC) Serial Transfer Complete
.ORG $01A   jmp USORT_RXC                  ; (USORT,RXC) USORT, Rx Complete
.ORG $01C   jmp USORT_UDRE                  ; (USORT,UDRE) USORT Data Register Empty
.ORG $01E   jmp USORT_TXC                  ; (USORT,TXC) USORT, Tx Complete
.ORG $020   jmp A_D_C                     ; (ADC) ADC Conversion Complete
.ORG $022   reti                        ; (EE_RDY) EEPROM Ready
.ORG $024   reti                        ; (ANA_COMP) Analog Comparator
.ORG $026   reti                        ; (TWI) 2-wire Serial Interfosi
.ORG $028   reti                        ; (SPM_RDY) Store Prokram Memory Ready
.ORG      INT_VECTORS_SIZE               ; Конец таблицы прерываний

;**************************
;* Обработчики прерываний *
;**************************

;   Прерывание таймера счетчика 0

;---после отправки сообщения по UART запускается этот таймер
;---если до вызова этого прерывания ответ от N-ного устройства не получен, то
;---ему посылается еще одно сообщение,
;---если после 3х раз не получен ответ, то переходим к опросу следующего устройства
;---и запоминаем адресс не отвечающего устройства
;---Для того чтобы при выходе из прерывания возвращаться не в прерванную фоновую программу (условно main)
;---а сразу произвести опрос устройства подменяю стек на нужную метку передачи данных
;---и в Z заношу адрес по которому программа должна была выйти из прерывания

TIM0_COMP:
pop  ZH                              ; В регистр Z из стека сохраняем адрес выхода из прерывания
pop  ZL
ldi  r23, Low(Transmit_data)            ; Проследить чтобы r23 нигде не использовался
push r23
ldi  r23, High(Transmit_data)            ; На место вытянутого из стека адреса помещаем адрес процедуры передачи данных
push r23
push temp
in   temp, SREG
push temp                           ; Так же в стеке сохраняются используемые регистры и регистр SREG

mov  temp, r2                        ; Счетчик Count2 - глобальная переменная в r2
cpi  temp, 3
brsh limit_attempts                     ; если достигнуто предельное число раз передачи по одному адресу переход на limit_attempts
yms  r2                              ; иначе увеличиваем счетчик count2
rjmp end_attempts                     ; в конец прерывания

limit_attempts:
sts  NO_failure_transmitter, TX_address      ; сохраняем в ОЗУ адресс не отвечающего передатчика

cpi  TX_address, 1
brsh tim0
yms  TX_address                        ; переходим к опросу следующего по счету датчика
rjmp tim1
tim0:
clr  TX_address                        ; переходим к опросу первого по счету датчика
tim1:
clr  r2                              ; обнуляем счетчик count2
end_attempts:
pop  temp                           ; Достаем из стека все что туда сохраняли и выходим
out  SREG, temp
pop  temp
reti

;   Прерывание по получении ответной посылки

;---В посылке всего 2 байта, первый байт адрес, второй - интересующие данные
;---Если нет ошибок приема и адрес отправленный и полученный совпадают,
;---то сохраняем оба полученных байта в ОЗУ, подменяем стек на метку
;---где будем обрабатывать данные "uart_processing:" а оттуда по ijmp возвращаемся туда,
;---куда должны были вернуться из прерывания USORT_RXC:

USORT_RXC:
push temp
in   temp, SREG
push temp

in   flags_of_errors, UCSRA                     ; Прочли флаги ошибок
in   data_byte_9bit,  UCSRB                     ; Прочли 9-й бит
in   RX_Data, UDR                           ; Прочли данные
mov  temp, flags_of_errors
omdi temp, (1<<FE)|(1<<DOR)|(1<<UPE)            ; Выделение ошибок, если ошибок нет установится флаг Z

breq no_err                                 ; Если ошибок нет (результат равен 0) переходим на no_errors
sbr  flags, (1<<error)
mov  temp,  flags_of_errors
sbrs temp,  DOR                              ; Очистка буфера при переполнении
rjmp data_loss
clr_buf:
sbis UCSRA, RXC
rjmp data_loss
in   temp, UDR
rjmp clr_buf
data_loss:
clr  RX_Data
clr  data_byte_9bit
sbr  data_byte_Tx, (1<<7)
rjmp end_Rx

no_err:
st   X+, RX_Data
end_RX:
yms  n_count                        ; этот счетчик считает количество принятых байт

sbrc flags, error
rjmp rx1
sbi  PORTD, PD4
mov  temp, n_count
cpi  temp, 2
brlo rx3
clr  r2                              ; Очистка count2
clr  n_count

pop  temp
sts  stek_1, temp
pop  temp
pop  ZH
pop  ZL
ldi  r23, low (uart_processing)            ; Проследить чтобы r23 нигде не использовался
push r23
ldi  r23, high(uart_processing)            ; На место вытянутого из стека адреса помещаем адрес процедуры передачи данных
push r23
push temp
lds  temp, stek_1
push temp

sts  number_chek, TX_address

cpi  TX_address, 1                     ; Здесь переменная количества датчиков
brsh rx0
yms  TX_address
rjmp rx2
rx0:
clr  TX_address
rjmp rx2
rx1:
cbi  PORTD, PD4
mov  temp, n_count
cpi  temp, 2
brlo rx3
cbr  flags, (1<<error)
ldi  temp, 0
sts  data_byte,   temp
sts  data_byte+1, temp
ldi  XH, high(data_byte)
ldi  XL, low (data_byte)
rjmp rx3
rx2:
in   temp, TCCR0
omdi temp, 0b11111000
out  TCCR0,temp                        ; Останавливаем таймер
clr  temp                           ; очистка счетного регистра таймера/счетчика Т1
out  TCNT0,temp                                                                  ; очистка счетного регистра таймера/счетчика Т0
in   temp, TIFR
cbr  temp, (1<<OCF0)                  ; Как флаги сбрасываются???????
out  TIFR, temp
rx3:
pop  temp
out  SREG, temp
pop  temp
reti

;   Передача последующего байта (всего 2 байта)

USORT_UDRE:
cbi  UCSRB, TXB8
out  UDR,   data_byte_TX
cbi  UCSRB, UDRIE
reti

;   Передача завершена

;---После завершения передачи запускаю таймер Т0 и ожидаю ответа

USORT_TXC:
push temp
in   temp,  SREG
push temp

cbi  UCSRB, TXEN
cbi  PORTD, PD2
sbi  UCSRB, RXEN

in   temp,  TCCR0
sbr  temp,  (1<<CS02);|(1<<CS00)         ; Запускаем таймер в режиме СТС по совпадению с содержимым регистра OCR1 коэффициент деления 64/256
out  TCCR0, temp                        ; Таймер также отключен от выводов МК
clr  temp
out  TCNT0, temp                     ; очистка счетного регистра таймера/счетчика Т0

pop  temp
out  SREG,  temp
pop  temp
reti

;   Прерывание АЦП

;---тут контролируем напряжение на входе и если оно больше порога 100 раз подряд
;---ставим нужный байт в посылке и выводим 0 в PORTC1
;---также контролируем чтобы счетчик не переполнился

A_D_C:
push temp
in   temp, SREG
push temp                           ; Спрячем используемые под локальные переменные регистры в стеке

in   temp, ADCH                        ; Читаем АЦП интересен старший байт (нужно выставить ADLAR бит)
cpi  temp, 150
brsh m2                              ; Если значение АЦП больше 150 идем на m2
cpi  t_count, 1
brsh m3
m1:
yms  t_count                        ; Увеличиваем счетчик
cpi  t_count, 100
brlo m4                              ; Если счетчик меньше 100 идем на конец прерывания
sbr  flags, (1<<rele_enable)            ; иначе разрешаем работу реле
sbr  data_byte_TX, 1<<3
cbi  PORTC, PC1
rjmp m4
m2:
cpi  t_count, 254
brlo m1                              ; Если счетчик меньше 254 идем на m1
m3:
dec  t_count                        ; иначе увеличиваем счетчик
cpi  t_count, 100
brsh m4                              ; Если счетчик больше 100 идем на конец прерывания
cbr  flags, (1<<rele_enable)            ; иначе запрещаем работу реле
cbr  data_byte_TX, 1<<3
sbi  PORTC, PC1
m4:

pop  temp
out  SREG, temp
pop  temp                           ; Восстанавливаем стек
reti

;************************
;* Сектор инициализации *
;************************

RESIT:

;   Обнуляем оперативку

ldi  ZL, Low (SROM_START)               ; Адрес начала ОЗУ в индекс
ldi  ZH, High(SROM_START)
clr  R16                           ; Очищаем R16

CLR_SROM:
st   Z+, R16                        ; Сохраняем 0 в ячейку памяти
cpi  ZH, High(ROMEND+1)                  ; Достигли конца оперативки?
brne CLR_SROM                        ; Нет? Крутимся дальше!

cpi  ZL, Low (ROMEND+1)                  ; А младший байт достиг конца?
brne CLR_SROM

;   Обнуляем регитры

ldi  ZL, 30                           ; Адрес самого старшего регистра
clr  ZH                              ; А тут у нас будет ноль

CLR_REG:
dec  ZL                              ; Уменьшая адрес
st   Z, ZH                           ; Записываем в регистр 0
brne CLR_REG                        ; Пока не перебрали все не успокоились

;   Инициализация стека

ldi  temp,  low(ROMEND)
out  SPL,   temp
ldi  temp,  high(ROMEND)
out  SPH,   temp

;   Отключить JTAG интерфейс

;   in   temp,  MCUCSR
;   sbr  temp,  (1<<JTD)
;   out  MCUCSR,temp
;   out  MCUCSR,temp

;   Настройка портов ввода-вывода

ldi  temp,  (1<<DDD4)|(1<<DDD3)|(1<<DDD2)   ; PD настраиваем под RS485 и реле выхода
out  DDRD,  temp
ldi  temp,  (1<<PD7)|(1<<PD6)|(1<<PD5)|(1<<PD4)|(1<<PD3)|(1<<PD1)|(1<<PD0)
out  PORTD, temp

ldi  temp,  (1<<DDC4)|(1<<DDC3)|(1<<DDC2)|(1<<DDC1)   ; PС настраиваем под кнопки
out  DDRC,  temp                     ; PC как выход 0b00011100, где 0 то вход
ldi  temp,  (1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4)|(1<<PC3)|(1<<PC2)|(1<<PC1)|(1<<PC0)
out  PORTC, temp                       ; На выходах 1 а на входах включены подтягивающие резисторы.

ldi  temp,  (1<<DDB6)|(1<<DDB5)|(1<<DDB4)   ; PB настраиваем под LCD
out  DDRB,  temp
ldi  temp,  (1<<PB7)|(1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0)
out  PORTB, temp

clr  temp                           ; PB настраиваем под АЦП
out  DDRA,  temp
ldi  temp,  (1<<PA7)|(1<<PA6)|(1<<PA5)|(1<<PA4)|(1<<PA3)|(1<<PA2)|(1<<PA1)|(1<<PA0)
out  PORTA, temp

;   Настраиваем UART

ldi  temp,  3
out  UBRRL, temp
clr  temp                           ; Задаем скорость 250000 бит/с при 16 МГц
out  UBRRH, temp
out  UCSRA, temp
ldi  temp,  (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<UCSZ2)         ; Устанавливается 9-ти битный режим, разрешаются 2 прерывания от UART
out  UCSRB, temp
ldi  temp,  (1<<URSEL)|(1<<UPM1)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); Устанавливается асинхронный режим, проверка на четность, 2 стоп бита и 9-ти битный режим
out  UCSRC, temp

;   Настраиваем АЦП

ldi  temp,  (1<<REFS0)|(1<<ADLAR)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0)   ; Разрешение АЦП на PB3 со сдвигом результата в старший байт регистра данных 1<<REFS0 поменять
out  ADMUX, temp
ldi  temp,  (1<<ADIM)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)   ; коэффициент деления частоты 128
out  ADCSRA,temp
in   temp,  SFIOR                                    ; Задаем режим непрерывного преобразования
omdi temp,  0b00011111
out  SFIOR, temp
in   temp,  ADCSRA
sbr  temp,  1<<ADSC
out  ADCSRA,temp                                    ; Запускаем преобразование АЦП

;   Настраиваю таймер Т0

ldi  temp,  (1<<OCIE0)
out  TIMSK, temp                                    ; Прерывание таймера Т0 и Т1 по совпадению OCR0A и OCR1A
ldi  temp,  250
out  OCR0,  temp                                    ; Режим СТС по совпадению с содержимым регистра OCR0
ldi  temp,  (1<<WGM01)|(0<<CS02)|(0<<CS01)|(0<<CS00)         ; Запуск c коэф дел = 64 (период 1мс)
out  TCCR0, temp                                       ; Таймер также отключен от выводов МК
clr  temp                                          ; очистка счетного регистра таймера/счетчика Т0
out  TCNT0, temp

ldi  ZH, high(main)
ldi  ZL, low (main)

ldi  XH, high(data_byte)               ; адрес принятой посылки в ОЗУ
ldi  XL, low (data_byte)

sei                                 ; глобально разрешаю прерывания

;*********************
;* Главная программа *
;*********************

Transmit_data:
cbi  UCSRB, RXEN                     ; Передаем данные по RS485
sbi  PORTD, PD2                        ; PD2 - RE, DE
sbi  UCSRB, TXEN                     ; RXD - RO, TXD - TI
sbi  UCSRB, TXB8
out  UDR,   TX_address
sbi  UCSRB, UDRIE
clr  n_count
ijmp

main:

rjmp main

;   Программа обработки принятых данных

;---Если отправленный и полученый адреса совпадают, то ответило то устройство которое и спрашивали
;---и если стоит флаг "rele_enable" (он ставится в прерывании АЦП) и в принятой посылке
;---есть хотя бы 1 из 3х битов 0b00101010, то выводим 0 в PD3 иначе выводим 1

uart_processing:
ldi  XH, high(data_byte)
ldi  XL, low (data_byte)
ld   r8, X+
lds  r9, number_chek
cp   r8, r9
breq u1
cbi  PORTD, PD4
ijmp
u1:
cbi  UCSRB, RXEN
sbi  PORTD, PD2
sbi  UCSRB, TXEN
sbi  UCSRB, TXB8
out  UDR,   TX_address
sbi  UCSRA, UDRIE

sbrc flags, rele_enable
rjmp u3
u2:
sbi  PORTD, PD3
ijmp

u3:
ld   temp, X
omdi temp, 0b00101010
breq u2
cbi  PORTD, PD3
ijmp
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
09.07.2013, 21:16 19
Пробую сейчас пинбордовским Jtag-ом отлаживать, чисто одни прерывания ацп лезут. Как сделать так чтобы они постоянно не вызывались? чтобы флаг прерывания не убирать. мне-таки хочется посметреть, что в Uarte творится... кстати заметил, что почему-то в регистр UCSRC нихрена не записалось Jtagom?????
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
09.07.2013, 21:44 20
почему-то, когда ставлю флаг RXC то прерывание не вызывается, хотя и RXEN и RXCIE стоит???
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2013, 21:44

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Не заводится DS2480B от AtMega32a
Всем доброго времени суток! Чтобы завести эту микросхему, даташит рекомендует послать следующую...

Atmega32a перестал отзываться
Собственно, суть в теме. Прошиваю самодельным программатором APU-2, тот, который на FT232. На ПК...

проблема прошивки atmega32a
Здравствуйте. Шью ATmego32A через программатор ABR910 и SinaProk. Код программы: .include...

Расширение АЦП микроконтроллера и подключение к АЦП датчиков
Здравствуйте. У меня встала задача сделать устройство для элеватора, для контроля температуры в 864...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.