Наименьший (по коду) бит - последовательный интерфейс на PIC10 заблокирован

Мне нужно подключиться к микроконтроллеру PIC10 с некоторым последовательным интерфейсом. Поскольку эти небольшие устройства не имеют аппаратной поддержки SPI I2C и UART, программное обеспечение неизбежно.

Однако, поскольку мне нужно сохранить как можно больше памяти программы для хранения (статической) конфигурации и идентификации информации, которую нужно получить через указанный интерфейс, какое, вероятно, будет наименьшим решением?

Мне нужно будет запрограммировать это в ASM, поскольку, похоже, нет хорошего компилятора C для PIC10. Тем не менее, это будет моя первая настоящая встреча с ASM, о которой стоит поговорить.


person Arne    schedule 05.02.2015    source источник


Ответы (2)


Попробуйте эту загрузку, которая содержит образцы кода и говорит:

«Ниже перечислены пять программных программ PIC UART для использования с микропроцессорами PIC, у которых нет аппаратного UART»

Гниение ссылки нарушило исходную ссылку, попробуйте эту ссылку.

person Weather Vane    schedule 13.02.2015
comment
Возникла проблема с сервером www.embeddedcodesource.com. Контент также можно найти здесь. - person Dan1138; 27.09.2018

На мой взгляд, компилятор xc8 работает неплохо, в том числе и для PIC10. Вот пример на C:

#include <xc.h>
#ifndef _XTAL_FREQ
    #define _XTAL_FREQ 4000000
#endif

#define Baudrate 1200 //bps
#define OneBitDelay (1000000/Baudrate)
#define DataBitCount 8 // no parity, no flow control
#define UART_RX RA1 // UART RX pin
#define UART_TX RA0 // UART TX pin
#define UART_RX_DIR TRISA1 // UART RX pin direction register
#define UART_TX_DIR TRISA0 // UART TX pin direction register

//Function Declarations
void InitSoftUART(void);
unsigned char UART_Receive(void);
void UART_Transmit(const char);

__CONFIG(FOSC_INTOSC & MCLRE_OFF & WDTE_OFF & LVP_OFF & CP_OFF &
         WRT_OFF & PWRTE_OFF & WRT_OFF & BOREN_ON & LPBOR_ON & BORV_LO);

void main()
{ 
 unsigned char ch = 0;

 ANSELA = 0x00; // Set ports as digital I/O, not analog input
 ADCON = 0x00; // Shut off the A/D Converter
 FVRCON = 0x00; // Shut off the Voltage Reference
 PORTA = 0x00; // Make all pins 0

 InitSoftUART(); // Intialize Soft UART

 InitSoftUART(); // Intialize Soft UART

 while(1)
 {
  ch = UART_Receive(); // Receive a character from UART
  UART_Transmit(ch); // Echo back that character
 }
}


void InitSoftUART(void) // Initialize UART pins to proper values
{
 UART_TX = 1; // TX pin is high in idle state

 UART_RX_DIR = 1; // Input
 UART_TX_DIR = 0; // Output
}

unsigned char UART_Receive(void)
{
 // Pin Configurations
    // GP1 is UART RX Pin

 unsigned char DataValue = 0;

 //wait for start bit
 while(UART_RX==1);

 __delay_us(OneBitDelay);
 __delay_us(OneBitDelay/2); // Take sample value in the mid of bit duration

 for ( unsigned char i = 0; i < DataBitCount; i++ )
 {
  if ( UART_RX == 1 ) //if received bit is high
  {
   DataValue += (1<<i);
  }

  __delay_us(OneBitDelay);
 }

 // Check for stop bit
 if ( UART_RX == 1 ) //Stop bit should be high
 {
  __delay_us(OneBitDelay/2);
  return DataValue;
 }
 else //some error occurred !
 {
  __delay_us(OneBitDelay/2);
  return 0x000;
 }
}

void UART_Transmit(const char DataValue)
{
 /* Basic Logic

    TX pin is usually high. A high to low bit is the starting bit and 
    a low to high bit is the ending bit. No parity bit. No flow control.
    BitCount is the number of bits to transmit. Data is transmitted LSB first.

 */

 // Send Start Bit
 UART_TX = 0;
 __delay_us(OneBitDelay);

 for ( unsigned char i = 0; i < DataBitCount; i++ )
 {
  //Set Data pin according to the DataValue
  if( ((DataValue>>i)&0x1) == 0x1 ) //if Bit is high
  {
   UART_TX = 1;
  }
  else //if Bit is low
  {
   UART_TX = 0;
  }

     __delay_us(OneBitDelay);
 }

 //Send Stop Bit
 UART_TX = 1;
 __delay_us(OneBitDelay);
}

Источник этого кода: Форум Microchip

person Mike    schedule 23.08.2018