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


Автор: anterior 26.4.2009, 06:17
Есть Atmega168. Там порт PD1 (PORTD) имеет несколько альтернативных функций - (PCINT17/TXD). Я соеденил этот контакт (PD1) со светодиодом, набрал такой код:
Код

.device ATmega168
.include "m168def.inc"
.include "../include/sys.inc"

.equ PIN_LED    = PD1    ; ножка на которую указывает светодиод (13)

.CSEG

.org    0x0000        ; начальный адрес программы
    rjmp _RESET

.include "../include/delay.asm"

;****************************************************************
; начало программы
;****************************************************************
_RESET:    
    ; инициализация стека
    stack_init
    /* настройка светодиода на вывод */
    sbi    DDRD,PIN_LED    ; регистр направления данных (1 - вывод)
    cbi    PORTD,PIN_LED    ; регистр данных - LOW, светодиод выключен

    loop:
        cbi PORTD,PIN_LED    ;  выключить светодиод
        m_delay 500    ; выполнить задержку на 0,5 сек
        sbi PORTD,PIN_LED    ; включить светодиод
        m_delay 500    ; выполнить задержку на 0,5 сек
    rjmp  loop    ; зацикливание программы


По идее при выполнении этой программы светодиод должен мигать, но этого не происходит. Если я переставлю светодиод на другой контакт, например PC5 (PORTC), и соответственно аналогично отредактирую код, то всё работает.

Как сделать чтобы работало и на PD1?

Автор: sally555 26.4.2009, 08:52
На любом выводе порта D такая штука?
Прежде всего я всегда выключаю при программировании JTAG интерфейс программирования,фьюз-битом JTAGEN.потому как он изначально включен и влияет на определенные порты,сейчас не помню какие.И еще PD1 задействован как выход USART,так что при работе с ним как с портом USART должен быть выключен.

Автор: anterior 26.4.2009, 09:34
Цитата(sally555 @ 26.4.2009,  08:52)
На любом выводе порта D такая штука?
Прежде всего я всегда выключаю при программировании JTAG интерфейс программирования,фьюз-битом JTAGEN.потому как он изначально включен и влияет на определенные порты,сейчас не помню какие.И еще PD1 задействован как выход USART,так что при работе с ним как с портом USART должен быть выключен.

Нет, только на PD0, PD1. А как выключить USART? Я пробовал сделать так, добавить в начало:
Код

ldi temp,(1<<PRUSART0)
sts PRR,temp


Но ничего не помогло.

И ещё, дело в том что я использую плату Arduino. Для него вобще-то идёт своя IDE, где программы пишутся на Processing/Wiring. Там я побробовал написать что-то подобное и оно работало конкретно для PD1. Но я хочу писать программы на асме, поэтому Arduino-IDE вместе с Wiring'ом не использую, использую AVRStudio.

Автор: sally555 27.4.2009, 06:40
Отключение передачи USART,регистр UCSRB,  бит TXEN = 0,
Отключение приема USART,регистр UCSRB,  бит RXEN = 0.
Примерно так:
Код

CBI UCSRB,RXEN
CBI UCSRB,TXEN

На плате Arduino выводы PD0 и PD1 соединены с модулем-преобразователем USB->RS232,скорей всего из- за этого и не работает.

Автор: anterior 27.4.2009, 14:25
Цитата(sally555 @ 27.4.2009,  06:40)
Отключение передачи USART,регистр UCSRB,  бит TXEN = 0,
Отключение приема USART,регистр UCSRB,  бит RXEN = 0.
Примерно так:
Код

CBI UCSRB,RXEN
CBI UCSRB,TXEN

На плате Arduino выводы PD0 и PD1 соединены с модулем-преобразователем USB->RS232,скорей всего из- за этого и не работает.

Спасиб, понял) Следующий код помещённый в начало RESET'a помог:
Код

clr temp
sts UCSR0B,temp

wait1:
    lds temp,UCSR0A
    sbrs temp,UDRE0
    rjmp wait1


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