Isaev_ivan

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

2 posts in this topic

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. И я не пойму, что с ней происходит! Кто знает, отзовитесь пожалуйста :)

Share this post


Link to post
Share on other sites
Cobban    137

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Similar Content

    • By SerYoga72
      Приветствую всех.
      Подскажите не совсем программисту (или совсем не программисту) как грамотно реализовать программный SPI. МК CC430F5137 + OLED дисплей WEH000802A от Winstar. Данные 10 бит. Аппаратный в контроллере позволяет только 8, выход свой написать. Написал, но мне это не нравиться, знаю что можно намного проще, но не нахожу решения. Да и как то странно с портами в этом контроллере работается, нельзя (или не знаю как) данные напрямую в порт кидать, типа P1.0 = 1; А только BITами оперировать??? Вот что у меня получилось, смеяться разрешается ))
      // Обработчик дисплея // // Маразм для програмного SPI void SCL(uchar b) { if (b==1) (P1OUT |= BIT7); else P1OUT &= ~BIT7; } //Строб void CSB(uchar b) { if (b==1) (P1OUT |= BIT4); else P1OUT &= ~BIT4; } //Выбор чипа void SDI(uchar b) { if (b==1) (P1OUT |= BIT6); else P1OUT &= ~BIT6; } //Передаваемые данные void SDO(uchar b) { if (b==1) (P1OUT |= BIT5); else P1OUT &= ~BIT5; } //Принимаемые данные // Вывод управляющей команды для дисплея void WriteCMD(uchar CMD) { uchar i; CSB(0); SDI(0); _delay_cycles(100); SCL(0); _delay_cycles(100); SCL(1); SDI(0); _delay_cycles(100); SCL(0); _delay_cycles(100); SCL(1); _delay_cycles(100); for(i=0;i<8;i++) { uchar t = ((CMD>>(7-i)) & 0x01); // Как уйти от переменной t ????? SDI(t); SCL(0); _delay_cycles(100); SCL(1); _delay_cycles(100); } CSB(1); } /*============================================ Вывод одиночного символа на дисплей ============================================*/ void WriteOneDAT(uchar DAT) { uchar i;; CSB(0); SDI(1); _delay_cycles(100); SCL(0); _delay_cycles(100); SCL(1); SDI(0); _delay_cycles(100); SCL(0); _delay_cycles(100); SCL(1); _delay_cycles(100); for(i=0;i<8;i++) { uchar t =((DAT>>(7-i)) & 0x01); SDI(t); SCL(0); _delay_cycles(100); SCL(1); _delay_cycles(100); } CSB(1); } Технически разница между Командой и Данными в первом бите SDI и объединить эти две функции наверно не проблема, но я уверен что это можно написать как то грамотнее ...  Как в этом контроллере с портами работать кроме как P1OUT |= BIT1 ??? Нельзя как то типа P1OUT_1 = 1;  ?? Где то в буржуйской литературе мапинг какой то проскакивал, но там я вообще не вьехал про что это, для чего это....
      Заранее Всем Благодарен.
       
       
       
       
       
    • By Vlad Zubarev
      Доброго времени суток!  Кто разбирается с Atmega128,  ассемблером и кому не жалко времени,  пожалуйста помогите. 
      Как можно корректировать скорость падения маятника (он должен постеменно набирать скорость падения и плавно замедляться к верхней точке)... Какие данные нужно менять?!  Спасибо! 
      логин маятник 2.zip

    • By mine1
      Наткнулся на библиотеку hal_xxx.c от TI для MSP430.
      Ни как не могу найти, где взять взять полное семейство этих библиотек. Поделитесь ссылочной  
      hal_UCS.c
    • By Elite_Knight
      Помогите сориентироваться с чего начать решение вопроса. Или возможно есть уже похожие написанные программы. 
      Нужно для микроконтроллера семейства MCS-51 составить программу, которая выполняет логическую операцию "И" над числами 5416 и 8716.
      Указанные числа необходимо предварительно записать в регистр R6 и R7 нулевого банка регистров, а результат операции разместить в регистр R7 второго банка регистров.
      Составить двоичный и шестнадцатеричный код каждой команды.
    • By 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) :
       
      Благодарю за каждый пендель в нужном направлении, тема-то хорошая.
       
  • Сообщения

    • Вы не сможете не применять эфир из этой жижи внутрь, он слишком летуч для этого.   А результаты известны - глюки и болезни сердца.  
    • Оставляем на стеке адрес. Остается вопрос - зачем два раза. Сишную программу можно увидеть?
    • Россияне, осужденные в США в 2011-2015 годах 4 декабря 2015 года министерство юстиции США сообщило, что гражданин России Ирек Хамидуллин приговорен судом США к пожизненному заключению и дополнительно к 30 годам тюрьмы за нападение на американских военных в составе движения "Талибан" в Афганистане.  30 сентября 2015 года российский программист Дмитрий Белороссов приговорен судом в Атланте к 4,5 годам тюрьмы за кибермошенничество.  31 января 2015 года гражданин России Максим Чухарев осужден в Нью-Йорке по делу об отмывании денег и приговорен к трем годам лишения свободы.  9 октября 2014 года российский гражданин Дмитрий Устинов приговорен окружным судом штата Делавэр к 18 месяцам тюрьмы за попытку экспортировать из США в Россию без лицензии приборы ночного видения.  В начале апреля 2013 года Федеральный суд округа Колумбия приговорил к семи годам и трем месяцам заключения россиянина Владислава Хорохорина, известного также как BadB, по обвинению в причастности к мошенничеству с использованием кредитных карт. 6 апреля 2012 года Федеральный суд Нью-Йорка приговорил россиянина Виктора Бута к 25 годам тюремного заключения, признав его виновным в намерении продать партию вооружения колумбийской леворадикальной группировке "Революционные вооруженные силы Колумбии" (FARC). 7 сентября 2011 года суд в США приговорил россиянина Константина Ярошенко к 20 годам лишения свободы за участие в переброске по воздуху четырех тонн кокаина из Южной Америки в Африку, а оттуда — в США. ---------------------------------------- И в процессе представленья создается впечатленье, что .... Америкосы в первую очередь русских сажают!!!  
    • Работать будет, но не очень красиво - примерно на первой трети шкалы регулировки ток накачки будет достигать максимума и дальше не меняться. Можно попробовать подобрать номиналы резисторов 240к и 470к, чтобы шкалу регулировки "искривить" до примерно приемлемой. ШИМ брать с регулировки подсветки, т.к. регулировка тока накачки в этом варианте прибора не предусмотрена.  
    • Всегда оплачивал обычной дебетовой картой и не заморачивался. Вот эта вот сверхбдительность только мешает в реальной жизни. Вы же в "Пятерочке" не через яндекс кошелек оплачиваете небось.
    • Америкосы в первую очередь русских сажают,и кричат на каждом углу-вмешательство,наши понты боятся трогать,тогда это так и будет всегда