#1 2016-02-21 19:27:39

seri0shka
Учасник
Зареєстрований: 2016-02-21
Повідомлень: 33

Работа с портами

Недавно начал изучать ардуино.
Часто использую светодиоды , распаянные на плате, для экспериментов.
Попробовал запись в порт (скорость гораздо выше, чем digitalWrite).
Скетч- обычная мигалка, сначала пробовал на 13 вывод- без проблем. Затем попробовал помигать ещё двумя, и почему-то не получилось (с помощью digitalWrite запросто). Согласно скетча должен изменяться уровень на всех выходах с D0 до D7 с частотой 1гц. Что интересно, на шести свободных выводах D2...D7 потенциал изменяется без проблем, а на D0 и D1,они же TXD и RXD (именно к ним распаяны ещё два светодиода) - не изменяется.
Что я делаю не так?

#include <avr/io.h>
#include <util/delay.h>
int main( void )
{
  DDRD = B11111111;     // выводы PD как выходы
  while (1) { // вечный цикл
    PORTD = B00000000; // низкий уровень на выводах
    _delay_ms(500); // задержка 500 миллисекунд
    PORTD = B11111111;  // высокий уровень на выводах
    _delay_ms(500);
  }
  return 0;
}

Неактивний

#2 2016-02-21 23:27:21

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Работа с портами

Неактивний

#3 2016-02-21 23:40:16

seri0shka
Учасник
Зареєстрований: 2016-02-21
Повідомлень: 33

Re: Работа с портами

Забыл написать, у меня ардуино нано (клон), кроме того, почему эти RN4B и RN4A не влияют при использовании digitalWrite?

Неактивний

#4 2016-02-21 23:56:26

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Работа с портами

Неактивний

#5 2016-02-22 00:00:07

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Работа с портами

maybe config PDSEL (?)  preset UART mode
pls view https://github.com/arduino/Arduino

Остання редакція NoName (2016-02-22 00:01:12)

Неактивний

#6 2016-02-22 00:52:18

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Работа с портами

https://github.com/arduino/Arduino/blob … _digital.c
ничего "такого"  не  увидел
попробуйте
pinMode(uint8_t pin, uint8_t mode)  для RX Tx настроить.

Неактивний

#7 2016-02-22 14:14:41

seri0shka
Учасник
Зареєстрований: 2016-02-21
Повідомлень: 33

Re: Работа с портами

Ещё проверил- с arduino uno скетч работает по всем выходам, а с Nano- как выше описал.

Неактивний

#8 2016-02-22 15:10:53

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Работа с портами

Предполагаю, что микросхемы ATmega на уно и нано разные. Мне попадались atmega168pa в tqfp корпусе, у которых 2 первых порта (TX, RX) настроенные на вход с включенной PULLUP внутренней подтяжкой имели на выводах 1-2 вольта. Все остальные порты нормально подтягивались к логической единице. Чтоб их подтянуть на лог. 1 пришлось ставить резисторы 2.7 кОм, при 3 кОм был лог. 0. Вот такие микросхемы бывают.

Неактивний

#9 2016-02-22 15:45:54

seri0shka
Учасник
Зареєстрований: 2016-02-21
Повідомлень: 33

Re: Работа с портами

На обеих платах ATmega328, схема подключения пинов TXD и RXD абсолютно идентичная (светодиод с резистором к плюсу питания, резистор на юсб-преобразователь CH340G). При загрузке скетча с digitalWrite обе платы работают одинаково (мигают). А вот с приложенным скетчем на этих выходах постоянно низкий уровень.

Неактивний

#10 2016-02-22 15:48:42

seri0shka
Учасник
Зареєстрований: 2016-02-21
Повідомлень: 33

Re: Работа с портами

А может высокий, уже не помню, но не меняется.

Неактивний

#11 2016-02-22 16:13:22

alex_dol
Учасник
Зареєстрований: 2015-12-28
Повідомлень: 196

Re: Работа с портами

Возьми исходник digitalWrite, сделай скетч на его основе. Если мигает - начинай пошагово упрощать/приводить к своему варианту и найдеш где собака зарыта.

Неактивний

#12 2016-02-22 20:17:48

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Работа с портами

// define some macros
#define BAUD 9600                                   // define baud
#define BAUDRATE ((F_CPU)/(BAUD*16UL)-1)            // set baud rate value for UBRR
  
// function to initialize UART
void uart_init (void)
{
    UBRRH = (BAUDRATE>>8);                      // shift the register right by 8 bits
    UBRRL = BAUDRATE;                           // set baud rate
    UCSRB|= (1<<TXEN)|(1<<RXEN);                // enable receiver and transmitter
    UCSRC|= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);   // 8bit data format
}

и это вся настройка для ATMega???

если бы мне было в облом читать доки то я сделал бы так )

    UBRRH  =0;
    UBRRL = 0; 
    UCSRB = 0; 
    UCSRC = 0;

Ваш вариант - неработающий pin  Rx/Tx  при ручном управления явно говорит о том что ножки сконфигурированы для других целей , например UART  в low_level_init например,
я бы предположил что при старте порты должны быть в третьем состоянии ) но кто знает этих кадров  что Arduino делали )  может порт для дебага подняли )


а вариант pinMode для неработающих ног делали?
и резисторы уберите что б отсечь ноги от компа.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму