Soros port (rs232)

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

Soros port (rs232)

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

Nem akkarom tovább OFF-olni az I2C -s témát, így inkább itt folytnám a csevejt.

Szóval, a problémám a következő: megy az adatátvitel rs232-n de valamit nem értek. Nem tudok átküldeni nullát. (ha én vagyok a hülye , nem ér nagyon kiröhögni, csak kicsit) :)

Az van, hogy ha változót küldök át akkor nem az értéket küldi át, hanem a számjegyek karakterkódját. Márpedig én csak változók tartalmát akarom átküldeni. Ami ugye lehet nulla is.
De ha átkonvertálom a változót karakterré akkor ha a változó nulla akkor ugyibár nem lesz semmilyen karakter, mert olyan nincs aminek a karakterkódja nulla.

A küldést a Print utasítással csinálom. Nem azzal kéne ugye? Ráadásként az még a végéhez hozzácsap egy "soremelés+kocsivissza" jelet.

Ötelt , tipp , javaslat? :?:
Robert-

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

Nullat a fogadasnal rontod el...
Szamjegy kuldese: Printbin kod;


Printbin: Binaisan kuldi
; : ne legyen soremeles kocsivissza

0 karakter fogadasa:
Ischarwaiting=1 es az input="" eseten ez all fenn....

Getchar illetve az inkey$ helpreszen van erre megoldas mintaban (Bascom 1.11.7.7 verzio)
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

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

Aham.

Ha jól tudom az Inkey utasítás megáll és vár.
Nekem azt kellene megoldanom, hogy egy adott hosszúságú adatfolyamot kell beolvasnom (ami mindig ugyan olyan hosszú), és eközben a program futása nem állhat meg egy pillanatra se.
Most a: "Config Serialin = Buffered , Size = 19" megoldást használom.
És a prog. csak akkor használja fel az értékeket, ha szükség van rá.
A következőképp:

If _rs_head_ptr0 <> 1 Then
If _rs232inbuf0(1) = 254 Then 'szinkron byte
If _rs232inbuf0(2) = 245 Then 'szinkron byte
If _rs232inbuf0(3) = 245 Then 'szinkron byte
If _rs232inbuf0(4) = 254 Then 'szinkron byte
For I = 1 To 13
J = I + 4 '4 szinkron byte van
Sorosadat(i) = _rs232inbuf0(j) 'hasznos adatok
Next
End If
End If
End If
End If
_rs_head_ptr0 = 0
End If

Ezzel a megoldással is lehet nullát fogadni?
Vagy másképp csináljam?

Más:
Ha egy poci adatot küld, és közben bejövö adat is érkezik, akkor nem lép fel adatvesztés a fogadott adatcsomagban?

Vagy inkább csináljam "kérdezz-felelek" módon?

:roll:
Robert-

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

A program elso korben jonak tunik.
DE: a belso buffere az UARTnak kicsi. Ha megoldhato en a kerdezz-feleleket jatszanam el. Azzal biztosabb a kapcsolat.


Az UART 3 megszakitassal rendelkezik, ha nagyon kritikus azt is hasznald fel.
Az inbuf a 0-t is figyelembe veszi.
A 0-t azert nem dolgozza fel, mert a 0 az a karakterlanc vege karaktert jelenti. Azaz ha stringkent hasznalod az a ASC(0) karaktert nem tartalmazhat!

Printbin/inputbin páros nem használható esetleg?



Nezd meg a sugo ischarwaiting reszet:
"While the Inkey() will get the character from the HW UART when there is a character in the buffer, it will return a zero when the character is zero. This makes it unusable to work with binary data that might contain the value 0.
With IsCharWaiting() you can first check for the presence of a character and when the function returns 1, you can retrieve the character with Inkey or Waitkey."


Azaz:
1, levizsgalod van -e valami a bufferben.
ha van akkor inkey$-l beolvasod. Ennek veszed a bin ártákát, de ha inke$=0, akkor a bin értéke is 0!

Ha nincs semmi a bufferban akkor tovabblepsz....


Nos?
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

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

Igen , néztem a ISCHARWAITING() -et.
Hümm , hümm. Lehet hogy jó lenne.

Most kínomban mindenféle trükkel viszek át nullát. Működik, csak a hányinger kerülget tőle. :x


Vagy esetleg csináljam saját megszakban?
On Urxc Sorosbe 'Ha soros porton adat van, SOROSBE-re ugrik
Enable Urxc

Sorosbe:
Temp = Ischarwaiting()
If Temp = 1 then
Adat = Inkey()
End If
stb..stb...
Return

vagy, így:

Sorosbe:
Adat = Inkey()
Return

Arra gondolok, hogy ha bemegy a megszakba, akkor már tuti van a bufferben adat, semmi értelme megvizsgálni, hogy tényleg van e.

Nemtudom törlődik-e a megszak jelzés, ha én nem törlöm, fedolgozás után. Kell vajon törölnöm?

Az UART megszakjait épp most vizslatom a MEGA32 doksiában.
:)

Most, nem tudom, kipróbálni, ezeket, mert melóhelyen vagyok. Majd este! :wink:
A hozzászólást 1 alkalommal szerkesztették, utoljára Atesz 2006. április 5. szerda, 7:56-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Törlődik.


if ischarwaiting=1 then
adatjott=1
a$=inkey$
if len a$<>0 then
ertek=asc(a$)
else
ertek=0
endif
endif

if adatjott=1 then ->program mert a bejott adattal valamit tenni kell
endif



Nos, hogy tetszik?


De ahogy en hasznalom:
kikuldott adat HEXként megy ki. Így a számjegyek is karakterré alakulnak:))
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

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

Nem rossz.
Megpróbáltam átírni a progit hogy a ischarwaiting -et használja, de azzal az a bajom, hogy figyelni kell, hogy hol kezdődik az adatcsomag eleje. és nem nagyon sikerült megcsinálnom. Igaz már alig láttam ki a fejemből. :)

Az este kísérleteztem. Úgynézki megvan a megoldás.
Egy irányba frankón működik, két irányba még van valami kis bug. (két proci között)

Az adó:
Dim Sa(17) As Byte
....
Printbin Sa(1) ; 17
....

A vevő:
Config Serialin = Buffered , Size = 17
Maradt ugyan az amit múltkor írtam.

Így átmennek a nullák is. És nem kell trükközni.

Az miért jó ha " a számjegyek is karakterré alakulnak" ?
Robert-

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

Szamjegybol karakter:

A 0 mint ertek a &H0000 erteket jelenti Wordben:) es igy a kimenio karakterlanc a "0000" lesz. Azaz nem kell a Bin(0)-val szorakozni:)
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

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

Tényleg! Ha egy Word változót akarok átküldeni , az átmegy simán? Mert én szétszedem a következő képp:

Izebize=12345 'átküldendő Word változó

Temp = Izebize And 255
Sa(12) = Temp 'Alsó byte

Wtemp = Izebize
Shift Wtemp , Right , 8
Sa(13) = Wtemp 'Felső byte
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

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

Megcsináltam a "kérdezz-felelek" megoldást. Ezzel kiküszöböltem hogy a procinak egyszerre kelljen adnia és vennie. No és persze most feleslegesen nem küldözget egyik proci se csomagokat.

Nem teszteltem hosszasan, de most stabilnak tűnik a kommunikáció.
100000 BAUD-al :D :D
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

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

Üdv!

Segítsetek mert lassan már lemegyek hídba :D

Szimulátorban fut a következő program:
http://www.tanyalap.hu/Moslekos/dogman/ ... i_read.bas

$regfile = "Attiny2313.dat"
$baud = 19200
$crystal = 4000000

Dim B As Byte
Dim Na As String * 10

Waitms 100

Config Serialin = Buffered , Size = 10

Enable Interrupts

Print "AT"
'Print "ATD>ME1;" 'tárcsázd a telefonmemória első számát

Goto Ver1

end

Ver1:
'/////////////////////
' verzió 1
'/////////////////////
Do
While _rs_head_ptr0 <> _rs_tail_ptr0
Print "adatvan"

Wend
'Wait 1
Loop



Ver2:

'/////////////////////
' verzió 2
'/////////////////////
Do
If Ischarwaiting() = 1 Then
Print "na: " ; Na
End If
Wait 1
Loop

End


Küld com1-en egy mobilnak AT parancsot amire annak egy választ kellene visszaadnia.
Valami miatt azonban a válasz nem jön be.
Egy max232-vel van bekötve kifele és befele is minden oké, rengeteg progival, híperterminállal, mobil saját progijával kipróbáltam, még visual basicben is írtam egy komm progit, frankón mennek/jönnek a parancsok.
De a szimulátorból csak a telefon felé van kommunikáció... :(
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Hülye kérdés: Mobilnál 19200 a sebesség?

Átírom:

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

'
$sim '<=Futtatáskor (élesbe fordítva) ez igaz nincs benne?

$regfile = "Attiny2313.dat"
$baud = 19200
$crystal = 4000000

Dim B As Byte
Dim Na As String * 10

Waitms 100

Config Serialin = Buffered , Size = 10

Enable Interrupts

Print "AT"
'Print "ATD>ME1;"        'tárcsázd a telefonmemória első számát
 '<=Az AT-ra OK-l válaszol a telefon? Illetve jön-e vissza valami?

'(
Do
  While _rs_head_ptr0 <> _rs_tail_ptr0
     Print "adatvan"

  Wend
  'Wait 1
Loop
')
'ezt kivagjuk kell a francnak:)


Do
   If Ischarwaiting() = 1 Then
      Na= Waitkey()     '<=Ez a sorod hianyzik, nem olvas be adatot!!!!!
      Print "na: " ; Na;"    ";asc(Na)
   End If
   Wait 1
Loop

End
Tippek:
http://www.bipom.com/appnotes/bascom8051/an0031.shtm
http://www.bipom.com/notes8051.shtm
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

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

Robert írta:Hülye kérdés: Mobilnál 19200 a sebesség?
A telefont bármilyen más AT-s kommunikációs programmal simán lehet írni-olvasni, szal a max ármaköröm csatakozók, kábel tuti jó.
A sebesség 19200 gyárilag fix.

Most továbbléptem hibakeresésből:
elindítom az emulátort(F2) bepipálom az exit gomb mellett a Terminal pipát (így az igéret szerint a setupban beállított soros porton kommunikál) elindítom a progit amiben most ez a parancs van ki irányba:

Print "AT+CMGL=4"

Ez a parancs lekéri a telefon 4-es memójából az sms-eket, van benne vagy 40 szal itt már kéne jönni adatnak.
parancs kimegy a terminal emulator windowba, de befele látszólag semmi.
Ekkor elindítom a programszerkesztő ablakban fent a terminal emulatort, ott meg csak úgy szakad befele a sok adat :D
persze ilyenkor a szimulátorban kikapcsolódik a terminal pipa, szal gondolom vagy ez vagy az megy.
Úgy vettem észre hogy a szimulátor kifele valóban használja a com1-emet, de befele csak billentyűzetről fogad el adatot.
Frankón műxik a megszakítás, be is olvassa a karaktert és kiírja, de nem ami a com1-en jön be hanem amit a bill.-en beütök...
Váááááá, nemértem, lehet hogy bugos a bascom progi?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

A szimulátor nem erre való. Legalábbis a hardveres!
Ekkor a basmon progi van a kontrollerben, és a PCről állítgatod a memória/regisztertartalmakat. gyakorlatilag a SW futást lelassítod. _így nem lehet_ kommunikálni kifele, mert ugye a kommunikáció időfüggő! A basmon-ra keress a helpjében ott leírja...


Szóval az nem igazán az mint amire vágysz....


A mintaprogimmal mit csinál?

Esetleg a ki/bemenő soros buffer méretét szépen feljebbrakni 64-64 bytera!
Igaz a kvarcod és a soros sebességed nincs ellentmondásban, és/vagy nem a belső RC-t használod órajelforrásnak?

Options->compiler->Communication....
A sorosport miatt 19200 esetén a kvarc pl a következő lehet:
4MHz : 0,16% hiba.
11059200 MHz: OK
7372800 MHz: OK
14745600 MHz: OK

Az a 4 MHz kuka.....
Szerintem ezen (is) hasalsz el....
Avatar
DOGMAN
Chipgyilok
Hozzászólások: 293
Csatlakozott: 2006. augusztus 27. vasárnap, 6:00

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

11059200 Hz -re már délután átírtam :)

Valószínüleg az a hiba amit mondtál, hogy a szimulátoros időzítés nem tudja beolvasni a hardveres PC soros portot.
De akkor csak úgy tesztelhetek egy progit ami bekér adatot rx-en, hogy felprogramozom, és megnézem mit csinál?
Huhh így nehezebb lesz mint szimulátorban, de megoldom mert lcd rulez:)

Na mind1 mostmár megrendelem a demopanelt, és kipróbálom hardveresen...
megyek a webshopba jól...
A hozzászólást 1 alkalommal szerkesztették, utoljára DOGMAN 2006. szeptember 7. csütörtök, 20:56-kor.
Válasz küldése