RS232 két mikrokontroller között

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Cinege446
Biztosítékgyilkos
Hozzászólások: 67
Csatlakozott: 2008. július 22. kedd, 6:00
Kapcsolat:

RS232 két mikrokontroller között

HozzászólásSzerző: Cinege446 » 2013. július 16. kedd, 12:42

Sziasztok!

Két mikrokontroller között próbálok meg számokat átvinni UART-on keresztül, de egyelőre semmi sem jött össze. Parasztban vannak csak összekötve, RX a másik IC TX lábával és fordítva. A Print és az Input utasításokkal próbálkoztam és a fogadott adatokra történő if-es feltételvizsgálattal kapcsoltam volna be egy LED-et, vagy ki. A soros kommunikációt korábban már használtam MCU és PC között, ott szépen ment, de itt nagyon meg vagyok lőve és nem tudom, hogy a mikrokontrollerek közötti efajta kommunikációnak milyen kritériumai vannak.
A két kód a következő:

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

$regfile = "m16adef.dat"
$crystal = 1000000
$baud = 1200

Echo Off

Dim A As Byte

Config Portb.2 = Input
Config Portb.3 = Input
Config Porta = Output

Set Portb.2
Set Portb.3


Do

 If Pinb.2 = 0 Then
  Print "2";
  Input A
 End If

 If Pinb.3 = 0 Then
  Print "8";
  Input A
 End If

 If A = 4 Then
  Porta = 255
 End If

 If A = 16 Then
  Porta = 0
 End If

Loop






Valamint a második:

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

$regfile = "m16adef.dat"
$crystal = 1000000
$baud = 1200

Echo Off

Dim A As Byte

Config Porta = Output

Do

 Input A
 Waitms 10
 Print A;

 If A = 2 Then
  Porta = 255
 End If

 If A = 8 Then
  Porta = 255
 End If

Loop

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9906
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

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

HozzászólásSzerző: Robert » 2013. július 16. kedd, 20:10

A hibás adatmegadás miatt:
"2" <> 2 !!!

Szám és string eltérése: chr("2") <> 2

Avatar
Cinege446
Biztosítékgyilkos
Hozzászólások: 67
Csatlakozott: 2008. július 22. kedd, 6:00
Kapcsolat:

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

HozzászólásSzerző: Cinege446 » 2013. július 17. szerda, 9:12

Szal ha jól értem, akkor minden körítés nélkül a számot megadva annak értéke kerül kiíratásra és a túloldalon az input utasítással ugyan az kerül beolvasásra és mentésre? Ezek alapján átírtam és lerövidítettem a programot, de még így sem tudom az adatokat átadni:

Adó

$regfile = "m16adef.dat"
$crystal = 1000000
$baud = 1200

Echo Off
Dim A As Byte

Do

Print 2;
Wait 1
Print 5;
Wait 1

Loop

Vevő

$regfile = "m16adef.dat"
$crystal = 1000000
$baud = 1200

Echo Off
Dim A As Byte
Config Porta = Output

Do

Input A

If A <> 5 Then
Porta = 0
End If

If A = 5 Then
Porta = 255
End If

Loop

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9906
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

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

HozzászólásSzerző: Robert » 2013. július 17. szerda, 13:35

Nem jó. Nézd meg, hogy mi megy ki:

Print szám;

A szám _humán által olvasható_ értéke.
Inputtal mit olvasol?

A szám ASCII értékét!


U.i.: A kód beszúráshoz használd a CODE gombot!

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9906
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

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

HozzászólásSzerző: Robert » 2013. július 17. szerda, 13:35

Sőt: az INPUT várja a sorvége jelet is.....
Az meg ugye nem jön....

Avatar
Cinege446
Biztosítékgyilkos
Hozzászólások: 67
Csatlakozott: 2008. július 22. kedd, 6:00
Kapcsolat:

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

HozzászólásSzerző: Cinege446 » 2013. július 17. szerda, 14:35

Jajj, a pontosvessző egy nagyon rossz beidegződésem...
Viszont, átírtam az általad említett hibák figyelembevételével a programot a következők szerint. Kiküldöm az 5-nek és a 3-nak megfelelő ASCII kódot, felhasználva a chr() parancsot.

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

$regfile = "m16adef.dat"
$crystal = 1000000
$baud = 1200

Echo Off

Do

  Print Chr(5)
  Wait 1
  Print chr(3)
  Wait 1

Loop


A túloldalon -amint írtad- a sima input utasítással beolvasom ugyanezt az ASCII kódot és erre végzek feltételvizsgálatot.

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

$regfile = "m16adef.dat"
$crystal = 1000000
$baud = 1200

Echo Off
Dim A As Byte
Config Porta = Output

Do

 Input A

 If A <> 53 Then
  Porta = 0
 End If

 If A = 53 Then
  Porta = 255
 End If

Loop

Így már helytállóbb a gondolatmenetem? Jónak biztosan nem jó, mert így sem műxik a dolog :(

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9906
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

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

HozzászólásSzerző: Robert » 2013. július 17. szerda, 17:55

A irány jó, csak mind2nél váltottál :P

print : számsort ír ki
printbin : a szám _kódja_ jelenik meg (pl 5: pikk jel)
printbin ua. mint a print chr(szám)

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

$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600

Echo Off

Do

  Print 5                                                   '5<enter>(ötös szám, ASCII: dec.53)
  Wait 1
  Print 3                                                   '3<enter>
  Wait 1

Loop


fogadó:

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

$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600

Echo Off
Dim A As Byte
Config Portb.5 = Output

Do

 Input A                                                    'debug : 5<enter>
 Print A                                                    'debug   5
 Print Chr(a)                                               'debug   ASCII 5 karakter (pikk)
 Print Asc(a)                                               'debug   5
 'A=5 jön be!


 'If A <> 53 Then
 if A<>5 then 'Ez a jó!
  Portb.5 = 0
 End If

 'If A = 53 Then
 if A=5 then 'Ez a jó!
  Portb.5 = 1
 End If

Loop


Talán így követhető volt....
M16 nem volt kéznél, de ez nem befolyásolja a sorosportot...

Avatar
Cinege446
Biztosítékgyilkos
Hozzászólások: 67
Csatlakozott: 2008. július 22. kedd, 6:00
Kapcsolat:

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

HozzászólásSzerző: Cinege446 » 2013. július 17. szerda, 18:41

Ez nekem egyre bajosabb!
Átírtam mindkét programot az általad javasoltak szerint. A feltételvizsgálatot kipróbáltam az egyezés és az eltérés esetére is, de az A portot nem kapcsolta be egyik esetben sem, vagyis olyan, mintha a feltételvizsgálatig el sem érne! Ezt követően kiegészítettem a vevő kódját egy egyszerű LED be- és kikapcsolással, de nem jut el hozzá, vagyis a LED-ek abszolút sötétek maradnak (kb mint én). Levettem egészen 300 baudra az átviteli sebességet, mondván hátha túl gyors még az 1200 is, de így sem jó. A sima vezetékes összekötéssel biztosan működőképesnek kellene lennie az átvitelnek?
Itt a vevő kódja:

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

$regfile = "m16adef.dat"
$crystal = 1000000
$baud = 300

Echo Off
Dim A As Byte
Config Porta = Output

Do

 Input A
 Print A
' Print Chr(a)
' Print Asc(a)

 If A <> 5 Then
  Porta = 255
 Else
  Porta = 0
 End If

 Porta = 255
 Waitms 200
 Porta = 0

Loop


A 'Print Chr(a) és a Print Asc(a) sorokat kivettem, mert ha jól értettem a helpet, akkor ez csak egy oda és visszaalakítás, vagyis az eredményen nem változtat semmit. Persze kipróbáltam a beillesztésükkel is. Az adó kódja maradt ugyan az, amit írtál, csak m16-ossal és 1 megás órajellel.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9906
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

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

HozzászólásSzerző: Robert » 2013. július 17. szerda, 20:02

Belső órajeled 1 MHz?
Sorosport esetén _kötelező_ a külső _kvarc_.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9906
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

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

HozzászólásSzerző: Robert » 2013. július 17. szerda, 20:03

Ezt DOBD ki:

Porta = 255
Waitms 200
Porta = 0

Avatar
Cinege446
Biztosítékgyilkos
Hozzászólások: 67
Csatlakozott: 2008. július 22. kedd, 6:00
Kapcsolat:

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

HozzászólásSzerző: Cinege446 » 2013. július 17. szerda, 20:27

Az órajel 1MHz, de külső kvarc nincs! Ehhez készítek inkább egy célirányos próbapanelt kavicsokkal. Az ucsó három sor csak a hibakeresés végett volt betéve, hogy egyáltalán az input soron túljut-e a program.
Köszi a segítségeket!

Avatar
Cinege446
Biztosítékgyilkos
Hozzászólások: 67
Csatlakozott: 2008. július 22. kedd, 6:00
Kapcsolat:

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

HozzászólásSzerző: Cinege446 » 2013. július 30. kedd, 15:08

Üdv!

Megint én és megint a kommunikáció miatt kérdeznék! Kipróbáltam a dolgot 11059200Hz-es kavicsokkal, de nem megy. Ezt követően kettéválasztottam a feladatot egy MCU=>PC és egy PC=>MCU kommunikációra. Az pöccre működött, minden stimmelt, bármilyen feltételvizsgálatot írtam rá, jól működött. Az MCU-MCU összeköttetés esetében viszont nekem még mindíg az az egyre erősebb gyanúm, hogy a vevő nem kapja meg az enter karaktert! Kipróbáltam a waitkey utasítást és azzal viszont működik az MCU-MCU kommunikáció, vagyis az adatok átkerülnek egyik IC-ből a másikba, csak maga az adatfolyam nincs lezárva, ha sima input utasítást használok. Vagy legalábbis nekem úgy tűnik.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9906
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

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

HozzászólásSzerző: Robert » 2013. július 30. kedd, 15:14

Más tipp:
A soros vételi puffered, ha épp nem a feldolgozási soron vagy, akkor 1 vagy 3 karakter. Ezt a Config serialin utasítással növelheted meg!

Print párja az input, ekkor mindkettő azonos lezárókaraktert vár és küld is.
Az input által várt változó hossza _haladja meg_ a ténylegesen venni kívánt karakterszámot!
Ha 10 karakter+ENTER kerül átküldésre, akkor a vevő oldalt 11 v. 12 karakteres változóba legyen belevéve...

Avatar
Cinege446
Biztosítékgyilkos
Hozzászólások: 67
Csatlakozott: 2008. július 22. kedd, 6:00
Kapcsolat:

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

HozzászólásSzerző: Cinege446 » 2013. július 30. kedd, 17:30

Na jó, tudom hogy ez így nagyon tróger, de megy! :)
Az egyetlen probléma jelen esetben az, hogy az egyik IC nem hajlanó a kvarc szerinti órajelen ketyegni, így csak nagyjából tudtam belőni neki egy olyan frekit, ami az első pár másodpercben még hibamentes adatátvitelt tud biztosítani. (Ez kb 9mp-et jelent, utána már nem jó). A program nagyon egyszerű, de ahanyas számot a print után beírom, annyiszor villan fel a led minden esetben.

Adó

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

$regfile = "m16adef.dat"
$crystal = 1000200
$baud = 4800

Echo Off

Do

 Print 7
 Wait 1

Loop


Vevő

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

$regfile = "m16adef.dat"
$crystal = 11059200
$baud = 4800

Echo Off
Dim A As Word
Dim D As Byte
Dim E As String * 5
Config Porta.1 = Output

Ki Alias Porta.1

Do

  Input E

  A = Val(e)

  For D = 1 To A
   Set Ki
   Waitms 500
   Reset Ki
   Waitms 500
  Next

  Wait 1

Loop

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9906
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

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

HozzászólásSzerző: Robert » 2013. július 30. kedd, 17:35

Az 1 MHz belsőt felejsd el mind2 oldalon!
Sorosport stabilan _csak_ külső kvarc/rezonátor lehet!

Belső RC:
- hőfokérzékeny,
- pontatlan,
- állandóan kalibrálandó.

Bár vannak mazochista fejlesztők....... :(
Vagy ha 10.000 tétel, én csak akkor küzdenék a 1/4$ áron (~50 Ft kvarc +2* 3 Ft kondi)


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég