Roteiro 7 EA870 2S2009

De DCA-Wiki

Contents

Roteiro 7 - Trasmissão Serial e Conversões ASCII/Hexadecimal/Decimal

  • Continuação com a transmissão serial, mas utilizando C
  • Conversões básicas

Agradecimento

O desenvolvimento deste roteiro teve a grata contribuição de:

Alexandre Passos, Carolina Fransciscangelis, Guilherme Zalewski (buzzag@gmail.com) e Pedro Augusto (okaitt@gmail.com),

Introdução ao Experimento de Hoje

  • O objetivo deste experimento é realizar a execução do programa apresentado para ilustrar conceitos referente à caracteres codificados em ASCII e modos de conversão de números representados em bases diferentes para seqüências de caracteres ASCII, e transmissão serial para o Hyper Terminal (HT) em C.

Aviso entre asm e C

Detalhe: Tem muita gente errando nesse programa na seguinte linha em BOLD...

  • UCR0 =0x30;
  • UCR0 = 0x20;
  • UCR0 = 0x10;
  • UMR10 = 0x13;
  • UMR10 = 0x07;
  • UCSR0 = 0%11011101;
  • UISR0 = 0x0;
  • UBG10 = 0x1;
  • UBG20 = 0x04;
  • UCR0 = 0x05000000;

No caso do assembly, precisamos do valor 0x05000000 valor para nao precisarmos deslocar o dado recebido do registrador UCR0 ao fazer o OR. Porém em C, estaremos jogando um long em um unsigned char (8bits). Desta forma o valor correto nao é jogado na inicialização.

No caso, deve-se jogar apenas *UCR0 = 0x05;

Um metodo mais correto seria jogar o seguinte codigo: *UCR0 = (0x05 | *UCR0);

O trecho em verde é uma duvida minha, ja que o operador % é mod em C, certo? Logo, eu colocaria o valor 0xDD.

Rodei esse programa hoje e funcionou certinho, em alguns alunos eu dei a dica para mudar para 0x05 e funcionou também!

Outra problema comum foi o uso errado da condicao de envio para a serial. Devemos testar a condicao do terceiro bit do UCR0, logo, fazemos um AND lógico em C ( lala & lele ) com 0x04 e entao testamos...!

Ate mais!

Guilherme

Roteiro de Estudos

  • 1. O que é tabela ASCII e para que serve?
  • 2. Quantos bits são usados no código ASCII?
  • 3. Quais são os códigos ASCII dos caracteres ‘G’ e ‘g’?
  • 4. Explique um método rápido para conversão de hexadecimal para decimal diretamente.
  • 5. Um codigo que converta de hexadecimal para decimal é executado mais rapidamente se antes o número for convertido para binário?
  • 6. Explique a diferença entre enviar um char pela função uart_putchar() e utilizar um vetor para isso.
  • 7. Por que o uso dos vetores é mais eficiente?
  • 8. O que pode ocorrer se o baudrate configurado no transmissor não seja o equivalente no receptor?

Roteiro da Aula

Carregue o programa exemplo abaixo no CodeWarrior:

Programa HEXASCII/main.c

#include "support_common.h" /* include peripheral declarations and more */
#include "uart_support.h"
#include <stdio.h>    /* Biblioteca padrão de STDIO (st d: store dinamic) i\o */

int main()
{
	char msg[] = "World!!";
	char teste;
	int i;
	
	uart_init(0,80000,9600);	//Inicia a transmissão serial com baud-rate  
        //9600bps 
	//Esta função já está implementada no "uart_support.h"
	//O primeiro item é o canal utilizado (UART0), o segundo é o clock da placa e o 
        //terceiro o baud-rate
	
	//Essa função envia para a serial o caractere desejado. Este no padrao ASCII 
	//O primeiro item é o canal e o segundo o caractere
	uart_putchar(0,'H');
	uart_putchar(0,'e');
	uart_putchar(0,'l');
	uart_putchar(0,'l');
	uart_putchar(0,'o');
	uart_putchar(0,' ');
	
    //Podemos também implementar uma impressão dos caracteres do string até seu final (NULL):
    for (i=0; msg[i]; i++)
    {
    	uart_putchar(0, msg[i]);
    }
				
    //Podemos também receber pela serial atraves da funcao  uart_getchar(0)
    teste = uart_getchar(0);
    uart_putchar( 0, teste); // imprime o caractere e retorna
		
}
  • Crie um novo projeto no CodeWarrior e utilize o código acima como código principal (main).
  • Procure entender exatamente o que o código faz.
  • Observe que o string em c "abcd" aloca os caracteres na forma de vetor, seguido de mais

um caractere contendo o codigo ASCII NULL (00). Desta forma é possível imprimir um string, imprimindo todos seus caracteres enquanto este não seja o 00 (NULL).

Relatório

  • 1. Faça um fluxograma do programa executado em aula.
  • 2. Modifique o programa de forma que este:
    • Ao invés de utilizar as funções da biblioteca uart_support, utilizar diretamente os registradores

da UART, conforme foi feito em assembler no roteiro 4. Faça as funções init, putchar e getchar.

  • 3.Faça uma subrotina puthex(unsigned int a) que imprima o seu valor em hexadecimal no hyperterminal

utilizando a função putchar.

  • 4. Modifique o programa de forma que este:
    • Leia dois números em hexadecimal recebidos pela porta serial (pelo Hyper Terminal).
    • Os números serão separados por ENTER: o primeiro ENTER significa que ali acaba o primeiro número e o segundo ENTER significa que ali acaba o segundo número.
    • Some-os e envie o resultado pela serial para o Hyper Terminal em HEXADECIMAL, BINARIO e DECIMAL (separados por espaço).
      • Não haverá numeros negativos.
  • 5. Faça um fluxograma dos seus programas, feitos nos itens 3 e 4.

- Referências

  • /1/ CodeWarrior Development Studio - Assembler Reference -

http://www.freescale.com/files/soft_dev_tools/doc/ref_manual/CFASSEM_RM.pdf

  • /2/ ColdFire Family Programmer´s Reference Manual - DOC n°CFPRM - Manual da Freescale -

http://www.freescale.com/files/dsp/doc/ref_manual/CFPRM.pdf

  • /3/ MCF52221 ColdFire Microcontroller Reference Manual - Manual da Freescale - Doc n° MCF52223RM.

http://www.freescale.com/files/32bit/doc/ref_manual/MCF52223RM.pdf

http://www.fee.unicamp.br/EA870/referencias/ManualFeecMCF52221.doc

Ferramentas pessoais