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 :
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:
'****************************************************************
'* 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
heb je de GND ook aangesloten?
ben je asci aant doorsturen of hexadecimale waarden ofzo?
~Galaxy
In the beginning there was nothing.... and even that exploded...
DEFINE H'SER_RCSTA 90h ' Enable serial port & continuous receive
Geeft dit een clue ??
Theo
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 ]
~Galaxy
In the beginning there was nothing.... and even that exploded...
Op 10 mei 2007 19:26:37 schreef shiptronic:
GND is ook aangeslotenik loop vast in:
HSEROUT
HRSOUT
SEROUT
RSOUTWie 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
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.
timmie
niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide
asteblief hier een progje wat zeker te weten werkt met de normale hyperterminal van M$
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
Ik ben er uit, define hoord niet bij picbasc?
volgende programma werkt, voor een ieder die er mee spelen wil:
'****************************************************************
'* 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
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
'****************************************************************
'* 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
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:
'**************************************************************** '* 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.
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!
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 ...