Jump to content
vseriousv

Usart, Attiny2313, Проблема С Отправкой Данных(Слова)

Recommended Posts

Здравствуйте! Пытаюсь отправить слово с МК Avr attiny2313 через com port и выловить его программой, пока что просто программой "терминал".

Прошу помощи! Почему присылаются какие-то арабские символы или что угодно, но не то, что я отсылаю?

Сейчас я думаю дело в частоте, но как бы я ее точно не пытался откорректировать, все равно присылается какая-то белиберда.

# define F_CPU 3993600UL
#include <avr/io.h>
#include <avr/iotn2313.h>
#include <avr/interrupt.h>

void USART_Transmit( unsigned char data );
void USART_Init (unsigned int baud);

void USART_Init (unsigned int baud)
{
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud; // 9600
UCSRB = (1<<RXEN)|(1<<TXEN); //|(1<<TXCIE)|(1<<UDRIE)
UCSRC = (1<<USBS)|(1<<UCSZ0); //|(1<<UPM1)|(1<<UPM0)
}

void USART_Transmit( unsigned char data )
{
while ( !(UCSRA & (1<<UDRE)) );
UDR = data;
}

int main(void)
{
//const unsigned int BAUDRATE = 9600;
//const unsigned int BAUDDIVIDER = ((F_CPU/(16UL*BAUDRATE))-1);

USART_Init(25);

while(1)
{
USART_Transmit('h');
USART_Transmit('e');
USART_Transmit('l');
USART_Transmit('l');
USART_Transmit('o');
USART_Transmit('1');
USART_Transmit('2');
USART_Transmit(0x01);
USART_Transmit(0x02);
USART_Transmit(0x0A);
USART_Transmit(0x0D);
}
}

ouTaVWc.png

Xx6HG3L.png

Share this post


Link to post
Share on other sites

И как же вы устанавливаете скорость обмена?

void USART_Init (unsigned int baud)

{

UBRRH = (unsigned char)(baud>>8);

UBRRL = (unsigned char)baud; // 9600

UCSRB = (1<<RXEN)|(1<<TXEN); //|(1<<TXCIE)|(1<<UDRIE)

UCSRC = (1<<USBS)|(1<<UCSZ0); //|(1<<UPM1)|(1<<UPM0)

}

USART_Init(25);

Что вы настраиваете здесь? Формат передаваемого слова 2 стоповых бита и размер слова 6 бит?

UCSRC = (1<<USBS)|(1<<UCSZ0); //|(1<<UPM1)|(1<<UPM0)

Как это соотносится с настройками терминальной программы?

Edited by Sergey-Ufa

Share this post


Link to post
Share on other sites

Спасибо за замечание, я просто перенес весь код из даташипа.

Ну как бы вот исправил в коде, надеюсь правильно: чтобы было 8 бит и настройки перенес в мэйн, так мне кажется проще будет.

Но к сожалению все равно терминал не то показывает!

Посмотрите еще пожалуйста, может какие еще замечания будут.

/*
*USART.c
*
* Author: Nous
*/
# define F_CPU 3993600UL

#include <avr/io.h>
#include <avr/iotn2313.h>
#include <avr/interrupt.h>
void USART_Transmit( unsigned char data );
void USART_Init (unsigned int baud);

void USART_Transmit( unsigned char data )
{
while ( !(UCSRA & (1<<UDRE)) );
UDR = data;
}

int main(void)
{
const unsigned int BAUDRATE = 9600;
const unsigned int BAUDDIVIDER = ((F_CPU/(16UL*BAUDRATE))-1);

UBRRH = 0;
UBRRL = BAUDDIVIDER;  // 9600
UCSRB |= (1<<RXEN)|(1<<TXEN); //|(1<<TXCIE)|(1<<UDRIE)
UCSRC |= (1<<UCSZ0)|(1<<UCSZ1); //(1<<USBS)|(1<<UPM1)|(1<<UPM0)

while(1)
{
 USART_Transmit('h');
 USART_Transmit('e');
 USART_Transmit('l');
 USART_Transmit('l');
 USART_Transmit('o');
 USART_Transmit('1');
 USART_Transmit('2');
 USART_Transmit(0x01);
 USART_Transmit(0x02);
 USART_Transmit(0x0A);
 USART_Transmit(0x0D);
}
}

Rphr4D7.png

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

Попробуйте определить BAUDDIVIDER так

#define BAUDRATE  9600
#define BAUDDIVIDER  ((F_CPU/(16UL*BAUDRATE))-1)

Не знаю как в Протеусе, а в реальном железе такой код всегда рабочий.

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

У тини2313 есть фьюз CKDIV8. По умолчанию он запрограммирован. Если у вас такт 4МГц, то с этим установленным фьюзом реально будет 0,5МГц. Снимите его.

Share this post


Link to post
Share on other sites

Да, я уже убирал его, вот тут. Скорее всего дело в протеусе. Уже купил мк, буду сегодня паять.

4vpKYtJ.png

Вот с этим кодом.

/*
*USART.c
*
* Author: Nous
*/
# define F_CPU 8000000UL
#define BAUDRATE 9600
#define BAUDDIVIDER ((F_CPU/(16UL*BAUDRATE))-1)
#include <avr/io.h>
#include <avr/iotn2313.h>
#include <avr/interrupt.h>

unsigned char Temp;
void USART_Transmit( unsigned char data )
{
while ( !(UCSRA & (1<<UDRE)) );
UDR = data;
}
int main(void)
{

UBRRH = 0;
UBRRL = BAUDDIVIDER; // 9600
UCSRB |= (1<<RXEN)|(1<<TXEN);
UCSRC |= (1<<UCSZ0)|(1<<UCSZ1);

while(1)
{
USART_Transmit('h');
USART_Transmit('e');
USART_Transmit('l');
USART_Transmit('l');
USART_Transmit('o');
USART_Transmit('1');
USART_Transmit('2');
USART_Transmit(0x01);
USART_Transmit(0x02);
USART_Transmit(0x0A);
USART_Transmit(0x0D);
}
}

Edited by vseriousv

Share this post


Link to post
Share on other sites

Ну вообщем на железе вот что получается:

d88oGeZ.png

Помогите пожалуйста с фьюзами при программирование в uniprof, что-то я понять не могу, правильно ли я делаю:

ISBR6iu.png

Edited by vseriousv

Share this post


Link to post
Share on other sites

В программе выставлена частота 8МГц, поэтому фьюзы для унипроф должны быть так

post-135787-0-39860800-1428317063_thumb.png

Share this post


Link to post
Share on other sites

В программе частота 4 МГц, поэтому CKSEL0, 2, 3 = 0, CKSEL1 = 1 и CKDIV8 = 1. Ноль запрограммировано, один - незапрограммировано. Для Унипроф галочка соответствует 0.

Share this post


Link to post
Share on other sites

Может о разных программах говорим, но

# define F_CPU 8000000UL

из него рассчитано значение UBRRL = 51 для частоты 8МГц. В унипроф галочка - это 1 по даташиту.

Share this post


Link to post
Share on other sites

Получается, что о разных. ТС оказывается успел сменить частоту. Первоначально было

# define F_CPU 3993600UL

Помогите пожалуйста с фьюзами при программирование в uniprof, что-то я понять не могу, правильно ли я делаю:

Получается, что CKDIV8 то у вас все таки запрограммирован.

Edited by Sergey-Ufa

Share this post


Link to post
Share on other sites

...Для Унипроф галочка соответствует 0.

...В унипроф галочка - это 1 по даташиту.

Пока еще МК не завалили, обратите внимание на SPIEN.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • By IgnatiusF
      Не удается проинициализировать работу UART2 на скорость 19200 бод.
      Не вызывается прервание совсем, отсылаются постоянно нули на всех скоростях, если ставить System clock switch в 01 (HSE). При работе от RC генератора выдает уже просто не то, что нужно. 
      Кварц рабочий, и вообще все работает, при использовании библиотек HAL.
      SysTick выключил потому, что были подозрения на конлфикт приоритетов.
      Внизу представлена именно та часть кода программы, которая не работает, то есть сам UART.
      Проект скоро сдавать, а использовать готовую библиотеку HAL не хочется совсем, уже несколько дней парюсь и не могу найти проблему. Попробовал разобраться что пишет в регистры HAL, однако не смог т.к. не хватает знаний, значения регистров все такие же, кроме PLL (не используется) и RCC_CR1 (в HAL почему-то полностью равен 0). Проверял передачей данных по UART. Регистр BRR не удалось считать т.к. он только для записи. У меня записано так:
      USART1->BRR = 0x412;  //20MHz/16/19200 = 65,104.
      Где искать следует ошибку?
    • By LegionKC
      Добрый день.
      Экспериментирую с платой TP4056 и MK ATmega8, конкретнее - пытаюсь собрать простенькое зарядное устройство с выводом параметров при зарядке/разрядке на АЦП МК. Для измерения тока нашел ACS712. Думаю, что получится выводить ток при зарядке (т.е. когда идет питание на TP4056 и нагрузка отключена) и при разрядке (питание выключено, нагрузка подключена). Нагрузка - резистор. Возникла проблема с измерением напряжения на АКБ. Вернее, проблема с отсутствием идей как это сделать. Может какую-нибудь схему делителя напряжения нужно сделать? Прошу помочь советом. Схему из пэинта прилагаю.
      Спасибо.
       

    • By Cheshire Cat
      Здравствуйте, только начинаю изучать программирование мк. Я уже задавал этот вопрос в моих прошлых схемах мне отвечали что-то типа "любой стабилизрованый источник постоянного напряжения", или кидали схему такого источника. Можно назвать мне конкретное устройство? В общем то что я смогу забить в гугл и приписать купить. 

      Я уже больше двух месяцев жду пока мне придут с aliexpress детали для маленького лабараторного блока, но этот вариант может разбиться о кривизну моих рук.  Хочу просто купить такой источник и наконец заняться непосредственно МК. 
×
×
  • Create New...