LINUX.ORG.RU
ФорумTalks

[спецам по всему][arduino][asm] Помогите разобраться с портами I/O

 ,


0

0

Нашёл я скудное количество полуживых форумов в рунете о программировании МК, задал в одном из них вопрос, но долго не могу получить ответа. Знаю что на лоре сидят спецы по всему. Поэтому вопрос на миллионь долларов :) такой:

Имеем Arduino (Atmega168). Задача заставить мигать светодид подключённый к контакту Dig.1 (он же PORTD1). При этом проверено что на других контактах порта D (PORTD2-PORTD7) всё работает как надо.

Код:

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

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

.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    ; зацикливание программы

читай ERRATA к 168-му. в 169 был косяк с одним из портов, там всегда подтянут был пин к плюсу. связано что-то было с JTAG-ом.

scaldov ★★
()

• TXD/PCINT17 – Port D, Bit 1
TXD, Transmit Data (Data output pin for the USART). When the USART Transmitter is enabled,
this pin is configured as an output regardless of the value of DDD1.

Я не знаю как там в ардуине - вполне возможно у тебя пин сконфигурирован загрузчиком как usart tx так что в этом случае ему наплевать на твои дрыгания :) Еще вариант - выбило защитные диоды - они на каждой лапе стоят парами - катодами к плюсу - смотри Figure 13-1. I/O Pin Equivalent Schematic - это бывает :) Прозвони их в прямом и обратном направлении при выключенном питании.

monika
()
Ответ на: комментарий от scaldov

Даже если он подтянут это не помешает ему переключаться в противном случае это не просто эррата а пипец.

monika
()

попробуй таки явно сбросить бит TXEN = 0 в инициализации
это запрет выхода UART на пин PD1.

elipse ★★★
()
Ответ на: комментарий от elipse

Сделал, добавил в начало команды:
ldi temp,(0<<TXEN0)
sts UCSR0B,temp

Не помогло.

Хотел бы уточнить ещё, что вот такой кусочек запрограммированный и прошитый через Arduino-IDE работает на ура:
int ledPin = 1; // - как раз таки и есть PD1
void setup() // run once, when the sketch starts
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop() // run over and over again
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}

anterior
() автор топика
Ответ на: комментарий от anterior

>Сделал, добавил в начало команды:
ldi temp,(0<<TXEN0)
sts UCSR0B,temp
Не помогло.

Пипец двоешник - иди матчасть учи, у тебя стопудово загрузчик конфигурирует usart.

monika
()
Ответ на: комментарий от monika

Без обид, начинать всегда трудно так что мои советы:
1 Твоя конструкция (0<<TXEN0) выглядит красиво но абсолютно бесполезна так как полюбому будет равна 0 чего бы там не стояло справа от <<. Она имеет смысл например так (1<<TXEN0)
2 • Bit 3 – TXENn: Transmitter Enable n
Writing this bit to one enables the USART Transmitter. The Transmitter will override normal port
operation for the TxDn pin when enabled. The disabling of the Transmitter (writing TXENn to
zero) will not become effective until ongoing and pending transmissions are completed, i.e.,
when the Transmit Shift Register and Transmit Buffer Register do not contain data to be transmitted.
When disabled, the Transmitter will no longer override the TxDn port.

Чуешь чем пахнет ? Пока в буфере и сдвиговом регистре что-то есть usart не отключится. Частота твоего осциллятора не сравненно выше частоты baud usart - пока usart передает непереданный байт твой код пулей пролетает не успев отключить usart потому что он еще занят и не имеет эфекта на DDRD потому что порт все еще в режиме usart. Нужно отключить usart, дождаться что все передано а потом переключать направление порта.

monika
()
Ответ на: комментарий от monika

ну по 1-му пункту я сделал исключительно для визуальной наглядности, насчёт 2-го, сейчас бум пробовать)

anterior
() автор топика
Ответ на: комментарий от monika

по 2-му пункту попробовал, теперь тоже всё работает :) Пасиба)) Шоб я делал без вас) Не знаю, что-то сам и даже не допёрло меня сразу, надо было просто глубже думать))

anterior
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.