PDA

View Full Version : Serial: PIC18F45K22 -> (Arduino) Uno = works | Uno -> PIC18F45K22 = fails Why?



PerlNoerd
- 5th February 2014, 23:22
Both running 5V
9600 Baud
Uses HSERIN PORTC.7

Is there something with logic voltage levels I should be aware of?

Have tried with pull up 4K7 and 10K ...

Receives only 3 nonsense letters

- Jacob

Andy Wood
- 6th February 2014, 05:47
Just a stab in the dark.... HSERIN will only work directly using TRUE state. Have you tried using an inverter or, alternatively, can you do a quick test using SERIN with N9600?

Archangel
- 6th February 2014, 09:53
Hi Jacob,
At this point it is a little like winking at a girl in the dark, you know what you did but almost nobody else does. Some code samples would help a bunch.
Arduino libraries are pretty much turn key code in a box wrapped in birthday paper. PBP is a bit more hands on. A good example of hserin can be found here:http://www.picbasic.co.uk/forum/showthread.php?t=4972&highlight=backpack
There was an article posted from this thread, I cannot find it right now, or any articles for that matter, may be a script blocker on my end . . .

mackrackit
- 6th February 2014, 10:50
Is this the one you are looking for?
http://www.picbasic.co.uk/forum/content.php?r=171-LCD-serial-backpacks

Demon
- 6th February 2014, 12:15
Are you able to communicate with your PC?

The problem can be at either ends. It would help to know if the data is sent properly so you can concentrate on the culprit.

Check your PBP manual on how to set up the link, or search here.

Do you have a logic probe?

Robert

PerlNoerd
- 6th February 2014, 16:48
Hi All

All right. Thanks for the response.

It's a bit embarrassing and I'm pretty confused for a sudden does it all as it should without I know what caused it. It's very simple setup but for several days it has teased me.

Test set-up:

72177218

Here's the test code I'm using:

18F45K22:



#CONFIG
CONFIG FOSC = INTIO67 ; Internal oscillator block
CONFIG PLLCFG = ON ;
CONFIG PRICLKEN = OFF ; Primary clock can be disabled by software
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRTEN = OFF ; Power up timer disabled
CONFIG BOREN = SBORDIS ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
CONFIG BORV = 190 ; VBOR set to 1.90 V nominal
CONFIG WDTEN = ON ; WDT is always enabled. SWDTEN bit has no effect
CONFIG WDTPS = 32768 ; 1:32768
CONFIG CCP2MX = PORTC1 ; CCP2 input/output is multiplexed with RC1
CONFIG PBADEN = OFF ; PORTB<5:0> pins are configured as digital I/O on Reset
CONFIG CCP3MX = PORTB5 ; P3A/CCP3 input/output is multiplexed with RB5
CONFIG HFOFST = ON ; HFINTOSC output and ready status are not delayed by the oscillator stable status
CONFIG T3CMX = PORTC0 ; T3CKI is on RC0
CONFIG P2BMX = PORTD2 ; P2B is on RD2
CONFIG MCLRE = EXTMCLR ; MCLR pin enabled, RE3 input pin disabled
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ; Disabled
CONFIG CP0 = OFF ; Block 0 (000800-001FFFh) not code-protected
CONFIG CP1 = OFF ; Block 1 (002000-003FFFh) not code-protected
CONFIG CP2 = OFF ; Block 2 (004000-005FFFh) not code-protected
CONFIG CP3 = OFF ; Block 3 (006000-007FFFh) not code-protected
CONFIG CPB = OFF ; Boot block (000000-0007FFh) not code-protected
CONFIG CPD = OFF ; Data EEPROM not code-protected
CONFIG WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
CONFIG WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
CONFIG WRT2 = OFF ; Block 2 (004000-005FFFh) not write-protected
CONFIG WRT3 = OFF ; Block 3 (006000-007FFFh) not write-protected
CONFIG WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
CONFIG WRTB = OFF ; Boot Block (000000-0007FFh) not write-protected
CONFIG WRTD = OFF ; Data EEPROM not write-protected
CONFIG EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
CONFIG EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
CONFIG EBTR2 = OFF ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
CONFIG EBTR3 = OFF ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks
CONFIG EBTRB = OFF ; Boot Block (000000-0007FFh) not protected from table reads executed in other blocks
#ENDCONFIG


DEFINE OSC 64

' Setup PLL for 64 MHZ
OSCCON = 110100 ; 16 mhz (NOTE: SCS=0 so PLL works)
OSCTUNE.6 = 1 ; PLL enable Mhz * 4

ANSELA = 0
ANSELB = 0
ANSELC = 0
ANSELD = 0
ANSELE = 0

' Set receive register to receiver enabled
DEFINE HSER_RCSTA 90h
' Set transmit register to transmitter enabled
DEFINE HSER_TXSTA 20h
' Set baud rate
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1 ' Auto clear over-run errors

char Var byte ' Storage for serial character

Pause 2000

Hserout ["PIC - UP RUNNING :-)", 13, 10] ' Send text followed by carriage return and linefeed

start:
pause 10
toggle PORTC.0 ' Alive LED

mainloop:
Hserin 10000, start, [char] ' Get a char from serial port
pause 10
Hserout [char] ' Send char out serial port
Goto mainloop ' Do it all over again

End



Arduino Uno (only the chip - ATmega328p):



int led = 13;

int incomingByte = 0; // for incoming serial data

void setup() {
Serial.begin(9600);
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
Serial.println("Arduino UNO - UP RUNNING...");
}

// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(900);

if (Serial.available() > 0) {
while (Serial.available()) {
Serial.print((char)Serial.read());
}
Serial.println();
}
}

PerlNoerd
- 6th February 2014, 17:42
However,

why does this code not. It receives nothing

Hserin 10000, start, [WAITSTR buffer\3]

I need to wait for the three characters from an Arduino





' Hserin test
' For PIC 18F45K22 with PLL
' Compiler used: PBP3
' Assembler used: MPASMX


#CONFIG
CONFIG FOSC = INTIO67 ; Internal oscillator block
CONFIG PLLCFG = ON ;
CONFIG PRICLKEN = OFF ; Primary clock can be disabled by software
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRTEN = OFF ; Power up timer disabled
CONFIG BOREN = SBORDIS ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
CONFIG BORV = 190 ; VBOR set to 1.90 V nominal
CONFIG WDTEN = ON ; WDT is always enabled. SWDTEN bit has no effect
CONFIG WDTPS = 32768 ; 1:32768
CONFIG CCP2MX = PORTC1 ; CCP2 input/output is multiplexed with RC1
CONFIG PBADEN = OFF ; PORTB<5:0> pins are configured as digital I/O on Reset
CONFIG CCP3MX = PORTB5 ; P3A/CCP3 input/output is multiplexed with RB5
CONFIG HFOFST = ON ; HFINTOSC output and ready status are not delayed by the oscillator stable status
CONFIG T3CMX = PORTC0 ; T3CKI is on RC0
CONFIG P2BMX = PORTD2 ; P2B is on RD2
CONFIG MCLRE = EXTMCLR ; MCLR pin enabled, RE3 input pin disabled
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ; Disabled
CONFIG CP0 = OFF ; Block 0 (000800-001FFFh) not code-protected
CONFIG CP1 = OFF ; Block 1 (002000-003FFFh) not code-protected
CONFIG CP2 = OFF ; Block 2 (004000-005FFFh) not code-protected
CONFIG CP3 = OFF ; Block 3 (006000-007FFFh) not code-protected
CONFIG CPB = OFF ; Boot block (000000-0007FFh) not code-protected
CONFIG CPD = OFF ; Data EEPROM not code-protected
CONFIG WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
CONFIG WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
CONFIG WRT2 = OFF ; Block 2 (004000-005FFFh) not write-protected
CONFIG WRT3 = OFF ; Block 3 (006000-007FFFh) not write-protected
CONFIG WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
CONFIG WRTB = OFF ; Boot Block (000000-0007FFh) not write-protected
CONFIG WRTD = OFF ; Data EEPROM not write-protected
CONFIG EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
CONFIG EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
CONFIG EBTR2 = OFF ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
CONFIG EBTR3 = OFF ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks
CONFIG EBTRB = OFF ; Boot Block (000000-0007FFh) not protected from table reads executed in other blocks
#ENDCONFIG


DEFINE OSC 64

' Setup PLL for 64 MHZ
OSCCON = %01110100 ; 16 mhz (NOTE: SCS=0 so PLL works)
OSCTUNE.6 = 1 ; PLL enable Mhz * 4

ANSELA = 0
ANSELB = 0
ANSELC = 0
ANSELD = 0
ANSELE = 0

' Set receive register to receiver enabled
DEFINE HSER_RCSTA 90h
' Set transmit register to transmitter enabled
DEFINE HSER_TXSTA 20h
' Set baud rate
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1 ' Auto clear over-run errors

buffer Var byte[3] ' Storage for serial character

Pause 2000

Hserout ["PIC - UP RUNNING :-)", 13, 10] ' Send text followed by carriage return and linefeed

start:
pause 10

mainloop:
toggle PORTC.0 ' Alive LED
Hserin 10000, start, [WAITSTR buffer\3]
pause 10
Hserout [str buffer\3]
Goto mainloop ' Do it all over again

End

HenrikOlsson
- 6th February 2014, 18:16
Hi,
WAITSTR is used to wait for a specific string of characters and THEN continue.
In this case it'll sit there and receive charcters until three bytes in a row matches what you've stored in buffer and THEN continue with the program. Since you don't have anything in stored in buffer (all zero) you'd need to send three null bytes in order for the program continue.

If you want to receive three bytes, any three bytes, and store them in buffer then use STR Buffer \3 instead of WAITSTR Buffer \3. See section 2.10 in the PBP3 manual for more details.

/Henrik.

PerlNoerd
- 6th February 2014, 18:36
Hi Henrik

Yes you are right

I found this:

http://www.picbasic.co.uk/forum/showthread.php?t=18978&highlight=waitstr

It clarified some things for me

I will use this format for receiving: #xxx

Hserin 10000, start, [WAIT("#"), STR buffer\3]

- Jacob