Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.97/58: Рейтинг темы: голосов - 58, средняя оценка - 4.97
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
1

Первый проект!

23.11.2012, 14:12. Просмотров 10546. Ответов 30
Метки нет (Все метки)

Вобщем собрал схемку, написал программу на процессор. Пытаюсь отлаживать в АВР студии, но что-то не так получается. Помогите отыскать ошибки. Так-то проект компилируется без ошибок, но при отладке программа работает не так как планировалось.
Заметил, что функции «BRGE» «BRMI» работают как-то не так. Допустим результат АЦП сначала > 200 следовательно програмка переходит на метку m1, при изменении результата в регистре ADCH до 150 должна переходить на метку m2, но почему-то переход повторяется на метку m1. Может что-то с регистром SREG нужно делать, потому что сравниваю 2 раза подряд практически и может какие флаги от предыдущего сравнения в нем остаются и поэтому осуществляется неверный переход. Не совсем представляю картину, как выставляются в этом регистре флаги: при новой операци ониполностью обновляются или как? В общем жду подсказок. Алгоритм и листинг программмы привожу.


А здесь сама программка
.include "tn45def.yms"

.def temp = r18
.def flag = r19
.def counter1 = r20
.def counter2 = r21
.CSEG

;***********************
; Объявление прерываний
;***********************
rjmp RESIT ; Riset Homdler
rjmp EXT_INT0 ; IRQ0 Homdler
reti ; rjmp PCINT0
reti ; rjmp TYM1_COMPA
rjmp TYM1_OVF ; rjmp TYM1_OVF
reti ; rjmp TIM0_OVF
reti ; rjmp EE_RDY
reti ; rjmp ANA_COMP
rjmp ADC_ACP ; ADC Conversion Homdler
reti ; rjmp TYM1_COMPB
reti ; rjmp TIM0_COMPA
reti ; rjmp TIM0_COMPB
reti ; rjmp WDT
reti ; rjmp USI_START
reti ; rjmp USI_OVF

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

EXT_INT0: ; Прерывание по сигналу ТЕСТ
sbi PORTB, PB4
in temp, TCCR1
sbr temp, CS12
out TCCR1, temp ; Запуск таймера Т1 с делителем 8
reti

ADC_ACP:
in temp, ADCH
cpi temp, 0b11001000
BRGE m1
cpi temp, 0b01100100
BRGE m2
rjmp m3
m1:
sbr flag, 0b00000100
rjmp m3
m2:
sbr flag, 0b00000010
rjmp m3
m3:
sbr flag, 0b00000001
reti

TYM1_OVF:
cbi PORTB, PB4
in temp, TCCR1
cbr temp, CS12
out TCCR1, temp ; Останов таймера Т1 с делителем 8
clr temp
out TCCR0A, temp
out TCCR0B, temp ; Остановить ШИМ Т0
reti

;***********************
; Начало программы инициализации
;***********************

RESIT:
ldi r16, low(ROMEND) ; Инициализация стека
ldi r17, high(ROMEND)
out SPL, r16
out SPH, r17

ldi temp, 0b00010010
out DDRB, temp ; PB1 и PB4 как выходы,
ldi temp, 0b00000000
out PORTB, temp ; все порты в 0. Те котрорые на вход без подтягивающих резисторов

ldi temp, 0b00000010 ; настройка прерывания по заднему фронту: биты ISC01 в 1 и ISC00 в 0
out MCUCR, temp
in temp, GIMSK ; разрешение прерывания от INT0 мы в регистре gimsk меняем только один бит, а остальные остаются нетронутыми
sbr temp, 0b01000000
out GIMSK, temp

ldi temp, 0b11111010 ; Задаем сравниваемое значение 250 циклов
out OCR1C, temp
clr temp ; Инициализация таймера счетчика Т1
out TCNT1, temp ; очистка счетного регистра таймера/счетчика Т1
ldi temp, 1<<CTC1 ; Режим СТС по совпадению с содержимым регистра OCR1C
out TCCR1, temp ; Таймер также отключен от выводов МК (0<<COM1A1)|(0<<COM1A0)
clr temp
out GTCCR, temp

ldi temp, 0b00100011 ; (0<<REFS1)|(0<<REFS0)|(1<<ADLAR)|(0<<REFS2)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0) Разрешение АЦП на PB3 со сдвигом результата в старший байт регистра данных
out ADMUX, temp
ldi temp, 0b10101110 ; (1<<ADIM)|(0<<ADSC)|(1<<ADATE)|(0<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0)
out ADCSRA, temp ; коэффициент деления частоты 32
clr temp ; (0<<BIN)|(0<<ACME)|(0<<IPR)|(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0)
out ADCSRB, temp ; Режим непрерывного преобразования
ldi temp, 1<<ADC3D ; Отключаем цифровой буфер ADC3
out DIDR0, temp

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

in temp, ADCSRA
sbr temp, 1<<ADSC
out ADCSRA, temp ; Запускаем преобразование АЦП

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

main:
sbrs flag, 0
rjmp main
sbrs flag, 2
rjmp m4
yms counter1
clr counter2
cpi counter1, 40
BRMI m6
rcall OTKL
rjmp m6
m4:
clr counter1
sbrs flag, 1
rjmp m5
yms counter2
cpi counter2, 9
BRMI m6
rcall OK
rjmp m6
m5:
clr counter2
m6:
cbr flag, 0b00000001
rjmp main

OTKL:
sbi PORTB, PB1
ret

OK:
clr temp ; Инициализация таймера счетчика Т0
out TCNT0, temp ; Очистка счетного регистра таймера/счетчика Т0
out TIMSK, temp ; Запрет прерываний таймера
ldi temp, 0b01111111 ; Задаем сравниваемое значение
out OCR0B, temp
ldi temp, 0b00100011
out TCCR0A, temp ; Работает в режиме ШИМ 4 кГц
ldi temp, 0b00000001
out TCCR0B, temp ; Запуск
ret
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2012, 14:12
Ответы с готовыми решениями:

Первый проект, помогите пожалуйста!
Пытаюсь сейчас смоделировать мигающий светодиод в Proteus-е, но почему-то в AVRstudyo все нормально...

Первый Arduino проект
Доброго времени суток) На днях решил заняться Ардуино, заказал платы на али по совету знакомого....

Первый проект в Keil
Здравствуйте все. Создал первый проект в Keil для ARM как написано в мануале (keil.com). При...

Первый большой проект на Qt
Здравствуйте. Я бы хотел попробовать свои силы на этом замечательном фреймворке. Планирую сделать...

Первый проект на Eclipse
Проблема следующая, есть в железе STM32F030F4P6, он прошивается и даже лампочку можно зажечь. Но...

30
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
26.11.2012, 15:53 21
я не в буквальном смысле. когда комментов очень много, сложно смотреть на программу в целом, что она делает (на асме-то и подавно). и даже сворачивание блока комментов в ide - это какие-то костыльчики... но в целом, конечно, это дело каждого - как оформлять свой код.
0
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
26.11.2012, 16:10 22
Нет, это не личное дело каждого. Если пишите только для себя и никогда никому не будете показывать - то да, пишите как хотите, а если кто попросит разобраться в коде, то уж будь добр, оформи по-человечески. А чтобы было ясно как это по-человечески, умные дядьки собрали человечески-программистский опыт, объединили его и выпустили книжку: "Совершенный код". Если придерживаться хотя бы части тамошних советов, то можно значительно облегчить жизнь не только себе, но окружающим.

В этой книжке отдельная глава просвещена именно комментированию и начинается она неоднозначно, а именно, беседы Сократа с программистами. Они там обсуждают эту самую тему на странице книги: "Комментировать или не комментировать?" раздел 32.3. Советую почитать ;)
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
26.11.2012, 16:37 23
тока мне про поддержку не рассказывайте;) я этим занимаюсь (не говоря уже о том, скока пишу) не один год, проект огромный на асме, и уж я точно знаю, как хорошо, а как не очень. все должно быть по делу и без воды. пролистывать тысячи строк кода из которых бОльшая часть - комменты капитана очевидность (заметьте, чужой проект!) - это очень уныло. даже как-то видел код, у которого на каждую строку исходника одна строка коммента (дело К.О. живет). да, по цветам видно, где что, но мусор - мешает. лучше сделать один коммент из нескольких строк на БЛОК кода, чем смешивать код с мусором. бОльшая часть из этого - субьективно.
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
26.11.2012, 20:48 24
А если во время работы ШИМ на выводе OC0B я запишу sbi PORTB, 1<<PB1 тогда на выводе будет 1 или все равно будет выполняться альтернативная функция: ШИМ на выводе OC0B?
0
26.11.2012, 20:48
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
26.11.2012, 21:29 25
Цитата Сообщение от wypuk
А если во время работы ШИМ на выводе OC0B я запишу sbi PORTB, 1<<PB1 тогда на выводе будет 1 или все равно будет выполняться альтернативная функция: ШИМ на выводе OC0B?
Только, если COMn1:COMn0 = 00 OCn отключен от таймера и им можно управлять через PORTx. Исключение режим NORMAL здесь пин можно дернуть FOCx в TCCRx.
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
26.11.2012, 21:32 26
Цитата Сообщение от tyzord66
Только, если COMn1:COMn0 = 00 OCn отключен от таймера и им можно управлять через PORTx. Исключение режим NORMAL здесь пин можно дернуть FOCx в TCCRx.
Тоесть мне надо очистить все регистры TCCRx а потом уже sbi PORTB, 1<<PB1
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
26.11.2012, 21:40 27
Цитата Сообщение от wypuk
Тоесть мне надо очистить все регистры TCCRx а потом уже sbi PORTB, 1<<PB1
Смотря чего Вы хотите добиться

0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
26.11.2012, 21:45 28
Цитата Сообщение от tyzord66
Смотря чего Вы хотите добиться
Просто установить 1 на выводе, и чтобы таймер не мешал
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
26.11.2012, 23:08 29
Пином OCx может управлять либо таймер либо PORTx. Если Вы задействовали таймер в режиме ШИМ, то логично будет предоставить управлять пином OCx именно ему.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
27.11.2012, 10:28 30
Цитата Сообщение от Ymk
я не в буквальном смысле. когда комментов очень много, сложно смотреть на программу в целом, что она делает (на асме-то и подавно). и даже сворачивание блока комментов в ide - это какие-то костыльчики... но в целом, конечно, это дело каждого - как оформлять свой код.
Советую всем почитать книгу Ван Тассела http://www.az-desykn.ru/index.shtml?Projects&AzBook&src/005/01TS000
Ну и немножко от себя http://onimbidding.biatyx.com/articles/makeup/
0
Rodyk
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 4
01.12.2012, 16:22 31
Мужики, помогите расшифровать послание(в программировании совсем недавно):
"Настрой компилятор.
Убери перевод чисел в 16тиричную систему и установи утрамбовку кода по минимальной длине модели."
Как это сделать в CodeVisionAVR?
0
01.12.2012, 16:22
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2012, 16:22

Первый проект СКС
Всем привет! На работе загрузили меня проектом СКС (сам проектировщик ОПС). Исходные данные: -...

Первый проект и ошибка
Подскажите, пожалуйста, как решить данную проблему?

Первый проект в JavaME
Здравствуйте форумчане! Возникла проблема с которой, надеюсь, разберусь с вашей помощью! Было...


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

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

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