Sida 1 av 2

PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:02:30
av bos
Jag labbar med en PIC16F886 och försöker spotta ut lite data på serieporten, men den PC som är inkopplad på kabeln reagerar inte alls. Har provat både asynkront och synkront, men det blir samma fel (dvs ingenting).

PIC:en sitter på ett kopplingsdäck, har ingenting inkopplat utöver Wisp648, och har ingen gammal firmware i sig som skulle kunna störa (kör erase för varje programmering). PIC:ens Vss + TX + RX är kopplade till en Serial-to-USB-adapter, som sitter i PC:n som COM6, och Putty lyssnar på COM6. PIC:en är inställd på 9600bps, Putty likaså.

Är det något i koden jag missar? Den är i princip kattenpejstad från databladet.

Kod: Markera allt

#include <xc.h>

void putch(char data)
{
    while( ! TXIF)
        continue;
    TXREG = data;
}

void init_uart(void)
{

    // Async
/*    SPBRG = 12;             // 9600 baud @ 8 MHz
    TXEN = 1;               // enable transmitter
    BRGH = 0;               // de-select high baud rate
    BRG16 = 0;
    SYNC = 0;
    SPEN = 1;               // enable serial port
    CREN = 1;               // enable continuous operation
*/
    // Sync
    SYNC = 1;
    BRG16 = 0;
    CSRC = 1;
    SREN = 0;
    CREN = 0;
    SPEN = 1;
    TXEN = 1;
    SPBRG = 12;
    
}

void init_MCU() {
    OSCCON = 0b01110001;    // 8MHz INTOSC
    ANSEL = 0;              // No analog inputs
    TRISA = TRISB = 0;      // All outputs
    CM1CON0 = CM2CON0 = 0;  // Disable comparators
    INTCON = PEIE = 0;
    OPTION_REG = 0;
    
    init_uart();
}

void main() {
    init_MCU();

    for(;;) {
        putch('K');
        putch('o');
        putch('r');
        putch('v');
    }
}

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:07:57
av Jan Almqvist
Har du rätt elektrisk nivå på dina signaler?

Jag känner inte till PIC men gissar att det är logik-nivå på Rx och Tx. Din Serial-to-USB-adapter kanske använder RS-232?

_________________________________________
http://www.idea-teknik.com/hmi_droid.html
Används i mer än 40 länder på 5 kontinenter.

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:10:48
av bos
Adapterns pinnar är märkta GND, TX och RX, så den ska vara på logiknivå.

Jag har även provat koppla in en grunka med en MAX232-krets på och köra via seriekabel, men det blir samma sak där (inget händer).

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:12:29
av Icecap
Har du kollat att TX pinnen rent faktisk reagerar?
Jag minns inte men är det analog funktion på de pinnar och har du stängd av den i så fall?

EDIT: och "while(!TXIF) continue;" känns väldigt fel!
Du ska dels vänta till TXIF kommer och när du sedan har lagt i data i TX-registret ska du nollställa TXIF.

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:19:22
av SeniorLemuren
Har du en lysdiod på däcket så du kan konstatera att det kommer ut något från porten till att börja med?

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:20:08
av Jan Almqvist
Mät med oscilloskop eller analog multimeter alternativt anslut lysdiod i serie med motstånd.

Om du sänder t.ex. en massa 'U' bör spänningen ungefär halveras jämfört med vila.

Eller sänd skurar av tecken med paus mellan och du bör kunna se flimmer på lysdioden.

_________________________________________
http://www.idea-teknik.com/hmi_droid.html
Används i mer än 40 länder på 5 kontinenter.

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:25:28
av bos
Såhär ser TX-pinnen ut när jag skickar ut strängen "Korven" i en oändlig loop. Det ser ut att vara alldeles för rytmiskt utan variation för att vara ett utskick.

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:30:00
av Jan Almqvist
Det ser ut som en baudrate-klocka. Jag får det till 153 kHz dvs 16 x 9600.

_________________________________________
http://www.idea-teknik.com/hmi_droid.html
Används i mer än 40 länder på 5 kontinenter.

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:31:19
av TomasL
bos skrev:Adapterns pinnar är märkta GND, TX och RX, så den ska vara på logiknivå.

Jag har även provat koppla in en grunka med en MAX232-krets på och köra via seriekabel, men det blir samma sak där (inget händer).
Nej, det ärt det inte, Om du har en USB-Serieportsadapter, så har du mellan -15 och +15V på TX-linan.
Du måste använda en serieportsdriver, MAX232 eller liknande emellan, annars är det stor risk att du eldar upp din Processor.

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 11:36:08
av bos
Icecap skrev:EDIT: och "while(!TXIF) continue;" känns väldigt fel!
Du ska dels vänta till TXIF kommer och när du sedan har lagt i data i TX-registret ska du nollställa TXIF.
Den koden är klippt direkt från hjälpfilen (sida 1017) till Microchip XC8-kompilatorn. Provade nu att nollställa TXIF, men det blir samma fel.

Nu provade jag att stänga av PIC:ens serieport och köra en "blinka-led" på TX-pinnen. Den lyser konstant och oscilloskopet reagerar inte på några pulser.

Jag undrar om inte det här chippet är defekt. Ska prova byta ut det och se om så är fallet.

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 12:06:27
av Icecap
Jag litar aldrig på exempelkod - men den är oftast en god hjälp på vägen.

Men du har helt klart inte vald rätt ben som Tx! Du får ut synkronklockan och inte Tx - så välj rätt pinne istället för att byta krets.

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 12:11:08
av bos
TomasL skrev:Nej, det ärt det inte, Om du har en USB-Serieportsadapter, så har du mellan -15 och +15V på TX-linan.
Du måste använda en serieportsdriver, MAX232 eller liknande emellan, annars är det stor risk att du eldar upp din Processor.
Baksidan på adaptern säger "USB-TTL".

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 13:35:26
av sodjan
> Den koden är klippt direkt från hjälpfilen (sida 1017) till Microchip XC8-kompilatorn.

Vilken "hjälpfil" ?? Manualen har inte så många sidor...

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 20:51:29
av bos
Den till XC8, som sagt.

Re: PIC16F886 + USART = ofunk

Postat: 19 maj 2016, 20:55:37
av bos
4 brända timmar senare har jag hittat felkällan; USB-adaptern.

Med en hembyggd hjälpkrets körandes MAX232 och en DB9-kontakt direkt till datorn får jag upp tecken i Putty. De är dock skräp så jag misstänker att räknat ut fel värde till SPBRG, men den biten får jag lösa en annan dag.