NM7010A TWI-on akad az UART-tal

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
poeri
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2006. október 20. péntek, 6:00

NM7010A TWI-on akad az UART-tal

Hozzászólás Szerző: poeri »

Kedves AVR ismerők!

mega64, twi és NM7010A használatakor minden OK, nagy a boldogság az alábbi módon:
Config Tcpip = Int4 , Mac = 12.128.12.34.56.78 , Ip = 192.168.100.8 , Submask = 255.255.255.0 , Gateway = 192.168.100.254 , Localport = 1000 , Tx = $55 , Rx = $55 , Twi = &H80 , Clock = 400000

Socketlisten ...

A mókás, hogy rendesen lehet kapcsolódni a sockethez, lehet rajta kommunikálni, stb. Működik a Hardos USART is oda-vissza interrapotos szubrutinban kezelve a fogadás. Ha azonban él egy socket a hálózaton, akkor a soros irq-s fogadás tök hibázik, kihagy karaktereket. Ha bontom a socketet a hiba nem szűnik meg, csak ha resetelem az áramkört.

Na ez meg mi a búbánat lehet :?:

Segítségeteket, ötleteket előre is köszönöm!
poeri
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Socketkor nincs az IT letiltva?

Amúgy tipp:
http://avr.tavir.hu/modules.php?name=Fo ... webszerver
Itt Higgins küzd egy ilyen modullal.... Tapasztalata hegynyi már vele....
Avatar
Higgins
Tranzisztorgyógyász
Hozzászólások: 169
Csatlakozott: 2006. február 23. csütörtök, 7:00

Hozzászólás Szerző: Higgins »

Hegynyi tapasztalatom azért nincs, de köszönöm a bókot kedves Róbert! :oops:
A probléma érdekes, még én is csak tapogatózom e modullal kapcsolatban. Ha elmondanád, részletesen, hogy ezzel az áramkörrel mit szeretnél csinálni, vagy a kódot ide belinkelnéd az sokat segítene, mert tanulva a saját hibámból, nem mindegy, hogy hol hívod meg a USART-ot kezelő rutint. Pl. előtte socket lezár, hogy semmi ne kavarjon be, majd Disable interrupts valamit itt gondolom kezdesz a soros porton bejövő adattal majd utána Enable interrupts, és visszamész a wiznet modult kezelő részhez, ott újra nyitsz egy socket-et. Jó lenne látni azt a kódot, szerintem Róbert is csak akkor tud többet mondani.

Üdv: Higgins
Avatar
poeri
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2006. október 20. péntek, 6:00

Hozzászólás Szerző: poeri »

Sziasztok!

Nos alább mellékelem a kódot...

A cél amit el szeretnék érni, hogy a uC (mega64) folyamatosan nyitva tartson pár socketet (W7010A), amire 1-2 PC automatikusan csatlakozik. Ezeken a csatornákon kap utasítást, hogy mikor melyik portjára tegyen ki 1-et (relé). Mideközben a uC 2db (vagy 4db (m1280)) UART-on várja a beérkező adatokat, amik spontán érkeznek (Proximityről) és ezeket egy előtaggal (már hogy melyik portjára esett be éppen az adat) tvábbítja az éppen élő LAN csatornákon.
Direkt a Bascom és a Wiznet barátságára fel alkalmazok m64-et a TWI miatt és vettem meg az 1.11.8.3-as Bascom-ot, hogy használhassam a megírt TCPIP függvényeket.
Midezekből eredően nem szeretném lezárni a socketet miden egyes soros olvasás alkalmával ha nem feltétlen szükséges.
Ami a megszakítást illeti, muszáj, hogy ott legyen valami elásva, mert a megszakításos olvasás élő socket esetén kihagy karaktereket és nem javul meg socket bontás után. A pufferelt olvasás teljesen süket nytott socketnél, de miután sikeresen bezárul a socket, a puffer méretének megfelelő cucc bepotyog.

Segítségeteket Köszönöm!
Poeri

Kód: Egész kijelölése

$regfile = "M64def.dat"                                     ' specify the used micro
'$prog &HFF , &H62 , &HD9 , &HFF                             'fusebitek beállítása
$crystal = 16000000                                         ' used crystal frequency
$baud = 9600                                                ' use baud rate
$baud1 = 9600                                               ' use baud rate
$hwstack = 64                                               ' default use 32 for the hardware stack
$swstack = 64                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space
'$xa                                                         ' xram access

Config Scl = Portd.0                                        'TWI scl config
Config Sda = Portd.1                                        'TWI sda config
Config Portb = Output                                       'Várakozási LEDek vezérlése
Config Portd = Output                                       'PORTd használata kimenetnek
Config Timer0 = Timer , Prescale = 1024                     'Timer0 beállítása 1024-es előosztóval
Config Serialin = Buffered , Size = 20
Config Serialin1 = Buffered , Size = 20
Config Twi = 400000

Const Sock_stream = $01                                     ' Tcp
Const Sock_dgram = $02                                      ' Udp
Const Sock_ipl_raw = $03                                    ' Ip Layer Raw Sock
Const Sock_macl_raw = $04                                   ' Mac Layer Raw Sock
Const Sel_control = 0                                       ' Confirm Socket Status
Const Sel_send = 1                                          ' Confirm Tx Free Buffer Size
Const Sel_recv = 2                                          ' Confirm Rx Data Size

'socket status
Const Sock_closed = $00                                     ' Status Of Connection Closed
Const Sock_arp = $01                                        ' Status Of Arp
Const Sock_listen = $02                                     ' Status Of Waiting For Tcp Connection Setup
Const Sock_synsent = $03                                    ' Status Of Setting Up Tcp Connection
Const Sock_synsent_ack = $04                                ' Status Of Setting Up Tcp Connection
Const Sock_synrecv = $05                                    ' Status Of Setting Up Tcp Connection
Const Sock_established = $06                                ' Status Of Tcp Connection Established
Const Sock_close_wait = $07                                 ' Status Of Closing Tcp Connection
Const Sock_last_ack = $08                                   ' Status Of Closing Tcp Connection
Const Sock_fin_wait1 = $09                                  ' Status Of Closing Tcp Connection
Const Sock_fin_wait2 = $0a                                  ' Status Of Closing Tcp Connection
Const Sock_closing = $0b                                    ' Status Of Closing Tcp Connection
Const Sock_time_wait = $0c                                  ' Status Of Closing Tcp Connection
Const Sock_reset = $0d                                      ' Status Of Closing Tcp Connection
Const Sock_init = $0e                                       ' Status Of Socket Initialization
Const Sock_udp = $0f                                        ' Status Of Udp
Const Sock_raw = $10                                        ' Status of IP RAW


Dim Bclient As Byte                                         ' socket number
Dim Index As Byte
Dim Chind As Byte                                           'csatorna változó
Dim Result As Word , Result2 As Word                        ' result
Dim Flag As Byte
Dim Peer As Long


Dim I As Byte                                               'ciklus számláló
Dim Timecount As Byte                                       'időzítő számláló
Dim Temp As String * 80                                     'konvertálás előtti átmeneti
Dim Delt(4) As Word                                         'tömb a késleltetési időnek
Dim Powt(4) As Word                                         'tömb az üzemidőnek
Dim Dels As String * 3                                      'késleltetés kiírásának
Dim Pows As String * 5                                      'üzemidő kiírásának
Dim Delch As Byte                                           'LED port címzéshez
Dim Powch As Byte                                           'POWER port címzéshez
Dim Kbd As Byte                                             'billeytű puffer
Dim Cht As String * 1
Dim 2cht As String * 2
Dim Sttmp As String * 80                                    'soros chr
Dim Ntmp As Byte
Dim Indtmp As Byte                                          'index váltosó temporary-je
Dim Btmp As Byte
Dim Chart(255) As Byte

Dim U0buf As String * 20                                    'UART 0 puffer
Dim Com0 As String * 12                                     'parancs szó
Dim U1buf As String * 15                                    'UART 0 puffer
Dim Com1 As String * 12                                     'parancs szó


'On Urxc Rec_isr                                             'UART0 interrupt beállítása
'On Urxc1 Rec_isr1                                           'UART1 interrupt beállítása
On Ovf0 Tim0_isr                                            'Timer0 interrupt beállítása

Declare Sub Statesend(byval Channel As Byte)
Declare Sub Statesendall()

Open "com1:" For Binary As #1
Open "com2:" For Binary As #2


Print Chr(27) ; "[2J";                                      'clear screen
Print "Start on Com1"
Print #2 , Chr(27) ; "[2J";                                 'clear screen
Print #2 , "Start on Com2"

LDI R16,$00                                                 '16-os regiszterbe "00000000"
!OUT DDRF,R16                                               'PortA iránya bemenet
LDI R16,$FF                                                 '16-os regiszterbe "11111111"
!OUT PORTF,R16                                              'felhúzó ellenállások bekapcsolása


$lib "tcpip.lbx"                                            ' specify the tcpip library
$lib "I2c_twi.lbx"

I2cinit
Print #2 , "i2c init OK"

Enable Timer0                                               'Timer0 interrupt bekapcsolása
'Enable Urxc                                                 'UART0 interrupt bekapcsolása
'Enable Urxc1                                                'UART1 interrupt bekapcsolása
Enable Interrupts                                           'interrupt kezelés beállítása

Config Tcpip = Int4 , Mac = 12.128.12.34.56.78 , Ip = 192.168.100.8 , Submask = 255.255.255.0 , Gateway = 192.168.100.254 , Localport = 1000 , Tx = $55 , Rx = $55 , Twi = &H80 , Clock = 400000
Print #2 , "Set IP to 192.168.100.8 OK"                     ' display a message


U0buf = ""
U1buf = ""
For I = 1 To 15
   Sttmp = ""
Next I
Timecount = 0                                               'idő számláló nullázása
For I = 1 To 8                                              'végig a tömbvátozókon
   Delt(i) = 0                                              'várakozási idő nullázása
   Powt(i) = 0                                              'üzem idő nullázása
Next I


Do
'********************************** Hálózati kommunikáció **********************
      Result = Socketstat(index , 0)                        ' get status
      Select Case Result
         Case Sock_established

           Result = Socketstat(index , Sel_recv)            ' get number of bytes waiting
            If Result > 0 Then Do
               Result = Tcpread(index , Temp)
               If Len(temp) = 8 And Mid(temp , 2 , 1) = ";" And Mid(temp , 5 , 1) = ";"then       ' értelmezhető parancs?
                  Sttmp = Left(temp , 1)                    'csatorma levág
                  Ntmp = Val(sttmp)                         'csatorna konvertál
                  Sttmp = Mid(temp , 3 , 2)                 'várakozás kivág
                  Delt(ntmp) = Val(sttmp)                   'várakozás konvertál
                  Delt(ntmp) = Delt(ntmp) * 60              'szorzás percről másodpercre
                  Sttmp = Right(temp , 3)                   'üzemodő levág
                  Powt(ntmp) = Val(sttmp)                   'üzemidő konvertál
                  Powt(ntmp) = Powt(ntmp) * 60              'szorzás percről másodpercre

                  Delch = 4 - Ntmp                          'Led port pin meghat
                  Powch = 7 - Ntmp                          'power port meghat
                  If Delt(ntmp) > 0 Then                    'várakozási állapot
                     Set Porta.delch                        'LED BE
                     Call Statesend(ntmp)                   'állapotjelentés küldése

                  Elseif Delt(ntmp) = 0 And Powt(ntmp) > 1 Then       'üzem állapot
                     Set Portb.powch                        'POWER KI
                     Call Statesend(ntmp)                   'állapotjelentés küldése

                  Else                                      'Inaktív állapot
                     Reset Porta.delch                      'LED KI
                     Reset Portb.powch                      'POWER KI
                     Call Statesend(ntmp)                   'állapotjelentés küldése
                  End If

               Elseif Temp = "@" Then
                  Call Statesendall()
               Elseif Lcase(temp) = "exit" Then
                  Closesocket Index
               Else                                         'ha nem szabványos parancs
                  Temp = ""                                 'akor kuka
                  Result2 = Tcpwrite(index , "Nem értelmezhetö parancs !!!{013}{010}")
               End If
            Loop Until Result = 0

         Case Sock_close_wait
            Print #2 , "close_wait"
            Closesocket Index

         Case Sock_closed
            Print #2 , "closed"
            Bclient = Getsocket(index , Sock_stream , 5000 , 0)       ' get socket for server mode, specify port 5000
            Print #2 , "Socket " ; Index ; " " ; Bclient
            Socketlisten Index
            Print #2 , "Result " ; Result
      End Select

   If Index < 3 Then
      Incr Index
   Else
      Index = 0
   End If


'*********************** Soros portok kezelése ******************************
   While Ischarwaiting() = 1
      Cht = Waitkey()
      If Cht = Chr(13) Or Cht = Chr(10) Then                ' ha sorvége
         Com0 = U0buf
         U0buf = ""
         Clear Serialin
      Else
         U0buf = U0buf + Cht
      End If
   Wend

   While Ischarwaiting(#2) = 1                              'was there a char?
      Cht = Waitkey(#2)
      If Cht = Chr(13) Or Cht = Chr(10) Then                ' ha sorvége
         Com1 = U1buf
         U1buf = ""
         Clear Serialin1
      Else
         U1buf = U1buf + Cht
      End If
   Wend


Loop

Close #2

End



'Rec_isr:                                                    ' Sorosporton adatfogadás megszakításrutin
'   If Udr = 10 Or Udr = 13 Then
'      Com0 = "S1:" + U0buf                                  '
'      Open "comd.3:19200,8,n,1" For Output As #2
'      Print #2 , Com0
'      Close #2
'      U0buf = ""
'   Else
'      U0buf = U0buf + Chr(udr)                              'add to buffer
'   End If
'Return

'Rec_isr1:                                                    ' Sorosporton adatfogadás megszakításrutin
'   If Udr = 10 Or Udr = 13 Then
'      Com1 = "S2:" + U1buf                                  '
'      Print Com1
'      U1buf = ""
'   Else
'      U0buf = U1buf + Chr(udr)                              'add to buffer
'   End If
'Return


Tim0_isr:                                                   '###IDŐZÍTŐ ÉS JELENTŐ SZUBRUTIN###
   If Timecount = 32 Then                                   'ha a másodperc letelt
      Timecount = 1                                         'nullázzuk a számlálót
      For I = 1 To 4                                        'végigig a porton
      Delch = 4 - I                                         'Led port pin meghat
      Powch = 7 - I                                         'power port meghat
         If Delt(i) > 1 Then                                'várakozási állapot
            Decr Delt(i)                                    'csökkentjük a várakozási időt

         Elseif Delt(i) = 1 Then                            'várakozási állapot vége
            Reset Porta.delch                               'LED KI
            Set Portb.powch                                 'POWER BE
            Delt(i) = 0                                     'nullázzuk a várakozási időt
            Call Statesend(i)                               'állapotjelentés küldése

         Elseif Powt(i) > 1 Then                            'üzem állapot
            Decr Powt(i)                                    'üzemidő csökkentése

         Elseif Powt(i) = 1 Then                            'üzem állapot vége
            Reset Portb.powch                               'POWER KI
            Powt(i) = 0                                     'nullázzuk az üzemidőt
            Call Statesend(i)                               'állapotjelentés küldése

         Else                                               'Inaktív állapot
            Open "com2:" For Binary As #2
            If Porta.delch = 1 Then                         'ELLENŐRZÉS DELAY
               Reset Porta.delch                            'LED KI
               Print #2 , "Gebasz a várakozási csatorna kezelésében!!!"
            End If

            If Porta.delch = 1 Then                         'ELLENŐRZÉS POWER
               Reset Portb.powch                            'POWER KI
               Print #2 , "Gebasz az üzemi csatorna kezelésében!!!"
            End If
            Close #2

            If Com0 <> "" Then
               Result = Tcpwrite(index , Com0 , 12)         ' send Com1
               Com0 = ""
            End If

          End If
      Next I
   End If
   Incr Timecount                                           'az időszámlaláó növelése
Return



Sub Statesend(channel As Byte )                             'megadott csatorna állapotának kiiratása
   Dels = Str(delt(channel))
   Pows = Str(powt(channel))
   Open "com2:" For Binary As #2
   Print #2 , "C" ; Channel ; ":" ; Dels ; ";" ; Pows       'jelentés küldése
   Close #2
   Temp = "C" + Str(channel) + ":" + Dels + ";" + Pows + "{013}{010}"
   Result2 = Tcpwrite(index , Temp , 12)
End Sub



Sub Statesendall()                                          'működő vagy az első csatorna állapotának kiíratása
   For I = 1 To 4
      If Delt(i) > 0 Or Powt(i) > 0 Then                    'ha az 1. csatorna aktív
         Call Statesend(i)
      End If
   Next I
End Sub
poeri
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Ha jól emlékszem a socket nem maradhat nyitva. Azaz bejön az adat (ezt az INT résszel jelzi a soros port), feldolgozod, majd nyitsz egy socketet és kiküldöd. Kérdés mire kell kiküldeni. WEBlap? UDP? VCP?

Amire vigyazni kell:
Azonnali beavatkozást igénylő holmi esetén a LAN lassú. Pontosabban a csomagok nincsenek dedikáltan prioritásolva.


Fontos! Ilyet nem csinálunk bascom alatt:

Kód: Egész kijelölése

LDI R16,$00                                                 '16-os regiszterbe "00000000"
!OUT DDRF,R16                                               'PortA iránya bemenet
LDI R16,$FF                                                 '16-os regiszterbe "11111111"
!OUT PORTF,R16                                              'felhúzó ellenállások bekapcsolása

Regisztert, kiírást direktben _soha_ nem macerálunk. A programfutást erősen veszélyezteti a direkt regisztermatatás... ez esetben meg különösen!
Ami szóbajöhet e helyett:

Kód: Egész kijelölése

config porta=input
porta=255

Ez minek?
For I = 1 To 15
Sttmp = ""
Next I
Avatar
poeri
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2006. október 20. péntek, 6:00

Hozzászólás Szerző: poeri »

Szia Robert!

Socket nem maradhat nyitva - Jól értem, hogy akkor nem lehet a uC Server? Az lenne a koncepció, hogy ha beérkezik egy soros gyel akkor megy a PC felé, viszont menetközben a PC-től kapja az utasításokat, hogy melyik relét húzza meg... Ezt hogy tudnám megoldani, hogy ha lezárom a socketet? Tehát hogy tudok adatfogadásra készen állni, úgy hogy a socketet eldobálom?

Esetleg lehet olyat, hogy 2 socketen server vagyok 2-n pedig kliens?
Úgy el tudnám képzelni, hogy a PC és a uC- is connectálgat egymásra és mindketten bontanak a beszélgetés végén.

Vagy csináljam azt, hogy időnként bontom a socketet, elintézem a soros pufferek kiolvasását, aztán újra megnyitom a servert?

Ja igen a PC-n alkalmazás futkos, ami automatikusan connectál a uC-re és várja onnan a Soros-ra érkezett adatokat, valamint küldözget neki parancsokat a relék húzkodásához.

A For ciklus benntmaradt StringTemp inicialicáló szemét.

Köszi!
poeri
Avatar
TyuTyu
DrótVégénSzéndarab
Hozzászólások: 40
Csatlakozott: 2005. június 5. vasárnap, 6:00

Hozzászólás Szerző: TyuTyu »

Ahoj

TyuTyu belevau:

1, miert ne lehetne nyitva socket ?
2, nalam socket nyitva allandoan (Higgins latta eloben)
3, kozben persze bufferes rs232
(html get, statikus kiszolgalas, dinamikus lekerdezes,
dinamikus kiszolgalas, socket close, socket open..... es igy tovabb)

TyuTyu
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Persze így lehet kapcsolat nyitva...

Csak az eredeti 2-vel ezelőtt a bejövő jelre megy ki a PC fele adat. ez HTML alapon bnem fog menni, ugyanis hianyzik a kérés! amire a válasz megy. Ez így max UDP protokoll lehet amit a PC figyel, hogy van-e valami....


Ugyanez igaz visszafele is. A Modul figyel, hogy jött e valami befele.


Ez a klasszikus datagramm (UDP) protokoll lényege...Szóval nem TCP-HTML párost kell építeni...

Tyutyu: így megoldható, nálad HTML kérés/adás zajlik. Úgy megy...
Vendég

Hozzászólás Szerző: Vendég »

Most épp itthon vagyok, és itthon meg nincs netem, csak ritkán tudom megnézni a fórumot. Róbertnek adok igazat, egyébként én is hasonló dologra gondoltam. :oops:
Mivel a sorosportra érkező adat függvényében kell valamit is csinálni, szerintem felesleges egy TCP/IP kapcsolatot felépíteni.Fogadsz valamit soros porton bufferelve, majd UDP-n meg elküldöd. A wiznet modulhoz ott van a gyári UDP peer példakód, szerintem azt nagyon jól lehetne hasznosítani.

A version 3-as TWI sampleben plusz még van egy delphi-s segédprogram, amivel ellenőrízheted az UDP és TCP-s kapcsolatot is. Ez tökéletes segítség lehet számodra.Ezt használtam én is, én ebből indulnék ki a helyedben.

Előbb egy USART figyelése,betolod bufferba majd, UDP-n kiküldöd, és ezt a PC-n lévő progi pl. amit visual basicben írtál, az meg figyeli.
Sőt, a Ben Zijstra féle UDP-s kapcsolat felépítése és visual Basic program forráskódja is nagy segítség lehet neked.

A webserver topicban benne van a pontos URL. Atmega32+RTL8019AS webszerver található rajta, valamint az UDP-s kommunikáció.

Ha ez megy, akkor meg lehet a többi USART-ot is ezen analógiára megcsinálni.Hirtelen ez jutott az eszembe, bár ez az én verzióm, de lehet neked majd más jut az eszedbe.

Sok sikert, és jó küzdelmet a modullal. 8)

Üdv: Higgins
Robert-

Hozzászólás Szerző: Robert- »

Az UDP előnye:
- nem kell visszajövő nyugtázócsomag
- könnyen kezelhető
- internetalapon is megbízható (így működnek a timeszerverek)
- kisebb az erőforrásigénye, mint a TCP/IP-nek


A megvalósított RTL8019AS+M32 chip helyett a kisebb M16 is bőven elegendő. Sőt ha picike csomag is elegendő (~3-400 byte), akkor akár M8 chip is elegendő.

A sorosport miatt vigyázz arra, hogy a kvarc ne térjen el a sorosporti bpstől. Azaz ne legyen %-os hiba. A 4 MHz kvarc+9600 bps esetén a 0,2% hiba is már adatvesztést okoz másik uP rendszerben!

Az RTL8019AS chip esetén (ezt veséztem ki) bejövő csomag INT-et generál. Így a csomagfogadás megoldható egyszerűen, az INT0 vagy INT1 láb dolgozza fel. A sorosport esetén (ha elég egy darab) akkor szintén INT alapon le tudod kezelni. Ha több sorosportra van szükség, akkor SW alapú sorosport Do-Loop ciklusban figyeled, valamelyiken van-e valami. FONTOS! A hardveres sorsport ECHOval működik alapban! A SW alaú nem ad ki visszhangot magából. A DoLoop figyelés előnye, hogy többször végigfut mint ami idő alatt egy bit beérkezik. Több sorosport esetén megoldható a Philips egyik IC-je tud 4 sorosport-I2C konverziót. Igaz itt a soros bemenet csak 64 byte FiFoval bír.

De akár néhány kicsi Tiny2313 is felfűzhető és HW-es UART akad ezekben. És utána valami soros buszra őket (I2C slave, SPI Slave, stb).

A Philips IC ~4$-os ára sztrem húzós lehet...

Az UDP kezelés oprendszer szinten van megvalósítva...
De van hátránya is: A csomagot a vakvilágba küldöm, nincs ismeret arról, hogy megérkezett.
UDP kommunikáció felépítése egyszerű, most keresek Liberty Basic alá megvalósítát:). Ez a nyelv kb. ua. mint a Bascom Basicja, csak Win alá ablakkezelésel lehet SWket írni. És a fordító ugyanígy tud (azonos forrásprogramból LINUX, OS2 és AMIGA alá is futtatható állományt készíteni!).
Avatar
poeri
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2006. október 20. péntek, 6:00

Hozzászólás Szerző: poeri »

Kedves hozzáértők!

Az kínom, hogy eddíg ez a panel állandóan nyitott sockettel, kommunikálva a PC-vel Sorosporti figyelés nélkül vígan működött. (PC csatlakozik, utasítást ad, fogadja ugyanazon a socketen válaszban kapott állpotjelentéseket) Ezt a meglévő rendszert kellene 2db soros eszköz információjának továbbításával bővítenem meglévő PC-s alkalmazás esetén. Nagy pofával úgy gondoltam, hogy mi sem egyszerűbb, csak úgy mint egy állapotjelentést, elküldöm a soros adatot is. Elküldeni még csak-csak hozzájutni nyitott socket közben a pufferben lévő byt-okhoz hm... itt véreztem el.

TyuTyu kérlek ments meg és mutass nekem olyan kódot, amivel ez nálad működ!

Robert! Biztos superláma mivoltom az oka, de nem tudom hova tenni a html-t. Megmaradnék fapados plaintext mellett, csak ha ezekután azt mondom a PC-snek, hogy bocsi írd át a hálózati kommunikációdat UDP-re, valószínűleg kilátásba helyezi a fenékenbillentést mint technológiát.

Ja igen a hardware meg van, csak a procit cseréltem 2 UART-osra, a modul meg a többi régi tehát boldog lennék ha ezekkel megoldható lenne és nem kéne elölről kezdenem RTL-kel.

Higgins! Tudnál erről esetleg vmi közelebbit? "version 3-as TWI sampleben..."

Köszi mindenkinek a segítségért!
poeri
Avatar
Higgins
Tranzisztorgyógyász
Hozzászólások: 169
Csatlakozott: 2006. február 23. csütörtök, 7:00

Hozzászólás Szerző: Higgins »

Hali! Ezen http://www.mcselec.com/index.php?option ... &Itemid=54a linken letöltheted a sample fájlokat. Van benne egy easytcpip.exe segédprogi az majd hasznodra lesz. Valóban Tyutyu ebben a témában a jártasabb, mivel ő már 2003 óta foglalkozik ilyennel ha jól rémlik.

Szerény személyem is csak tapogatózik a wiznet modullal kapcsolatban, hülyeséget meg nem akarok mondani. Látom te nem a gyári példakódból indultál ki, hanem egészen más logika alapján építetted fel a programodat.

Én ragaszkodtam az eredeti példakódhoz és arra építettem fel a saját programomat. Tyutyu abban segített, hogy hol szabad meghívni bizonyos rutinokat. Remélem ő tud neked segíteni.

Kicsit elkanyarodva a témától...érdemes ezzel a modullal foglalkozni mivel a BASCOM is támogatja, de sajnos sok a szívás, kínlódás vele. Az MCSELEC oldalon is csak tapogatóznak a wiznettel kapcsoltban, de konkrét megoldást nem igen láttam. Lehet a legközelebbi avr.tavir.hu programozói versenyen beküldök egy ilyne modulra írt programot, ami pl már MMC kártyával működne :lol: ,ötletem nekem is van rengeteg, csak eléggé letöri az ember lelkesedését néha ez a fránya modul.

Üdv: Higgins
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

+viágosodtam, valaki felkapcsolta a lámpát! :D

A hiba a következőkben van (az UDP/HTML azért jött elő, mert a kommunikáció mikéntjéről nem volt infó. És tapogatództam egy kicsit a sötétben...):
- A soros küldés/fogadás IRQ-t használ, a Wiznet szintén. Az AVR meg csak 1 szintű IRQ-t ismer, azaz egy rutin nem szakítható meg egy másik kedvéért.
- A buffered valószínű kicsi, ami a soros küldést/fogadást csinálja (config serialin.... ill config serialout...)
- a sorosport esetén nagy sebeséget használsz, és nem bírja feldolgozni az AVR, míga 16 byte (?) UART adóvevő alapbuffere betelik.


Az RTL chipet azért írtam, mert hátha abból kiindulva valami ötlet ellopható. Itt is a vétel/adás INT rutinban zajlik, ami eléggé megfogja a procit. Nálam ami probléma volt:
- A ping utasítással tesztelve, mert ott késleltetési időket lehet látni. Ha a sorosporton 9600 bps-l kommunikáltam (GetSocket, INT jött és egyéb debug üzeletekkel), akkor a válaszidő ARP kérésnél (névfeloldás, címkeresés)~230 msec, míg a pingra válasz ~130-140 msec is volt.
Amint a sorsoport begyorsítva vagy inkább kivéve, ez leesett (kivett eset) ~55-60msec illetve 30 msec köré.

Lehet, hogy nálad a soros kommunikáció fog ennyit rajta.
A bufferelt mód valamennyit javított rajta, legalább adatvesztésem nem volt (a szabad SRAM felét vételire, a felét adásira rakd át).
A sorosport INT alapon is kezelhető, nem kell hozzá a GetKey, Inkey és egyéb függvények. Illetve a vevőpufferben van e valami azt a következő trükkel nézheted meg (időkritikusan)
Ez egy timeoutos dolog, de a timeout részt kihagyod, akkor az IF utasítás lassúságát kivéded.

Kód: Egész kijelölése

.
.
.
.
dim hulp3 as word
dim hulp1 as word
Test:
Incr Hulp3
If Hulp3 = 65000 Then
   Incr Hulp1
   Hulp3 = 0
End If
If Hulp1 = 25 Then
   Goto Noresponse
End If
sbis USR,7
rjmp test

Vettkaraktert:
.
.
.
.
.
.


Noresponse:
.
.
.
.
.




S ami nem világos még:
- sorosporton bináris vagy karakteres adatok mennek? Nem mindegy, ugyanis az elétérés a 0 kódú karakternél van. Ez szövegvége karaktert jelent, ha szövegesen kezeled a bejövő/kimenő adatokat.



Amúgy ami még trükk lehet:
Nálam a RTL modul esetén ~1-2 MHz körül a feldolgozási sebesség nagy timeoutokat (szakadás stb) okozott. A kvarcból érdemes a sorosporti kvarcszabályt betartva (7,3728 ; 14,7456; 11,056 MHz) alkalmazni. Ez is oko(hat) adatvesztést uP-uP kommunikáció során.[/code]
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Higgins:

Amint az RTL alaú rendszer feléled élesben, onnantóól át lesz írva TWI modulra is. Addigra meg jócsomó tapasztalat összegyűlik, így nem kell ennyi buktatón átesni, amiket viszont mindenképp összeírogatok majd a könyvben. Ne szívjon mindenki a modullal annyit, mint a pionyírok....

Azért nálad is csak-csak kialakul a dolog, dolgozat is készül... Aztén a tanárok is csodálkoznak majd... Te meg állást találsz ez alapján, mert megtalál vmi nagy cég, hogy "Jé, egy olyan aki érti is azt amit csinál, és nekünk pont egy ilyen ember kell!". láttam ilyenre példát már...
Avatar
Higgins
Tranzisztorgyógyász
Hozzászólások: 169
Csatlakozott: 2006. február 23. csütörtök, 7:00

Hozzászólás Szerző: Higgins »

Tyutyu állítólag ilyesmivel foglalkozik, nekem nem hiszem, hogy összejönne ilyen állás. :( Köszönöm a biztatást Róbert. Rendes vagy. :oops: /Talán én vagyok túl elkeseredett mostanában... :( /

Ma megcsináltam az IP cím, MASK, gateway átírását lehetővé tevő részt, és weblapon keresztül át lehet írni, természetesen a modult újra kell indítani. Ezzel a résszel hál istennek annyit nem szívtam, sokat segített az mcselec fórum. Lassan minden rész meglesz, és a végén össze kell gyúrni, remélem azzal se lesz gond. Holnap jön a LOG rész, amit eddig pihentettem, remélem ezt is sikerül meghegesztenem, és nem 4-szer ír be egy eseményt hanem csak egyszer. :oops: Ha ez is megvan akkor jöhet az SMS küldés. :wink:

Remélem ez a több soros port wiznet modul társítás összejön ebben a topicban. Egyébként nekem sem volt teljesen tiszta mi merre meddig, de jó hogy te megvilgosodtál. Most már én sem vagyok sötétben. :P

Üdv: Higgins
Válasz küldése