Hallo,
Ik ben bezig met een scorebord te laten communiceren met de PC. Ik gebruik de MAX232 aangesloten op de UART van de microcontroller(16f628).
Mijn probleem is dat ik een 8 bits signaal, in het geheugen van de micro controller wil zetten. Nu heb ik gelezen over de MSCOMM, en Port.DLL. Alleen kan je dan maar 1 bit versturen via bijvoorbeel de TXD,DTR of de RTS. Hoe krijg ik 8 bits in het geheugen van de microcontroller?
MVG, Johnnie
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Je kan gewoon een byte data verzenden over de TX draad hoor. Kijk nog eens goed hoe die mscomm werkt, het is blijkbaar nodig.
hier is bijvoorbeeld een stukje (ook gebruikmakend van port.dll)
Private Sub Option1_Click()
i = OPENCOM("COM1,1200,N,8,1" )
If i = 0 Then MsgBox ("COM1 not available" )
TXD = 1
End Sub
Zou er dus ook bijvoorbeeld dan kunnen staan
TXD = 010001101 ?
MVG
Johnnie
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
awel ? je hebt toch een uart ?
gewoon je karaktere verzenden
het komt dan vanzel in de receive buffer langs de andere kant.
rimco
Digitaal - Mijn ding :P
in de visual basic sfeer voel ik me wel thuis.
ik heb ook gewoon met vb een gps module uitgelezen via mscomm control.
maar van deze zal je het ook goed kunnen leren: http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=35…
Op 5 september 2006 11:03:45 schreef johnnie:
hier is bijvoorbeeld een stukje (ook gebruikmakend van port.dll)Private Sub Option1_Click()
i = OPENCOM("COM1,1200,N,8,1" )
If i = 0 Then MsgBox ("COM1 not available" )
TXD = 1
End SubZou er dus ook bijvoorbeeld dan kunnen staan
TXD = 010001101 ?
MVG
Johnnie
=====
@Johnnie,
TXD = 1 , is de decimale notitie; is dus binair 0000 0001
Dus karren maar !
gtrz. pF
Op 5 september 2006 23:48:40 schreef PicoFarad:
[...]
=====@Johnnie,
TXD = 1 , is de decimale notitie; is dus binair 0000 0001Dus karren maar !
gtrz. pF
ahh ok dus als ik er neerzet TXD 3 dan zal die de code 00000011 versturen ?
mvg
Ik heb het gevoel dat je alleen met die port.dll alleen maar een 1 of een 0 kan verzenden
Ik heb gelezen over de optie Mscomm en denk dat er met dit veel meer mogelijk is.
Nu heb ik een stuk gemaakt in Vb 6:
Private Sub Command1_Click()
Dim data As Byte
data = 10
MSComm1.Output = Chr(data)
End Sub
Private Sub Option1_Click()
MSComm1.Portopen = True
End Sub
Private Sub Option2_Click()
MSComm1.Portopen = False
End Sub
Nu stuurt vb dus het getal 10 als ascii toch naar de usart van de microcontroller 16f628 ?
En als ik het goed begrijp zou het getal 10 dan weer bij de uart als binare code (00001010) als 1 byte binnenkrijgen ?
alvast bedankt voor de hulp
mvg
Johnnie
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Inderdaad, je begint em te snappen. Ik zie dat je daar wat aan het experimenteren bent met MSComm1.Portopen, als die niet true is zal je errors krijgen als je data probeert te verzenden, ik maak gewoon de port open in het begin, en doe em niet meer toe, dat werkt zo zonder problemen.
Hallo
Bedankt voor het antwoord,
Jah ik heb nu ook in Vb gezet dat de poort altijd aan staat.
Ik heb dit programmatje gemaakt in mikrobasic:
Program Uart
dim Received_byte as byte
main:
USART_init(9600) ' initialize USART module
while true
if USART_data_ready = 1 then ' if data is received
Received_byte = USART_read ' read received data,
USART_write(Received_byte) ' send data via USART
end if
wend
end.
Nu gebruik ik de communication terminal van het programma microbasic en zie ik dat ik als ik een DEC 10 stuur ook een 10 terug krijg (en een DEC 1 dan 249 terug krijg ?)
En net zoals bij hex 150 stuur 0x96 terug krijg.
Ik probeer dus nu een led aan te sturen (RA0)maar dat werkt niet echt hier programma:
Program Uart
dim Received_byte as byte
main:
USART_init(9600) ' initialize USART module
while true
if USART_data_ready = 1 then ' if data is received
Received_byte = USART_read ' read received data,
end if
if Received_byte = %00001010 gosub led
end if
wend
led:
Porta.1 = 1
delay_ms(3000)
return
end.
Iemand surgesties over wat ik verkeerd doe of mimschien een manier om het beter te doen ?
Mvg en bedankt
Johnnie
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Je gebruikt je If niet goed, je moet met If...then werken.
Overigens is het gemakkelijker als je code tussen [code ] tags zet, dan kan je spaties gebruiken op in te springen:
Program Uart
dim Received_byte as byte
main:
USART_init(9600) ' initialize USART module
while true
if USART_data_ready = 1 then ' if data is received
Received_byte = USART_read ' read received data,
end if
if Received_byte = %00001010 then
gosub led
end if
wend
led:
Porta.1 = 1
delay_ms(3000)
return
end.Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Ow ja, ik zie het al, de goto is verkeerd. Wat jij bedoelt te programmeren is het volgende:
Program Uart
dim Received_byte as byte
main:
USART_init(9600) ' initialize USART module
while true
if USART_data_ready = 1 then ' if data is received
Received_byte = USART_read ' read received data,
end if
if Received_byte = %00001010 then
goto led
end if
wend
led:
Porta.1 = 1
delay_ms(3000)
goto main
end.Een goto is beter te vermijden, als je ingewikkelde zaken gaat maken zal je zo in de spaghetti je weg niet meer vinden. Je kan de 2 regeltjes zetten ipv "goto led", of het mooiste, werken met sub procedure's:
Program Uart
dim Received_byte as byte
sub procedure led
Porta.1 = 1
delay_ms(3000)
end sub
main:
USART_init(9600) ' initialize USART module
while true
if USART_data_ready = 1 then ' if data is received
Received_byte = USART_read ' read received data,
end if
if Received_byte = %00001010 then
led
end if
wend
end.Trouwens: je hebt nog niets gedaan om je led weer uit te schakelen, voorlopig zet je progje de led alleen aan.
[Bericht gewijzigd door Videomodulator op ]
hallo,
In mijn programma waar ik gosub gebruikt is eigenlijk hetzelfde als goto.. bij gosub springt die dus naar de label led en wanneer die bij return komt hij weer verder gaat met het programma waar die was.
Ook het programma die u heeft gemaakt werkt niet het ledje gaat niet aan.
jah klopt ik heb nog niet geprobeerd het ledje uit te krijgen.
Het is de bedoeling dat ik hiervan leer hoe de uart werkt en dat ik daarna mijn scorebord ermee kan aansturen 
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Voeg nog eens onder de "main:" de juiste initialisatie toe (die voor de UART wordt door de library gedaan), dus "TRISA = %00000000" (alle pinnen op porta als uitgang, standaard staan ze als (analoge) ingang).
Dat had ik gedaan.
En ook Porta = %00000000 omdat die de hele poort aan het begin al hoog maakte.
Dit werkte ook niet
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Mag ik dan eens vragen hoe jij die byte exact door probeert te zenden naar de PIC. Als je een gemakkelijke neemt zoals "A" (zie ASCII tabel, wordt %0100 0001), dan kan je in Hyperterminal dat al testen, zo sluit je fouten in de verzending uit.
Martijn v
KIS!!: Keep It Simple
je hoeft geen declaratie voor Port.dll aan te maken.
Gewoon de MScom in je VB project slepen en programeren.
Voor het verzenden van de gegevens gebruiken wij een programma in microbasic
En dan met een eerder programma kunnen we ook zien dat we ook een 10 terug krijgen en als we een hex sturen een 0x96.
Dus de verbinding is wel goed.
Martijn v: jah klopt wij maakten eerst gebruik van port.dll maar als met mscomm hoeft dat niet.
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Volgens de screenshot verzend je "10" in HEX, dus binair '0001 0000'.
Wat je moet verzenden, is ofwel "10" in DEC (decimaal, gewone getallen dus, bij format DEC aanklikken), of "0A" in HEX ,dat is dan binair '0000 1010' en zou wel moeten ontvangen worden.
[Bericht gewijzigd door Videomodulator op ]
Ja nu stond die dus toevallig op hex maar ook op dec werkt die helaas niet.
Maar komt er in de uart niet een ASCII getal inplaats van een binair getal ?
Ik heb hier een nieuw stukje wat werkt
program USART_lib
dim i as byte
sub procedure led
PORTA.1 = 1
end sub
main:
TRISA.1 = 0
CMCON = 7
Usart_init(9600)
while true
if Usart_Data_Ready = 1 then
i = Usart_Read
Usart_Write(i)
end if
if i = 6 then
led
end if
wend
end.het gekke is dus dat ik het getal 241 moet sturen naar de uart zodat de led aangaat en niet 6.
Weet mischien iemand hoezo dit is ?
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
6 ==> 0000 0110
241 ==> 1111 0001
Zeker dat het niet 249 (1111 1001) is, dan zijn alle bitjes geinverteerd. Maar er zit daar wel iets raars mis, ben je zeker dat je alles goed ontstoord enzo hebt: 10k weerstandje gebruiken voor je reset (rechtstreeks verbinden kan erg rare zaken geven), voedingsontstoring van 100nF vlakbij je PIC, ....
Heb het eindelijk werkend gekregen de kristal was niet goed 
Nu loop ik ook gelijk tegen het volgend probleem.
Ik heb dit geschreven
program scorebord_uart
dim D1 as byte
dim i as byte
main:
trisa.0 = 0
trisa.1 = 0
trisa.2 = 0
trisa.4 = 1
trisb.0 = 0
trisb.4 = 1
trisb.5 = 1
trisb.6 = 1
trisb.7 = 1
CMCON = 7
loop:
Usart_init(9600)
if Usart_Data_Ready = 1 then
i = Usart_Read
Usart_Write(D1)
end if
If i = 1 then gosub D1 end if
goto loop
D1:
D1 = D1 + 1
If D1 = 3 then D1 = 1 end if
If D1 = 1 then
Porta.1 = 1
delay_ms(1000)
porta.1 = 0
delay_ms(50)
end if
If D1 = 2 then
Porta.2 = 1
delay_ms(1000)
porta.2 = 0
delay_ms(50)
end if
i = 0
return
end.Nu werkt dit wel alleen 2 problemen.
1: wanneer ik een 1 stuur reageert die daar niet direct op moet hem een paar keer sturen voordat die erop reageerd..
Ik dacht iets van dat die hem niet vaak genoeg inleest en dan wanneer ik die 1 stuur hij al voorbij het punt is waar die de i moet inlezen..
Maar de microcontroller is toch snel genoeg dat die hem eigenlijk gelijk kan inlezen ?
iemand mischien surgesties voor dit ?
2:
Wanneer ik poorten A3 en B3 declareer als input of output dan gaan ze gelijk aan en werkt ook de uart niet meer.
Nu hebben wij deze gehoord dat dit ook ingesteld moet worden : CMCON = 7
Heeft dit er wat mee te maken mischien ? maar als wij die zin weg halen gaan de leds ook niet meer aan.
Hopelijk kan iemand mij hiermee helpen
Mvg
Johnnie