Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > AVR_ASM


Автор: pettimm 13.10.2007, 22:29
 Здравствуйте,уважаемые програмисты,братья и сестры!
Подскажите пожалуйста почему не работает цыкл с метки Start2 ,если обнулять таймер0 (ldi temp,0x00;out TCNT0,temp)сразу после метки  Start2, проверял много раз на реальном контроллере Atmega8 . Спасибо.Петр.

.device     atmega8
.nolist
.include  "m8def.inc"
.list

; Îáúÿâëåíèÿ

.def  temp=  r16
.def  temp1=  r18

Init  :      ;Îïðåäåëåíèå  âõîäîâ\âûõîäîâ  è  èõ íà÷àëüíûõ çíà÷åíèé

                      ;Êîíôèãóðàöèÿ ïîðòîâ
;êîíôèãóðàöèÿ ïîðòà Â
Ldi  temp , 0b00111000
Out  DDRB , temp
; è  èõ íà÷àëüíûõ çíà÷åíèé
Ldi  temp , 0b00000000
Out  PORTB , temp
;êîíôèãóðàöèÿ ïîðòà C
Ldi  temp , 0b00111110
Out  DDRC , temp
; è  èõ íà÷àëüíûõ çíà÷åíèé
Ldi  temp , 0b00001111
Out  PORTC , temp
     ;êîíôèãóðàöèÿ ïîðòà D
Ldi  temp , 0b11111011
Out  DDRD , temp
Ldi  temp , 0b01000100
Out  PORTD , temp

Rjmp  Start

; Îáðàáîòêà ïðåðûâàíèé

; ******

Start :              ;Íà÷àëî ïðîãðàììû

;èíèöèàëèçàöèÿ ñòåêà

ldi   temp,low (RAMEND)
out   SPL,temp
ldi   temp,high (RAMEND)
out   SPh,temp

on:
;êîíôèãóðàöèÿ òàéìåðà  sk/1024= 6347,65625 ðàç â ñåê.
ldi temp,0b00000101

out tccr0,temp


Start2:
;ldi temp,0x00
 ;out TCNT0,temp
in temp,TCNT0
cpi temp,48
breq svet1
 
 rjmp Start2

svet1:
       ldi temp1,0b00001000
       out portd,temp1

ldi temp,0x00
 out TCNT0,temp
 
Start3:
in temp,TCNT0

cpi temp,48
breq svet2
rjmp Start3
svet2:
ldi temp1,0b00000000
       out portd,temp1

ldi temp,0x00
 out TCNT0,temp

rjmp Start2

Автор: cardinal 13.10.2007, 23:34
1. Пользуйся кнопкой "код".

2. Значит срабатывает:
Код

breq svet1


А зачем ты на ассемблере пишешь (если можно AVR Studio + GCC)?

Автор: pettimm 13.10.2007, 23:51

Здравствуйте ,Bradypus ! Спасибо за ответ, я пишу в AVR Studio4 ,но будьте добры подскажите что означает GCC ? Опыта маловато...  Ассемблер мне нравится...

Реально вижу по светодиоду(+наушником слышу генератор):
если " ldi temp,0x00  , out TCNT0,temp "    заремляно, то срабатывает  "breq svet1" ,
а если нет - то не срабатывает (светодиод не горит).
Спасибо Петр.
 
Start2:
;ldi temp,0x00         
 ;out TCNT0,temp
in temp,TCNT0
cpi temp,48
breq svet1
 
 rjmp Start2

svet1:
       ldi temp1,0b00001000
       out portd,temp1

ldi temp,0x00
 out TCNT0,temp
 

Автор: AVR32 14.10.2007, 00:09
Замени инструкции breq на brsh

Автор: pettimm 14.10.2007, 00:29
Не помогло ... ложусь спать,до завтра ... у нас 00:45 ,Украина.

Автор: cardinal 14.10.2007, 01:37
Смотришь тут
http://winavr.sourceforge.net/
, качаешь, создаешь С проект в AVR Studio и лишаешься многих проблем.

И еще раз! Обрати (со мной тоже можно на ты) внимание на кнопку "код" над сообщением!!!

А ник у меня cardinal (а bradypus - это статус)... smile 

Автор: AVR32 14.10.2007, 20:53
Передвинь метку Start2
Код

Start2:
ldi temp,0x00
out TCNT0,temp

на другое место
Код

ldi temp,0x00
out TCNT0,temp
Start2:

Иначе ты постоянно в цикле обнуляешь таймер

Автор: pettimm 15.10.2007, 00:06

Спасибо cardinalu  за совет  , а  avr32  ответил правильно  но сейчас другая проблема возникла : когда обнуляю таймер  в метке "Perehod1" то тоже прекращается работа программы , а без обнуления в метке "Perehod1, все работает. Обнуление нужно для точности. Подскажите пожалуйста причину... Спасибо.

                    ldi r19,0xff
                   ldi r20,0x88
Pausa15sek:

 in temp,TCNT0
     cpi temp,0x88
breq Perehod1
rjmp Pausa15sek

Perehod1:
   dec r19
   cpi r19,0
   ;ldi temp,0x00
 ;out TCNT0,temp
   brne Pausa15sek

    dec r20
    cpi r20,0
    brne Pausa15sek

rjmp Generator

Generator:

in temp,TCNT0
cpi temp,48
brsh svet1
 
 rjmp Generator

svet1:
       ldi temp1,0b00001000
       out portd,temp1

ldi temp,0x00
 out TCNT0,temp
 
Start3:
in temp,TCNT0

cpi temp,48
breq svet2
rjmp Start3
svet2:
ldi temp1,0b00000000
       out portd,temp1

ldi temp,0x00
 out TCNT0,temp

rjmp Generator

Автор: AVR32 15.10.2007, 18:43
Опять те же грабли, обнуляешь таймер в цикле!
Код

Perehod1:
   dec r19
   cpi r19,0
   ;ldi temp,0x00
 ;out TCNT0,temp
   brne Pausa15sek

    dec r20
    cpi r20,0
    brne Pausa15sek

rjmp Generator

Generator:

Сделай так
Код

Perehod1:
    dec    r19
    cpi    r19, 0
    brsh    Pausa15sek
    dec    r20
    cpi    r20,0
    brsh    Pausa15sek

    ldi    temp, 0x00
    out    TCNT0,temp

Generator:


Автор: pettimm 15.10.2007, 21:54
А вот и нет ....Глаза открыл ГОСПОДЬ  , просто   обнуление в метке "Perehod1",
сильно удлиняет время данного цыкла и  я немогу дождаться перехода на метку 
"Generator". 
                     Вобщем достаточно  использовать один регистр (  r19) , при частоте кварца 
6,5 Мгц и при ниже приведенных цыфрах длительность подпрограммы  "Pausa15sek" примерно и будет=15 сек.
 Спасибо cardinal  и  AVR32   , успехов вам...

on:ldi r19,0xff
    ;ldi r20,0x88
;êîíôèãóðàöèÿ òàéìåðà  sk/1024= 6347,65625 ðàç â ñåê.
ldi temp,0b00000101
out tccr0,temp

Pausa15sek:

     in temp,TCNT0
     cpi temp,0xff
breq Perehod1
rjmp Pausa15sek

Perehod1:
   dec r19
   cpi r19,0
                l di temp,0x00

                 out TCNT0,temp
   brne Pausa15sek

   ; dec r20
   ; cpi r20,0
   ; brne Pausa15sek

rjmp Generator

Generator:


Автор: cardinal 15.10.2007, 22:41
Спасибо! Тебе тоже - успехов! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)