Помогите,первая прграмма на ассемблере...
-
Green-8282
- Родился
- Сообщения: 6
- Зарегистрирован: Вс авг 14, 2011 12:34:42
Помогите,первая прграмма на ассемблере...
Программа считает секунды,и выводит значение на два семисегментных индикатора,подключенных в динамическом режиме.Проблема в том,что при подаче питания на индикаторах отображается всякая белеберда,но спустя какое-то время все нормально начинает показывать. P.S. Если где-то туплю сильно не пинайте это моя первая программа.
; Начало программы
rjmp Init
; =====================
Init :
ser temp ; Определяем входы и выходы портов
out DDRD,temp ;
out DDRC,temp ;
ldi temp,0b00111111
out DDRB,temp
ldi temp,0b11110110 ;
out PortD,temp ;
ldi temp,0b11111111 ; Включаем подтяжку для входов портов
out PortB,temp ;
ldi temp,0b11111101 ;
out PortC,temp ; и задаем начальные состояния выходов
ldi temp,0b00000101 ; Включаем таймер с частотой деления 1024
out TCCR0,temp
ldi mark125,125 ; Присваеваем mark125 число 125
ldi counter,125 ; Присваеваем counter число 125
ldi R20,0b11110110 ; Код для 0
ldi R21,0b01000010 ; Код для 1
ldi R22,0b10110011 ; 2
ldi R23,0b11010011 ; 3
ldi R24,0b01000111 ; 4
ldi R25,0b11010101 ; 5
ldi R26,0b11110101 ; 6
ldi R27,0b01010010 ; 7
ldi R28,0b11110111 ; 8
ldi R29,0b11010111 ; Код для 9
; =====================
; Основное тело программы
Start:
in temp,TCNT0 ; Считываем состояние таймера и записываем в temp
cp temp,mark125 ; Сравниваем temp с mark125
brne Timer4 ; Если не равны,то переходим к Timer
subi mark125,-125 ; Прибавляем 125 к mark125
dec counter ; Отнимаем от counter 1
brne Tablo4 ; Если не ноль,переходим к Tablo4
ldi counter,125 ; Присваеваем counter число 125
inc time4 ; Увеличиваем time4 на 1
Minut2:
clr time ; Очищаем time
add time,time4 ; Прибавляем time4 к time
cpi time,10 ; time=10?
brne Tablo4 ; Нет,переходим к Tablo4
clr time4 ; Да,очищаем time4 inc time3 ; Увеличиваем time3 на 1
Tablo4:
cbi PortC,0
sbi PortC,1
ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,time4 ; прибавляем time к ZL
clr temp1 ; Очищаем temp1
ld temp1,Z ; Считываем Z в temp
out PortD,temp1 ; Выводим temp в порт D
Timer3:
in temp,TCNT0 ; Считываем состояние таймера и записываем в temp
cp temp,mark125 ; Сравниваем temp с mark125
brne Timer3 ; Если не равны,то переходим к Timer
subi mark125,-125 ; Прибавляем 125 к mark125
dec counter ; Отнимаем от counter 1
brne Minut1 ; Если не ноль,переходим к Tablo3
inc time4 ; Увеличиваем time3 на 1
ldi counter,125
Minut1:
clr time
add time,time3 ; Прибавляем time3 к time
cpi time,6 ; time=6?
brne Tablo3 ; Нет,пропускаем команду
clr time3 ; Да,очищаем time
Tablo3:
cbi PortC,1
sbi PortC,0
ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,time3 ; прибавляем time к ZL
clr temp1 ; Очищаем temp1
ld temp1,Z ; Считываем Z в temp
out PortD,temp1 ; Выводим temp в порт D
rjmp Start
; Начало программы
rjmp Init
; =====================
Init :
ser temp ; Определяем входы и выходы портов
out DDRD,temp ;
out DDRC,temp ;
ldi temp,0b00111111
out DDRB,temp
ldi temp,0b11110110 ;
out PortD,temp ;
ldi temp,0b11111111 ; Включаем подтяжку для входов портов
out PortB,temp ;
ldi temp,0b11111101 ;
out PortC,temp ; и задаем начальные состояния выходов
ldi temp,0b00000101 ; Включаем таймер с частотой деления 1024
out TCCR0,temp
ldi mark125,125 ; Присваеваем mark125 число 125
ldi counter,125 ; Присваеваем counter число 125
ldi R20,0b11110110 ; Код для 0
ldi R21,0b01000010 ; Код для 1
ldi R22,0b10110011 ; 2
ldi R23,0b11010011 ; 3
ldi R24,0b01000111 ; 4
ldi R25,0b11010101 ; 5
ldi R26,0b11110101 ; 6
ldi R27,0b01010010 ; 7
ldi R28,0b11110111 ; 8
ldi R29,0b11010111 ; Код для 9
; =====================
; Основное тело программы
Start:
in temp,TCNT0 ; Считываем состояние таймера и записываем в temp
cp temp,mark125 ; Сравниваем temp с mark125
brne Timer4 ; Если не равны,то переходим к Timer
subi mark125,-125 ; Прибавляем 125 к mark125
dec counter ; Отнимаем от counter 1
brne Tablo4 ; Если не ноль,переходим к Tablo4
ldi counter,125 ; Присваеваем counter число 125
inc time4 ; Увеличиваем time4 на 1
Minut2:
clr time ; Очищаем time
add time,time4 ; Прибавляем time4 к time
cpi time,10 ; time=10?
brne Tablo4 ; Нет,переходим к Tablo4
clr time4 ; Да,очищаем time4 inc time3 ; Увеличиваем time3 на 1
Tablo4:
cbi PortC,0
sbi PortC,1
ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,time4 ; прибавляем time к ZL
clr temp1 ; Очищаем temp1
ld temp1,Z ; Считываем Z в temp
out PortD,temp1 ; Выводим temp в порт D
Timer3:
in temp,TCNT0 ; Считываем состояние таймера и записываем в temp
cp temp,mark125 ; Сравниваем temp с mark125
brne Timer3 ; Если не равны,то переходим к Timer
subi mark125,-125 ; Прибавляем 125 к mark125
dec counter ; Отнимаем от counter 1
brne Minut1 ; Если не ноль,переходим к Tablo3
inc time4 ; Увеличиваем time3 на 1
ldi counter,125
Minut1:
clr time
add time,time3 ; Прибавляем time3 к time
cpi time,6 ; time=6?
brne Tablo3 ; Нет,пропускаем команду
clr time3 ; Да,очищаем time
Tablo3:
cbi PortC,1
sbi PortC,0
ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,time3 ; прибавляем time к ZL
clr temp1 ; Очищаем temp1
ld temp1,Z ; Считываем Z в temp
out PortD,temp1 ; Выводим temp в порт D
rjmp Start
- Реклама
-
Green-8282
- Родился
- Сообщения: 6
- Зарегистрирован: Вс авг 14, 2011 12:34:42
Re: Помогите,первая прграмма на ассемблере...
Контроллер ATmega8, частота 16 mHz
Re: Помогите,первая прграмма на ассемблере...
не включится тут подтяжка. Включится только на PB6 и PB7.Init :
ser temp ; Определяем входы и выходы портов
out DDRD,temp ;
out DDRC,temp ;
ldi temp,0b00111111
out DDRB,temp
ldi temp,0b11110110 ;
out PortD,temp ;
ldi temp,0b11111111 ; Включаем подтяжку для входов портов
out PortB,temp ;
ldi temp,0b11111101 ;
out PortC,temp ; и задаем начальные состояния выходов
Не умеешь - не берись, но не взявшись не научишься...
-
Green-8282
- Родился
- Сообщения: 6
- Зарегистрирован: Вс авг 14, 2011 12:34:42
Re: Помогите,первая прграмма на ассемблере...
Я в курсе,просто забыл комментарий переписать, это не влияет на программу. Уже два дня бьюсь не могу найти причину,почему при запуске программа не сразу начинает правильно работать.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Помогите,первая прграмма на ассемблере...
Позволю себе позанудствовать:
1. Хотя я и не нашел в программе ни одного вызова п/программ или прерывания, и в данном конкретном случае не имеет значения, но ИМХО, правила хорошего тона быдлокодерства на асме - в процах не имеющих аппаратного стека, а таких 99,9% из всех АВРок, после метки Init/start/begin (кто как назвал начало кода
) делать инициализацию стека.
2. Хранить код для семисегментника в регистрах - это не простительная роскошь
3. Рекомендую почитать про прерывания и режимы работы таймеров, многое захочешь переделать по-другому.
1. Хотя я и не нашел в программе ни одного вызова п/программ или прерывания, и в данном конкретном случае не имеет значения, но ИМХО, правила хорошего тона быдлокодерства на асме - в процах не имеющих аппаратного стека, а таких 99,9% из всех АВРок, после метки Init/start/begin (кто как назвал начало кода
2. Хранить код для семисегментника в регистрах - это не простительная роскошь
3. Рекомендую почитать про прерывания и режимы работы таймеров, многое захочешь переделать по-другому.
- Реклама
Re: Помогите,первая прграмма на ассемблере...
Не хватаетGreen-8282 писал(а):... при подаче питания на индикаторах отображается всякая белеберда,но спустя какое-то время все нормально начинает показывать.
Код: Выделить всё
Init :
CLR Time3
CLR Time4
CLR ZH
OUT TCCR0,ZH ; остановить таймер
OUT TCNT0,ZH ; обнулить таймер
LDI TEMP,0b00000001
OUT SFIOR,TEMP ; очистить прескейлер
ldi temp,0b00000101 ; Включаем таймер с частотой деления 1024
out TCCR0,temp
Timer4:
;.
;.
;.
; CLR ZH ;адрес регистровой пары нужно объявлять полным
ldi ZL,20 ; Óñòàíàâëèâàåì ZL íà R20
-
Green-8282
- Родился
- Сообщения: 6
- Зарегистрирован: Вс авг 14, 2011 12:34:42
Re: Помогите,первая прграмма на ассемблере...
Спасибо akl, заработало.
-
Green-8282
- Родился
- Сообщения: 6
- Зарегистрирован: Вс авг 14, 2011 12:34:42
Re: Помогите,первая прграмма на ассемблере...
А что касается Вас уважаемый GP1 вы, я так думаю, безусловно гений, и спасибо Вам за ваши рекомендации.Но лично я считаю,что прежде чем собирать велосипед, то для начала надо собрать самокат а уж потом переходить к велосипеду. И я в этой теме просил помощи а не остроумных натаций....
Всем спасибо тема закрыта.
Всем спасибо тема закрыта.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Помогите,первая прграмма на ассемблере...
Сарказм принят.Green-8282 писал(а):А что касается Вас уважаемый GP1 вы, я так думаю, безусловно гений, и спасибо Вам за ваши рекомендации.Но лично я считаю,что прежде чем собирать велосипед, то для начала надо собрать самокат а уж потом переходить к велосипеду. И я в этой теме просил помощи а не остроумных натаций....
Всем спасибо тема закрыта.
Просто по личному опыту знаю, переучиваться труднее, чем сразу учиться правилам хорошего тона написания программ и продуманного использования ресурсов мк.
Очень рекомендую почитать обучалки на сайте ARV и DiHalt-а, очень познавательно и поучительно.
С уважением и наилучшими пожеланиями.
-
Green-8282
- Родился
- Сообщения: 6
- Зарегистрирован: Вс авг 14, 2011 12:34:42
Re: Помогите,первая прграмма на ассемблере...
Спасибо,мне понравилась книга Morton_D микроконтроллеры avr вводный курс, разжевано практически все и понятным языком, так что рекомендую всем кто хочет научиться работать с мк.



