Använder där terminalprogrammet Realterm. RX och TX pinnarna på 16F88 är kopplade till en nivåanpassare som sedan ansluter till PC serieporten. På denna nivåanpassare
finns LED för sändning och mottagning. Därför ser jag att signaler kommer in till den när PIC programmet skriver. Men i Realterm ser jag bra 'null' skrivas och dessutom en röd indikering på BREAK som ska innebära 'Break is when the RXD line is broken'. Men jag har kontrollerat med summer att RX och TX sladdarna är rätt anslutna vilket också framgår av nivåanpassarens LED (både sändning och mottagning indikeras). Om nedanstående program implementeras på en PIC16F690 så fungerar utskriften. Så jag förstår inte varför inte detta fungerar på en PIC16F88.
Kod: Markera allt
#include <htc.h>
#include <stdio.h>
#include "usart.h"
#define _XTAL_FREQ 4000000L
#define TRUE 1
#define FALSE 0
__CONFIG(INTIO & WDTDIS & PWRTDIS & BORDIS & UNPROTECT);
void Init_PIC()
{
init_comms();
}
void main()
{
unsigned char c; //Lagra mottaget tecken här
Init_PIC();
do {printf("Hej 88:an\n\r");} while (TRUE); // ger nul nul nul osv med 16F88 men korrekt utskrift på en 16F690
}
usart.c
#include <htc.h>
#include <stdio.h>
#include "usart.h"
void putch(unsigned char byte)
{
/* output one byte */
while(!TXIF) /* set when register is empty */
continue;
TXREG = byte;
}
unsigned char getch()
{
/* retrieve one byte */
while(!RCIF) /* set when register is not empty */
continue;
return RCREG;
}
unsigned char getche(void)
{
unsigned char c;
putch(c = getch());
return c;
}
usart.h
#ifndef _SERIAL_H_
#define _SERIAL_H_
#define BAUD 9600
#define FOSC 4000000L
#define NINE 0 /* Use 9bit communication? FALSE=8bit */
#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))
#define HIGH_SPEED 1
#if NINE == 1
#define NINE_BITS 0x40
#else
#define NINE_BITS 0
#endif
#if HIGH_SPEED == 1
#define SPEED 0x4
#else
#define SPEED 0
#endif
#if defined(_16F87) || defined(_16F88)
#define RX_PIN TRISB2
#define TX_PIN TRISB5
#else
#define RX_PIN TRISB5
#define TX_PIN TRISB7
#endif
/* Serial initialization */
#define init_comms()\
RX_PIN = 1; \
TX_PIN = 1; \
SPBRG = DIVIDER; \
RCSTA = (NINE_BITS|0x90); \
TXSTA = (SPEED|NINE_BITS|0x20)
void putch(unsigned char);
unsigned char getch(void);
unsigned char getche(void);
#endif