RS232 két mikrokontroller között

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

Re: RS232 két mikrokontroller között

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

Szervusztok!
Kérdez-feleleket játszom most itt a fórumon, mint látom.
Ismét elakadtam egy picikét. Adatküldés és fogadás egész szépen megy RS-232-n két AVR között, de most magasabb szintre lépnék.
Több változó értékét szeretném kiküldeni UART-on a másik proci felé, ami fogadja is (terminálból figyelve). A gond ott adódik, hogy ha kiíratom LCD-re, akkor egy üres karakterrel kezdi.
A küldő kód (részlet)

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

Id(1) = &H28                                                
Id(2) = &HD0                                              
Id(3) = &HB0
Id(4) = &HBF
Id(5) = &H02
Id(6) = &H00
Id(7) = &H00
Id(8) = &HD1

Do
Call Szenzorlekerdezes
      For A = 1 To 8
         Print Hex(id(a)) ;
     Next A

      Print Temp
      Locate 1 , 1 : Lcd Temp
      Waitms 500

Loop
A fogadó rész kódja (részlet)

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

'LCD iniciálása

Dim Kar As String * 21
Dim A As String * 16
Dim B As String * 2
Dim C As Byte
Do

Input Kar
A = Mid(kar , 1 , 17)
B = Mid(kar , 18 , 2)
C = Val(b)

Home : Lcd A : Lcd "  "
Locate 2 , 1 : Lcd C

Waitms 500

Loop
End
Ez csak amolyan tesztelő program, hogy mit is lehet kihozni belőle.
Probléma: Ha másodszor, vagy többször fut le a do-loop ciklus, akkor az LCD-n a 2.helyről kezdi ki a kiírást, hiába adtam meg, hogy "Home" pozíciótól kezdje.

Mi lehet a gond? Orvoslása esetleg?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: RS232 két mikrokontroller között

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

Az '"LCD A" az egy 0..15 közti szám! Ha jól futtatom fejben...
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

Re: RS232 két mikrokontroller között

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

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

Dim Kar As String * 21
20 karakter + ENTER-t tárolunk le a "kar" változóba

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

Input Kar
Várom Inputtal az adatokat, meg is érkezik.

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

A = Mid(kar , 1 , 17)
Az "A" értéke felveszi a "kar" változó első 17 elemét

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

Home : Lcd A : Lcd "  "
Elvileg az LCD első sorának első karakterétől kellene kiírni a számot (Az LCD 2x20 karakteres, el kell férnie raja).

Az előző hozzászólásomban futó Do...Loop ciklus fut, de ha másodszor fut le, akkor az "A" értéke a második helyről íródik ki, előtte "üres" karakter van. Ezt onnan sejtem, hogy nem volt közben "CLS" utasítás. Nem LCD pozicionálással van a gond, hanem valami szemét lehet az "A" változó elején".

1. futás: "1234567890123456" van az LCD-n
2. futás: " 123456789012345" van az LCD-n
Avatar
aaszabo
Tranzisztorgyógyász
Hozzászólások: 179
Csatlakozott: 2012. január 22. vasárnap, 7:00

Re: RS232 két mikrokontroller között

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

Sziasztok!

Nem megy ez a PRINTBIN és INPUTBIN páros. A bascom help szerint ez csak SW csatornán megy. Vajon miért?
Továbbra is a kérdés, ha valaki tudja a választ: Hogyan lehet bináris adatot soros porton (HW) küldeni és fogadni?
Konkrétan egy 50 byte hosszú tömböt szeretnék átküldeni.
A PRINT karakteres és a nullák miatt nem jó. Helyette mivel lehet küldeni és mivel olvasni?

Köszi előre is!
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

Re: RS232 két mikrokontroller között

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

Szintén azon kísérletezek most énis! :D
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: RS232 két mikrokontroller között

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

HEX-ként küldöd...
HEXként fogadod.

Vagy 0:
isharwaitting>0 és olvasol stringet/karaktert. Ha üres, akkor 0-t olvastál:)
Avatar
aaszabo
Tranzisztorgyógyász
Hozzászólások: 179
Csatlakozott: 2012. január 22. vasárnap, 7:00

Re: RS232 két mikrokontroller között

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

A PRINTBIN segítségével küldött csomagra nem reagál a ischarwaiting().
Pedig próbáltam, hogy OPEN-nel megnyitom elötte a HW csatornát binary módra. Az sem segített.
Nekem a help alapján nem egyértelmű, hogy a PRINTBIN, INPUTBIN csak SW UART-on jó. Lehet HW-n is használni?

A HEX-ként küldöm az mit jelent? Van Bascom-ban INPUTHEX, de PRINTHEX-et nem találtam.

A HELP-ben találtam egy részt amit a loader-ről ír a szerző. Ebben azt írta, hogy a loadert ő GET-vel csinálta, hogy binárisan tudja kezelni a portot. Megnézem majd ezt is, hogy használható-e.
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

Re: RS232 két mikrokontroller között

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

aaszabo!

A BASCOM-ban tényleg nincs olyan, hogy "Prinhex A", viszont olyan van, hogy "Print Hex(a)".

Ahogy én kikísérleteztem!
Slave oldalról vagy PRINT X, vagy PRINT HEX(X)-el egyben küldöm át az adatokat. Ebben segít a pontosvessző ";".
Master oldalról INPUT utasítással veszem a küldött adatokat, ami ugyebár tartalmazza a string végén a CHR(10) karakter.
MID utasítással "kimásolom" egy másik string változóba a számomra szükséges változókat, majd VAL, vagy HEXVAL utasítással átalakítom.
Amire ügyelni kell, hogy ha 10 karaktert küldesz ki egyben, azt egy 11 byte-nyi adatként kell fogadni minimum a CHR(10) miatt.
Avatar
aaszabo
Tranzisztorgyógyász
Hozzászólások: 179
Csatlakozott: 2012. január 22. vasárnap, 7:00

Re: RS232 két mikrokontroller között

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

A PRINT utasítással stringet küld. Én adatot (BINARY) szeretnék küldeni. Mondjuk egy 50 byte-os tömböt. Ebben van byte, ami nulla értékű. Ezt String-ben nem tudom küldeni, mert a nulla a String lezáró kód. Arra pedig nem pazarolnék helyet, hogy 2 byte-os számot, pl 24034-et 5 byte-on küldjem. Karakterenként 1 byte. Ennek a formának a feldolgozása fogadó oldalon sokkal macerásabb. Az átküldendő tömb felépítése fix mezős, ezért könnyen fel tudom dolgozni.

Ha van eredményem a PUT/GET párosról, jelentkezem.
Avatar
aaszabo
Tranzisztorgyógyász
Hozzászólások: 179
Csatlakozott: 2012. január 22. vasárnap, 7:00

Re: RS232 két mikrokontroller között

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

Működik!
Egyelőre 1 byte, de ezen a nyomon már el tudok indulni. Közben arra jöttem rá, hogy úgy is byte-onként kell beolvassam a tömböt, mert másként nem tudom kezelni azt az esetet, ha egy tömb küldés közepén éled fel az olvasó AVR.

Az alábbi program részlet nem teljes. Csak a küldést és feldolgozást mutatja. Viszont bizonyítja, hogy a nulla is átmegy.
A lényeg, hogy a HW UART-ot is csatornaként meg kell nyitni bináris adatforgalomhoz. A GET és PUT is kér egy csatorna azonosítót.
A két kódrészlet azt csinálj, hogy a küldő által küldött számot a fogadó olvassa és a LED-et eggyel többször villantja fel, mint amekkora számot kapott. Illetve a küldő is eggyel többször villantja fel a LED-et, mint amekkora számot küld. Ez ciklusban mindig 0-3-ig fut.

Írás

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

Open "com1:" For Binary As #1
Do
   For Cnt = 0 To 3
      Put #1 , Cnt
      B=Cnt+1
      Call Blink_led(b)
      Wait 3
   Next
Loop

Olvasás

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

Open "com1:" For Binary As #1
Do
   Waitms 500
   A = Ischarwaiting()
   If A = 1 Then
      Get #1 , B   
      B=B+1
      Call Blink_led(b)
      Wait 1
   End If
Loop
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Re: RS232 két mikrokontroller között

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

Így jár, aki régen nem nyúlta témához. Elküldök egy stringet, várnék vissza egy LONGot. Az üzenet meg is érkezik, de az INPUT csak áll...áll...:
Már minden vackot belevéstem, eredmény semmi.

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

$regfile = "m328pdef.dat"
$crystal = 22180000
$baud = 9600
Config Serialin=Buffered, Size=10
Open "Com1:" For Binary As #1
Config Portd.0=INPUT
Config Portd.1=OUTPUT
Config Portd.7=OUTPUT   'LED
Led Alias Portd.7

Dim Soros_string As String*20
Dim Bejovo As Long

Do
    Soros_string="adatkérés"+Chr(255)
    Print Soros_string;
    Input Bejovo
    Toggle Led
    Waitms 10
Loop

End
Ugyan mit rontok el, Config, Open nélkül sem megy a vétel...persze megírhatom bytonként megszakítással, de akkor minek az INPUT parancs?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: RS232 két mikrokontroller között

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

Az input ENTER-t vár a végén. Vagy futtathatod timeoutra is.
http://www.tavir.hu - a gazda :)
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Re: RS232 két mikrokontroller között

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

Aztaleborultmindenségitneki!!!!
Na, ez a figyelmetlenség meg a vénség...Hopp, akkor hogy eszi meg mondjuk a bináris LONG-ot, abban, mint adat, előfordulhat 10/13H. Vagy ez az INPUT csak ASCII-terminál vackolásra jó?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: RS232 két mikrokontroller között

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

Küldd számként, majd stringből érték.
Vagy inputbin (?).
http://www.tavir.hu - a gazda :)
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Re: RS232 két mikrokontroller között

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

A választ célHW küldi, abba sajnos nem tudok belenyúlni, bár van opciója ASCII formátumra, csak az van vagy 15byte, úgy gondoltam, minek pazaroljak...mármint felesleges időt meg kivárni a postbyte-okat...Szóval az ember okos meg egyszerű akar lenni, aztán csak be kell másolnom a byte-onkénti soros rutint. Olyan szép lett volna...Természetesen havernak/tegnapra/ingyen meló...
Köszönöm az útbaigazítást!!!
Válasz küldése