Sida 1 av 3

16F648A Uart MikroC

Postat: 14 februari 2010, 13:50:00
av Pajn
Jag försöker kommunicera med picen via 232 och wispen (använder pinne 7 och 8) men får väldigt konstig data tillbaks.

Kod: Markera allt

char uart_rd;

void main() {

  UART1_Init(9600);              // Initialize UART module at 9600 bps
  Delay_ms(100);                 // Wait for UART module to stabilize

  while (1) {                    // Endless loop
   if (UART1_Data_Ready()) {     // If data is received,
     uart_rd = UART1_Read();     //   read the received data,
     UART1_Write(uart_rd);       //   and send data via UART
    }
  }
}
Och jag får då:

Kod: Markera allt

Connected to COM3
Sent: 1 (as number)
Received: 241 
Sent: 5 (as number)
Received: 241 
Sent: 10 (as number)
Received: 10 
Sent: a
Received: ñÿ
Sent: hello
Received: h±|no
När jag skickar som int så läser jag svaren som "dec" och när jag skickar som text så läser jag svaren som "ascii"

Någon som vet vad jag har gjort för fel?

Re: 16F648A Uart MikroC

Postat: 14 februari 2010, 14:01:33
av sodjan
Felkopplat. Eller något annat...

Re: 16F648A Uart MikroC

Postat: 14 februari 2010, 14:18:31
av Pajn
Det är mycket möjligt då jag tyckte att infon i databladet till wispen var lite klen. Finns det någon bättre info någonstans?

EDIT: måste jag i wispen aktivera "pass-through"? hur?

Re: 16F648A Uart MikroC

Postat: 14 februari 2010, 14:31:57
av sodjan
Det tror inte att det är alla firmware varienter och versioner som
stöder det. Du får kolla respektive dokumentation. Jag har inte
heller en aning om vad du menar med "databladet" till Wispen.

Re: 16F648A Uart MikroC

Postat: 14 februari 2010, 15:22:43
av Pajn
Jag har 1.27 och det står inget om att den inte skulle stödja det. I 1.26 så är en bugg för pass-through fixad så stöd borde ju finnas?

Datablad kanske var att ta i, jag menar manualen.

Re: 16F648A Uart MikroC

Postat: 14 februari 2010, 15:44:34
av sodjan
OK, whatever. Utan länkar så är det i alla fall inte självklart
var du läser. Men hur som helst, låt oss anta att det *ska* fungera.

Då gissar jag på felkopplat. Eller fel hastighet på PIC'en. Eller felkonfigurerat
någon annanstans. Det finns ju massor av saker som *vi* inte känner till just nu.
Du kan ju inte bara fråga "vad är fel?" så där rakt ut. Ingen sitter med kristallkula...

> När jag skickar som int så läser jag svaren som "dec" och när jag skickar som text så läser jag svaren som "ascii"

Varför krånga till det ? Ange vad du skickar och vad du får tillbaka på ett sätt
som inte kan missförstås. I hex t.ex.

> EDIT: måste jag i wispen aktivera "pass-through"? hur?

Kod: Markera allt

C:\>xwisp2w
 xwisp2 version 1.9.5 for Windows (Jan 24 2008, Open Watcom C/C++ 1.70)
 (c) Copyright 2002,2008, R. Hamerling. All rights reserved.
...
...
PASS m    : enable passthrough, m = B6T, B6I, AUXT, AUXI
Och : http://www.robh.nl/xwisp2.html

Re: 16F648A Uart MikroC

Postat: 14 februari 2010, 17:42:03
av Pajn
Använde BumbleBee, nu är Pass-Throuh aktiverat.

Jag har kopplat wispens pin 7 till picens pin 7 och wispens 8 till picens 8 samt ett motstånd på 10k från MCLR till VDD.
Inställningar på picen:
INTOSC: I/O on RA6/OSC2/CLKOUT, I/O on RA7/OSC1/CLKIN
Watchdog Timer: Off
Power Up Timer: Disabled
Master Clear Enable: Enabled
Brown Out Detect: Enabled
Low Voltage Program: Disabled
Data EE Read Protect: Disabled
Code Protect: Off

Jag skickar med inställningar:
Baud: 9600
Stop bits: one stop bit
Parity: none
Data bits: eight
RTS: off
DTR: off
(alla dem är standard i MikroC's usart terminal)

När jag skickar kan jag välja att skicka eller att skicka som nummer och sedan läsa svaret som ASCII, HEX eller DEC

Här har jag läst svaret som ASCII:

Kod: Markera allt

Sent: a
Received: ñÿ
Sent: b
Received: òÿ
Sent: c
Received: óÿ
Sent: 2
Received: ²ÿ
Sent: hello
Received: h±|no
Läst som HEX: (det som är sickat som nummer (int) är markerat)

Kod: Markera allt

Sent: hello
Received: 0x68 0xEB 0xF1 0x73 0x6E 0xFF 
Sent: 10
Received: 0xF1 0xB2 0xFF 
Sent: 10 (as number)
Received: 0x0A 
Sent: 11 (as number)
Received: 0x0B 
Sent: 20 (as number)
Received: 0xF7 0xFF 
Läst som dec:

Kod: Markera allt

Sent: 1 (as number)
Received: 241 
Sent: 9 (as number)
Received: 249 
Sent: 10 (as number)
Received: 10 
Sent: 11 (as number)
Received: 11 
Sent: 12 (as number)
Received: 11 
Sent: 20 (as number)
Received: 247 255
Med manualen för wisp menar jag http://www.voti.nl/wisp648/wisp648.pdf
och versionsinformationen tog jag ifrån http://www.voti.nl/wisp648/wisp648.jal

Re: 16F648A Uart MikroC

Postat: 14 februari 2010, 19:16:47
av sodjan
OK.

Det här är väl helt OK :

> Sent: 10 (as number)
> Received: 0x0A
> Sent: 11 (as number)
> Received: 0x0B

eller hur ?

Kör med en delay mellan tecknen.
Kan du skicka tecken OK i ena riktingen ? (PIC -> PC ?)

Re: 16F648A Uart MikroC

Postat: 14 februari 2010, 19:49:24
av Pajn
Hmm, tror att detta med pass through inte funkar.
Kan inte skicka nått överhuvudtaget till datorn (konstigt, den svarade ju förut?)
Och med koden

Kod: Markera allt

void main() {
  PORTB = 0;
  TRISB = 0;
  UART1_Init(9600);              // Initialize UART module at 9600 bps
  Delay_ms(100);                 // Wait for UART module to stabilize

  while (1) {
    if (UART1_Data_Ready()) {     // If data is received,
       PORTB.F4 = 1;
    }
  }
}
Så får jag svar men RB4 går aldrig hög.

Kod: Markera allt

Sent: hej
Received: ej
Received: €
Är nog inte picen som svarar...

Blir till att beställa en max232, lite jobbigt att flytta seriekabeln bara :/

Re: 16F648A Uart MikroC

Postat: 14 februari 2010, 21:02:59
av sodjan
> ...lite jobbigt att flytta seriekabeln bara :/

Du kan ha två på två olika COM portar... :-)

Re: 16F648A Uart MikroC

Postat: 19 februari 2010, 22:52:19
av Horatius
Jag sprang på ungefär samma problem. Det står inte så i Mikroc:s manual men om du kollar hjälpen som kommer fram i IDE:t
så returnerar funktionen UART1_Read() en signed char medan UART1_Write() skall ha en unsigned char som parameter.
Ett cast gjorde susen för mig.

Kod: Markera allt


// i declarationen:
  char uart_rd;

//i main
  uart_rd = UART1_Read();     //   read the received data,
  UART1_Write((unsigned char)uart_rd);


Re: 16F648A Uart MikroC

Postat: 19 februari 2010, 23:31:47
av Pajn
Problemet var (för mig) att wispen svarade oavsett om det satt en pic där eller inte även efter att jag hade aktiverat pass-through. Jag fick två MAX232:or av EEPROMdanne (Stort tack!) och det gjorde susen. Mitt nuvarande problem ligger på andra sidan, hittar ingen bra modul till python för att skicka hex seriellt, pyserial finns ju men den tar bara strängar. Aja, det är OT.

Re: 16F648A Uart MikroC

Postat: 20 februari 2010, 00:39:59
av sodjan
"Hex" är ju inget annan än strängar. Kombinationer av "0" - "9" och "A" - "F".

Re: 16F648A Uart MikroC

Postat: 20 februari 2010, 01:16:15
av Pajn
Jag menar som en int, decimalt eller hex spelar ingen större roll men jag skulle föredra hex...
Att skicka "01" eller "FF" funkar inget bra när picen förväntar sig en int.

Re: 16F648A Uart MikroC

Postat: 20 februari 2010, 11:38:51
av vfr
Kan du inte ta emot som hex i PIC:en istället?

Fördelen med att använda ASCII-data i någon form är att det är lätt att lägga in avgräsningstecken, t.ex CR/LF och kommatecken. Kör man binärt så måste man kladda lite mer och byta ut tecken eller ha väldigt väldefinierad timing för att kunna skilja ut start och stop.

Missföstå mig inte. Jag föredrar själv binära protokoll då det utnyttjar bandbredden mycket bättre och man kan köra med lägre bithastighet med bibehållet avstånd. Däremot måste man vara noga med protokolldefinitionen och helst ha lite vana vid binära protokoll.