pic 16f628 uart <> PC instellen

Shiptronic

Overleden

ik probeer een serieele verbinding te maken tussen een pic 16F628 en de pc (windhoos XP)

nu krijg ik wel data in de terminal maar het slaat nergens op.

heb al veel gezocht , google en de picbasic map van crownhill , maar ik raak er niet uit.

ik zoek eigenlijk een simpel voorbeeld met uitleg, helaas is de cursus van frits (deel 11) nog niet zo ver.

alles wat ik lees is dat het heel simpel is,maar ik krijg het niet voor elkaar, wie geeft me een zetje.

de code die ik heb is geknip geplakt en aangepast, maar werkt niet.ik vind nergens een duidelijk voorbeld met uitleg.

data:

pic 16F628
kristal 4 MHz
maakt gebruik van de uart op pennen 7&8
max232
PC com1

de settings heb ik uitgerekend met een programma van deze site : http://www.mister-e.org/pages/utilitiespag.html
met het programma PICmultiCALC, mischien ook handig voor iemand die het zoekt.

[EDIT] gezien dat de link niet meer werkt :

ik zag dat de link naar het reken programma niet meer werkt
hier een niewe link : http://www.picbasic.co.uk/forum/attachment.php?attachmentid=...1225550…

van deze site : http://www.picbasic.co.uk/forum/showthread.php?t=11127 (post #6)

de waarden die hier uitkomen :

code:


RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $24 ' Enable transmit, BRGH = 1
SPBRG = 25  ' 9600 Baud @ 4MHz, 0,16%

heb ik in mijn programma ingevuld/aangepast

het programma bevat een teller, ik wil de waarde van de teller uitlezen in serial communicator van proton

er zit een knipperled in om te kijken of de pic wel draaid

dit is mijn programma:

code:


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : J.E.Esselink                                      *
'*  Notice  : Copyright (c) 2007 J.E.Esselink                   *
'*          : All Rights Reserved                               *
'*  Date    : 9-5-2007                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEVICE 16F628                 ;Gebruik een 16F628  type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ;INTRC_OSC_NOCLKOUT verwijderd 
XTAL 4                        ;Kristal van 4 MHz
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

DEFINE HSER_RCSTA 90h         ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h         ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25          ' 9600 Baud @ 4 MHz, 0,16%
DEFINE HSER_CLROERR 1         ' Clear overflow automatically






dim teller1  as byte
dim a as byte
dim b as byte

a=40
b=a * 2

teller1 = 0


SYMBOL LED1 = PORTA.1         ;Poort A.1 heeft nu de naam LED 1
SYMBOL LED2 = PORTA.0         ;POORT A.1 HEEFT NU DE NAAM LED 2

;        76543210
PORTA = %00000001            ;PIC opstarten met alle PORTA poorten laag
TRISA = %11111100             ;Maak PORTA.0 EN POTRA.1 uitgang voor LED aansturing


begin:                        ;Hoofdprogramma
 while teller1 < b
 
 toggle led1
 delayms 200
 teller1 = teller1 + 1
 delayms 200
 hserout[dec2 teller1]
 delayms 200
 wend
toggle led1
toggle led2

teller1 = 0
goto begin
end



kan iemand een voorbeeld geven of uitleg in picbasic, zodat ik snap wat ik fout doe en weer lekker verder kan proggen :)

als ik al goede voorbeelden vind is dat in asembler :(

deverbinding is goed , als ik rx en tx aanelkaarhang krijg ik terug wat ik verzend.

erkomt ook data aar niet leesbaar

er stan in de mapvan crownhill veelvoorbeelden over serieele data , maar geen uitleg hoe je een en ander insteld

Wie de vraag stelt, zal met het antwoord moeten leren leven.

heb je de GND ook aangesloten?

ben je asci aant doorsturen of hexadecimale waarden ofzo?

DEFINE H'SER_RCSTA 90h ' Enable serial port & continuous receive

Geeft dit een clue ??

Theo

In the beginning there was nothing.... and even that exploded...
Shiptronic

Overleden

GND is ook aangesloten

de teller telt van 1 tot b( =80)

door dec2 te gebruiken zouden de gegevens dec verzonden worden (de 2 is voor 2 decimalen achter de komma)

ik loop vast in:

HSEROUT
HRSOUT
SEROUT
RSOUT

Wie van de vier?

ik heb het crownhill boek, daar staan alle codes uitgelegd alleen ik zie het verband er niet tussen :)

@galaxy, ja dat hij continu kan ontvangen, maar het gaat hier om het verzenden, hij verzend ook wel wat en ik zie in hyperterminal ook van alles voorbijkomen , maar geen getallen, allemaal abrakababra

[Bericht gewijzigd door Shiptronic op donderdag 10 mei 2007 19:31:36

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Op 10 mei 2007 19:26:37 schreef shiptronic:
GND is ook aangesloten

ik loop vast in:

HSEROUT
HRSOUT
SEROUT
RSOUT

Wie van de vier?

ik heb het crownhill boek, daar staan alle codes uitgelegd alleen ik zie het verband er niet tussen :)

@galaxy, ja dat hij continu kan ontvangen, maar het gaat hier om het verzenden, hij verzend ook wel wat en ik zie in hyperterminal ook van alles voorbijkomen , maar geen getallen, allemaal abrakababra

Hserout : compatibiliteit met concurrent melabs.
Hrsout : Uit de koker van Crownhill. vindt ik een krachtiger command.
Serout : Software generated RS232. Traag en CPU-tijd vretend, maar je kan het aan elke gewenste pin toewijzen.
Rsout : idem.

Voor de clue; Die accolade hoort daar in ieder geval niet thuis.

Theo

In the beginning there was nothing.... and even that exploded...
Shiptronic

Overleden

die accolade is met het plakken op het forum gekomen, zal het even recht zetten (die aculade geeft ook een fout code als je goed kijk komt hij van regel 1 postie 1)

zal het even aan passen, bedankt voor de tip.

Wie de vraag stelt, zal met het antwoord moeten leren leven.

asteblief hier een progje wat zeker te weten werkt met de normale hyperterminal van M$

code:


device 16F628a               ;gebruikte µcontroller
';****************************************************************
';*   A.2,AN2,Vref  1 _|  ^  |_ 18 A.1,AN1                       *
';*   A.3,AN3,cmp1  2 _|     |_ 17 A.0,AN0                       *
';*   A.4,AN4,cmp2  3 _|     |_ 16 A.7,clckin,osc1               *lcd
';*   A.5,mclre,vpp 4 _|     |_ 15 A.6,clkout,osc2               *lcd
';*   gnd           5 _|     |_ 14 vdd                           *
';*   B.0,INT       6 _|     |_ 13 B.7,PGD,T1OSI                 *lcd
';*   B.1,RX,DT     7 _|     |_ 12 B.6,PGC,T1OSO,T1CKI           *lcd
';*   B.2,TX,CK     8 _|     |_ 11 B.5,                          *lcd
';*   B.3,CCP1      9 _|     |_ 10 B.4,PGM                       *lcd
';*                    |_____|                                   *
';****************************************************************

config intrc_osc_noclkout, wdt_off, lvp_off, mclre_on, pwrte_on,

;nu nog wat gezeik met registervermeldingen

;een berg decleraties                          ;maak gebruik van kristal als clock [clock snelheid is 20Mhz]
all_digital true                ;alle poorten zijn digitale poorten
portb_pullups true              ;dit commando zorgt voor wat minder hardware
           ;dit geeft aan hoeveel regels de lcd heeft
declare serial_baud 2400    ;de baudrate voor de seriële poort is op 57600 gezet
HSERIAL_RCSTA %10010000                                
HSERIAL_TXSTA %00100000                                
declare icd_req 1               ;hiermee zorgen we ervoor dat er kan worden gewerkt met een ICD
      
       
;poorten
;76543210                                                         
trisa = %11111111              ;hier staat dus welke A-poorten ingangen zijn (1 is ingang)
trisb = %00010000               ;hier staat dus welke B-poorten ingangen zijn (1 is ingang)          
portb = %00000010               ;hier staat welke poorten standaard hoog zijn.

;wat constante waarde
symbol aan  = 1                 ;als ergens 'aan' staat wordt bedoeld dat de poort hoog moet worden
symbol uit  = 0                 ;als ergens 'uit' staat wordt bedoeld dat de poort laag moet worden
symbol tijd = 100               ;dit geeft aan dat de naam tijd staat voor een waarde van 100
symbol sampletijd = 1000       ;dit geeft een constante waarde aan de naam sampletijd
symbol displaytijd = 1000      ;dit geeft een constante waarde aan de naam displaytijd


;wat makkelijke namen toekennen
symbol led       = portb.4      ;dit geeft aan op welke poort de controle led zit. en de poort heeft nu een naam
symbol vleermuis = portb.0      ;dit geeft aan op welke pin het signaal binnen komt. en de poort heeft nu een naam       
dim vleermuiss as word          ;dit is een soort dummy omdat we ergens de pulsjes moeten opslaan. [zie hoofdprogramma]

clear                           ;wis alle ramgeheugen  
delayms 500                     ;stabilisering van het display

;-------------------------------------------------------------------------------------------------------------------------------------------;
;hoofdprogramma
while 1=1                                   ;dit is een oneindige lus totdat we er uit springen
clear vleermuiss
vleermuiss = counter vleermuis, sampletijd  ;hier tellen we gedurende 'sampletijd' de pulsjes op 'vleermuis'
                                    ;wis het lcd scherm
         ;zorg voor een vertraging voordat het volgende commando uitvoeren.
Hserout ["frequentie"]
hserout [dec vleermuiss, " "]
hserout ["khz"]
hserout [bin porta , " "]
delayms displaytij[d
wend                                        ;begin opnieuw met deze lus
end                                         ;einde van het programma
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide
Shiptronic

Overleden

Ik ben er uit, define hoord niet bij picbasc?

volgende programma werkt, voor een ieder die er mee spelen wil:

code:




'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : J.E.Esselink                                      *
'*  Notice  : Copyright (c) 2007 J.E.Esselink                   *
'*          : All Rights Reserved                               *
'*  Date    : 9-5-2007                                          *
'*  Version : 1.0                                               *
'*  Notes   :  stel hyperterminal als volgd in: baud =9600,     *                                           *
'*          :  data bits =8, pariteit =geen, stopbit =1         *
'*          :  datatransportbesturing =geen                     *
'****************************************************************
DEVICE 16F628                 ;Gebruik een 16F628  type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ; de config
XTAL 4                        ;Kristal van 4 MHz
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

declare HSERIAL_BauD 9600     'set baudrate op 9600
DEclare HSERIAL_RCSTA $90     '  << VUL DEZE WAAREN IN MET HET PROGRAMMA
Declare HSERIAL_TXSTA $24     '   <<         PIC multi CALC 

DECLARE HSERIAL_CLEAR = ON    ' reset buffer bij een overflow? 


dim teller as byte            ' zet de grote van teller als een byte

teller = 0                    ' zet teller op waarde 0


begin:                        'hoofdprogramma

while teller < 10             'doe dit tot de waarde van teller groter word dan 10
toggle porta.0                'wissel de status van poort a.0 (pen 17)

hrsout dec teller             'stuur de waarde van teller serieel uit (rs232)
   teller = teller + 1        'verhoog de waarde van teller met een
delayms 500                   'wacht 500 miliseconden
TOGGLE PORTA.1                'wissel de status an poort a.1 (pen 18)
DELAYMS 500                   'wacht 500 miliseconden
wend                          'ga naar begin van de while lus

                              'hier kom je terecht als de waarde van teller grote word dan 10


teller =0                     'reset de teller, zet hem weer op 0
goto begin                    ' ga naar het  begin van het programma

 END                           ' hier is het gedan met de pret, einde programma


ik zie de vraag vaak voorbij komen, maar zelden een antwoord als het werk hoe het gelukt is.

ik heb geprobeerd zoveel mogelijk overbodige zooi er uit e halen.

zet 2x een led met een weerstand in serie naar de +5V op pen nr 17 en 18, deze dienen alleen om te zien of de pic het programma wel draaid en niet vast loopt.

Schema voor de MAX
http://www.oz1bxm.dk/PIC/628uart.gif

Wie de vraag stelt, zal met het antwoord moeten leren leven.
Shiptronic

Overleden

hier nog een programma om de serieele verbinding tussen PIC en PC te testen

de waarde die bij hyperterminal of serial communicator van proton verstuurd , word door de PIC weer terug gestuurd

code:


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : J.E.Esselink                                      *
'*  Notice  : Copyright (c) 2007 J.E.Esselink                   *
'*          : All Rights Reserved                               *
'*  Date    : 9-5-2007                                          *
'*  Version : 1.0                                               *
'*  Notes   :  stel hyperterminal als volgd in: baud =9600,     *                                           *
'*          :  data bits =8, pariteit =geen, stopbit =1         *
'*          :  datatransportbesturing =geen                     *
'****************************************************************
DEVICE 16F628                 ;Gebruik een 16F628  type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ; de config
XTAL 4                        ;Kristal van 4 MHz
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

declare HSERIAL_BauD 9600     'set baudrate op 9600
DEclare HSERIAL_RCSTA $90     '  << VUL DEZE WAAREN IN MET HET PROGRAMMA
Declare HSERIAL_TXSTA $24     '   <<         PIC multi CALC 

DECLARE HSERIAL_CLEAR = ON    ' reset buffer bij een overflow? 


dim waarde as byte            ' zet de grote van waarde als een byte

begin:                        'hoofdprogramma
hrsin dec waarde              'haal waarde op van de serieele poort (rs232)

hrsout  dec  waarde           'stuur de waarde die opgehaald is weer serieel uit (rs232)
  
delayms 10                    'wacht 10 miliseconden
TOGGLE PORTA.1                'wissel de status an poort a.1 (pen 18)
DELAYMS 100                   'wacht 500 miliseconden

goto begin                    ' ga naar het  begin van het programma


 END                           ' hier is het gedan met de pret, einde programma


Wie de vraag stelt, zal met het antwoord moeten leren leven.

Even een toevoeging,

Op 10 mei 2007 21:17:04 schreef shiptronic:
Ik ben er uit, define hoord niet bij picbasc?

volgende programma werkt, voor een ieder die er mee spelen wil:

code:




'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : J.E.Esselink                                      *
'*  Notice  : Copyright (c) 2007 J.E.Esselink                   *
'*          : All Rights Reserved                               *
'*  Date    : 9-5-2007                                          *
'*  Version : 1.0                                               *
'*  Notes   :  stel hyperterminal als volgd in: baud =9600,     *                                           *
'*          :  data bits =8, pariteit =geen, stopbit =1         *
'*          :  datatransportbesturing =geen                     *
'****************************************************************
DEVICE 16F628                 ;Gebruik een 16F628  type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC ; de config
XTAL 4                        ;Kristal van 4 MHz
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

declare HSERIAL_BauD 9600     'set baudrate op 9600
DEclare HSERIAL_RCSTA $90     '  << VUL DEZE WAAREN IN MET HET PROGRAMMA
Declare HSERIAL_TXSTA $24     '   <<         PIC multi CALC 

DECLARE HSERIAL_CLEAR = ON    ' reset buffer bij een overflow? 


dim teller as byte            ' zet de grote van teller als een byte

teller = 0                    ' zet teller op waarde 0


begin:                        'hoofdprogramma

while teller < 10             'doe dit tot de waarde van teller groter word dan 10
toggle porta.0                'wissel de status van poort a.0 (pen 17)

hrsout dec teller             'stuur de waarde van teller serieel uit (rs232)
   teller = teller + 1        'verhoog de waarde van teller met een
delayms 500                   'wacht 500 miliseconden
TOGGLE PORTA.1                'wissel de status an poort a.1 (pen 18)
DELAYMS 500                   'wacht 500 miliseconden
wend                          'ga naar begin van de while lus

                              'hier kom je terecht als de waarde van teller grote word dan 10


teller =0                     'reset de teller, zet hem weer op 0
goto begin                    ' ga naar het  begin van het programma

 END                           ' hier is het gedan met de pret, einde programma


ik zie de vraag vaak voorbij komen, maar zelden een antwoord als het werk hoe het gelukt is.

ik heb geprobeerd zoveel mogelijk overbodige zooi er uit e halen.

zet 2x een led met een weerstand in serie naar de +5V op pen nr 17 en 18, deze dienen alleen om te zien of de pic het programma wel draaid en niet vast loopt.

Ik ben sinds een paar weken begonnen aan de pic virus.
Ik heb ook continu gebruikt gemaakt van de search en de tutorials. wel zijn sommige dingen verouderd maar met wat modificaties en wat searchen op dit forum en googlen kom je al heel ver.

Ik heb hier nog nooit wat gepost maar dit vond ik wel nuttig voor de mensen die net zoals ik tegen hetzelfde probleempje opliep toen ik met deze code bezig was.

Ik vermoedt dat in deze code een externe christal gebruikt wordt.

code:


config HS_OSC 

Door de HS_OSC te vervangen met INTRC_OSC_NOCLKOUT en hiermee gebruik je de interne oscillator.
Oh, voor het geval je af vroeg of het ook met de nieuwe variant van de 16f628 werkte (de 16f628A).... bij mij wel!

Ik wil shiptronic(en anderen) heel erg bedanken voor het posten van de oplossing. Ik heb hierdoor heel veel geleerd en hoop dat anderen die net beginnen met microcontrollers niet de moed opgeven. Succes!

help

Golden Member

Intern oscillator is veel minder nauwkeurig dan een extern kristal en dat is zeker voor dit soort timingkritische toepassingen beter geschikt. Wat niet wil zeggen dat de interne clock niet zal werken, maar de kans op bijvoorbeeld een onstabiele verbinding is groter ...