Isaev_ivan

Код Передачи По Usart Для Msp430(Ассемблер)

2 сообщения в этой теме

Isaev_ivan    0

Доброго времени суток всем!

Недавно возникла потребность передачи данных из микроконтроллера в ПК. Написал код на ассемблере, опираясь на Code_examples от TI, и то, что получилось, приведено ниже:

#include "msp430F1232.h"

RSEG CSTACK

DS16 0

RSEG CODE

;---------------------------------------------------------------------

; Установка тактирования от кварца

;---------------------------------------------------------------------

RESET mov #SFE(CSTACK),SP

mov #WDTPW+WDTHOLD,&WDTCTL ;OSTANOVKA WDT

BIC #OSCOFF, SR ; tAKTIROVANIE OT KVARCA

BIS.B #XTS, BCSCTL1

L1 BIC.B #OFIFG, &IFG1

MOV #0FFh, R15

L2 DEC R15

JNZ L2

BIT.B #OFIFG, &IFG1

JNZ L1

BIS.B #SELM_3, &BCSCTL2

;--------------------------------------------------------------------

; Инициализация USART

;--------------------------------------------------------------------

mov.b #200,R7

bis.b #SWRST,&UCTL0;

bis.b #030h,&P3SEL; P3.4,5 - USART

bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема

bis.b #CHAR, &UCTL0; Формат данных 8-разрядный

mov.b #SSEL0, &UTCTL0; UCLK=ACLK

mov.b #0100b,&UBR00; 5MHz/19200 = 260.4 = 100000100b

mov.b #0001b,&UBR10;

mov.b #0000, &UMCTL0; Без модуляции

bic.b #SWRST,&UCTL0; Сброс USART не включен

bis.b #URXIE0+UTXIE0,&IE2

bis.b #UTXIFG0,&IFG2; Флаг гтовности к прерыванию

Loop bis.w #LPM3+GIE,SR

nop

jmp Loop

;-------------------------------------------------------------------

USART0TX_ISR;

;-------------------------------------------------------------------

mov.b R7, &TXBUF0;

reti

;--------------------------------------------------------------------

; Векторы прерываний

;--------------------------------------------------------------------

COMMON INTVEC

ORG RESET_VECTOR

DW RESET

ORG USART0TX_VECTOR

DW USART0TX_ISR

END.

Из программы видно, что я просто хочу передать содержимое R7 в ПК. Трудность заключается в том, что это значение передается не всегда. Запускаю программу, которая считывает информацию с com порта (программа работает 100% правильно), она в тестовый файл записывает значение 200(правильное значение). В следующий раз, после перезапуска программы, в текстовый файл она записывает величину 14. Потом снова 200. И я не пойму, что с ней происходит! Кто знает, отзовитесь пожалуйста :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Cobban    110

Вот это непонятно зачем:

bis.b #UTXIFG0,&IFG2; Флаг гтовности к прерыванию

Как только буфер передатчика становится пустым флаг выставляется автоматически.

В остальном проблем с настройками сходу не заметил, кроме того что в регистр модуляции вписать "4". Если есть осциллограф, то посмотрите на нём что передаётся. Проверьте кабель. Можно попробовать понизить скорость.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: mine1
      Наткнулся на библиотеку hal_xxx.c от TI для MSP430.
      Ни как не могу найти, где взять взять полное семейство этих библиотек. Поделитесь ссылочной  
      hal_UCS.c
    • Автор: Elite_Knight
      Помогите сориентироваться с чего начать решение вопроса. Или возможно есть уже похожие написанные программы. 
      Нужно для микроконтроллера семейства MCS-51 составить программу, которая выполняет логическую операцию "И" над числами 5416 и 8716.
      Указанные числа необходимо предварительно записать в регистр R6 и R7 нулевого банка регистров, а результат операции разместить в регистр R7 второго банка регистров.
      Составить двоичный и шестнадцатеричный код каждой команды.
    • Автор: Speed Fighter
      Здарова, инженеры. 
      Не подсобите студню с заданием? 
      Задание, если кому интересно:
      Я подчитнул некоторую теорию, про индикацию, матричную клавиатуру и её опрос. Но вот возникли след. вопросы/трудности:
      1. В случае использования только двух кнопок, целесообразно ли подключать кнопку непосредственно к выводу микроконтроллера? Насколько сильно это упростит решение задачи?
      2. Можно ли где-то посмотреть пример реализации таких клавиатур именно на PIC18? (Уж очень у меня не хватает практики по программированию устройств, всегда на уровне любителя работал на крестах и ему подобных языках для решения мелких проблем и забав)
      3. Можно ли где-то смоделировать моё творение, т.е. посмотреть работоспособность? (MPLAB, proteus, xlinx)
      4. На чем в данном случае рациональнее "кодить" - язык ассемблера или сишка?
      Есть некоторый алгоритм для обработки дребезка контактов:
      https://pp.userapi.com/c840123/v840123038/23a0/IjXofwjEmuc.jpg
      Есть некоторая схемка, которую я в инете откопал:
      https://pp.userapi.com/c840123/v840123038/23a7/-rD4tgCfvLs.jpg
      Так же нашел небольшой код на просторах интернета (увы, он для AVR) :
       
      Благодарю за каждый пендель в нужном направлении, тема-то хорошая.
       
    • Автор: Карен
      Такая задача, собрал схему с сайта в протеусе с микрокоонтроллером, там же на этом сайте есть программаа, но есть одно, надо написать алгоритм это программы(блок схему), аж на уровне регистров, а прога написана в этом алооритм билдере, мб кто-нибудь шарит и сможет мне помочь? или есть вариант перевести это в обычныый язык ассемблера??

    • Гость CrazyRedMan
      Автор: Гость CrazyRedMan
      Разработать модель в среде симуляции Proteus  на базе микроконтроллера AtMega128  и написать программу на языке ассемблера для решения следующей задачи:
      1. Изменяя положение ручки регулятора напряжения переменным резистором высвечивать на одном разряде трехразрядного семисегментного индикатора цифру от 0 до 9.
      2.    При нажатии кнопки 1 на клавиатуре выдавать звуковой сигнал с пьъезодинамика с частотой 1 кГц. При нажатии на кнопку 2 – с частотой 2 кГц, при нажатии на кнопку 3 – с частотой 3 кГц.