UART in PIC

Bavelt

Golden Member

Ik ga er mee aan de slag. Op naar de winkel!

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb het aangesloten volgens het schema van Lambiek.

Echter bij het verzenden van een karakter naar COM1 krijg ik de bekende DOS-error "Schrijffout bij het schrijven naar Apparaat COM1" (en dan afbreken, herhalen, etc)
Er gaat dus iets niet goed met de connectie.

Uit een heel grijs verleden herinnerde ik me een aansluitprobleem (dat je RTS en CTS moest doorverbinden om dat te voorkomen).

Of moet het direct werken?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Normaal moet je er wel naar toe kunnen schrijven, zelfs als er niks aangesloten is... (werkt de poort wel?)
Voor communicatie verbind ik altijd 1-4-6 en 7-8 door, dan werkt 't met bijna elk randapparaat...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lambiek

Special Member

Op 24 februari 2020 15:25:47 schreef Bavelt:
Ik heb het aangesloten volgens het schema van Lambiek.

Wat gebruik je allemaal?

Uit een heel grijs verleden herinnerde ik me een aansluitprobleem (dat je RTS en CTS moest doorverbinden om dat te voorkomen).

Ik hoef niets door te verbinden, gebruik dit al jaren om allerlei type pic controllers te schrijven en te lezen.

Als je haar maar goed zit, GROETEN LAMBIEK.
Bavelt

Golden Member

Ik heb even pin 2 en 3 doorverbonden (het meest simpele)

en dan echo 123 > com1

Dan verschijnt de melding.

Fouten zijn het bewijs dat je het probeert..
Lambiek

Special Member

Wat voor adapter gebruik je nu?

Staat je baudrate goed?

Als je haar maar goed zit, GROETEN LAMBIEK.
Bavelt

Golden Member

Wat gebruik je allemaal?

Aan de linker kant een laptop (compaq nc6320), die wordt opgestart met DOS 6.22 (bloedsnel!)
Dit om een signaal te verzenden via de seriële poort.

Die gaat de schakeling volgens het schema van Lambiek in. Aan de outputkant gaat het naar een PIC16F1847, die wacht op een inkomend signaal (UART bus).

Het ledje tussen RSOut en pin 3 van de OptoCoupler brandt continu.

Fouten zijn het bewijs dat je het probeert..

Die opto-couplers zijn wel redelijk traag. Dat geeft problemen op hogere snelheden. 19200 baud wordt al moeilijk volgens mij.

Lambiek

Special Member

Op 24 februari 2020 15:58:07 schreef deKees:
Dat geeft problemen op hogere snelheden. 19200 baud wordt al moeilijk volgens mij.

Ja dat klopt, ik ga nooit hoger dan 9600 baud. Dat is voor mijn toepassingen meer dan voldoende.

Als het sneller moet, moeten er andere optocouplers gebruikt worden.

Als je haar maar goed zit, GROETEN LAMBIEK.
Bavelt

Golden Member

Staat je baudrate goed?

Ik gebruik het commando mode com1:9600,n,8,1,p

Eigenschappen van de COM-poort:
Baud:9600
Pariteit: none
Databits: 8
Stopbits: 1
Time-out: off
XON/OFF: off
CIS-Handshaking: on
DSR Handshaking: on
DSR-rectiesnelheid: OFF
DTR-Circuit: Handshake
RTC-Circuit: Handshake

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Wat voor adapter gebruik je nu?

Ik heb een seriële kabel (9-polig). Een kant in de Com poort van de PC, andere de schakeling in met de OptoCoupler zoals op het schema.

Fouten zijn het bewijs dat je het probeert..
Lambiek

Special Member

Op 24 februari 2020 16:02:38 schreef Bavelt:
Ik gebruik het commando mode com1:9600,n,8,1,p

Die instellingen gebruik ik ook.

Gebruik je wel een delay in je microbasic programma?

Als je haar maar goed zit, GROETEN LAMBIEK.
Arco

Special Member

De poort zelf kun je simpel testen door 2 en 3 door te verbinden, alles moet dan ge-echo'ed worden...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

De poort zelf kun je simpel testen door 2 en 3 door te verbinden, alles moet dan ge-echo'ed worden...

Dat dacht ik dus ook. Dus verbond ik pin2 en 3 rechtstreeks op de COM-poort met elkaar door.

Geeft hetzelfde resultaat.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Voor communicatie verbind ik altijd 1-4-6 en 7-8 door, dan werkt 't met bijna elk randapparaat...

Als ik dit doe dan verdwijnt idd de melding...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Waarom gebruik je geen terminal programma i.p.v. dat echo gedoe?... ;)
(echo gebruikt waarschijnlijk handshaking; als 1-4-6 en 7-8 niet zijn doorverbonden ziet 'ie dat als het randapparaat geen antwoord geeft...)

[Bericht gewijzigd door Arco op maandag 24 februari 2020 17:02:05 (51%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Arco

Special Member

Lync is een handig terminalprogramma voor DOS...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Het hoeft natuurlijk niet persé in DOS. Op deze Laptop - weliswaar een oudje - zit wél Windows 7. Niet snel, maar werkt wel.

Het DOS-gedoe doe ik nu dmv opstarten van een USB stickje met DOS 6.22

Maar als ik met Windows de seriële poort kan aansturen en een string kan wegzenden is het natuurlijk ook prima.
Daar ging het me immers om.

Wat is dan een handig programmaatje? Hterm? Of is dat te zwaar?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ik gebruik het commando mode com1:9600,n,8,1,p

Eigenschappen van de COM-poort:
Baud:9600
Pariteit: none
Databits: 8
Stopbits: 1
Time-out: off
XON/OFF: off
CIS-Handshaking: on
DSR Handshaking: on
DSR-rectiesnelheid: OFF
DTR-Circuit: Handshake
RTC-Circuit: Handshake

Je kunt beter de handshake uitschakelen zolang je die niet gebruikt. Dan hoef je de handshake pinnen niet meer aan te sturen.

[Bericht gewijzigd door deKees op maandag 24 februari 2020 18:03:16 (55%)

Bavelt

Golden Member

Ok, ik ben nu weer een stuk verder. ik kan een string naar de COM1 sturen, Het indicatie ledje knippert na verzenden, de communicatie lijkt dus goed te gaan.
Alleen reageert de interrupt in Mikrobasic niet. (ik test dat met een ledje. Wanneer de interrupt wordt aangeroepen, moet het ledje gaan branden).

Zit daar iets niet goed?

Het vereenvoudigde programma:

pic basic code:

Program LichtKrant_2Display

'----------------------------------------------------------------------------------------
sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'----------------------------------------------------------------------------------------
If RCIF_bit Then
  LATB.0 = 1
  RCIF_bit = 0
End If
End Sub

'===============================================================================
Main:

'===============================================================================
  OSCCON     = %01111000                                      '16Mhz internal
  ANSELB     = %00000000                                      'Port B digital
  TRISB      = %00000010                                      'Port B.1 Input
  APFCON1    = %00000001                                      'TX on PortB.5
  LATB.0 = 0

 UART1_Init(9600)                                             'initialize UART module
 Delay_ms(100)

 End.
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Het werkt wel met

pic basic code:

if (UART1_Data_Ready() = 1) then
      LATB.0 = not latb.0
      delay_ms(1000)
      receive = UART1_Read()
  end if 

De aansluitingen lijken daarom correct. Er moet iets met de interrupt zijn.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De interrupt aanzetten wil wel eens helpen... :)

pic basic code:


  RCIE_bit = 1
  GIE_bit  = 1
  PEIE_bit = 1
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

De interrupt aanzetten wil wel eens helpen..

Dat helpt inderdaad :)

Wat ik nog niet helder heb: Er ontstaat een interrupt bij binnenkomst van een karakter (of reeks) op de COM Poort.
D.m.v. het afvragen van

pic basic code:

 If RCIF_bit Then ....

test je of de interrupt het gevolg is van een signaal op de UART.

Maar wanneer komt de volgende interrupt? Is dat per karakter, of bij het einde van de string?

Bijvoorbeeld de string "123" naar de Com Poort. Wanneer eindigt de interrupt dan?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ieder karakter krijgt een eigen interrupt...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com