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

Eén voor één doorsturen en in software optellen tot een byte.

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

awel ? je hebt toch een uart ?

gewoon je karaktere verzenden
het komt dan vanzel in de receive buffer langs de andere kant.

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 Sub

Zou 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 0001

Dus 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

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

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.

Hallo,

Ja foutje met kopieren zelf stond het in het programma al goed.

mvg

johnnie

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 :)

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

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.

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

http://img96.imageshack.us/img96/4849/terminallw4.jpg

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.

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 ?

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