Fórum témák

» Több friss téma
Fórum » Pic soros adat
 
Témaindító: csaba7575, idő: Ápr 6, 2010
Témakörök:
Lapozás: OK   1 / 2
(#) csaba7575 hozzászólása Ápr 6, 2010 /
 
Sziasztok.
Segítséget szeretnék kérni. Van egy pic16F877 ezt a pic-et Basicben szoktam programozni és az Oshonsoft környezetben. De soros portot soha nem programoztam csak Delphivel. Delphiben simán fel is tudom dolgozni az adatokat. Most viszont egyenesen a pic-re kellene írnom egy programot a lényeg, hogy soros porton bejön adat és ezt kellene feldolgoznom vissza nem, kell válaszolnom csak figyelnem a bejövő adatot és azt feldolgozni. Hiper Terminálban és Delphiben ezek a karakterek jönnek ’+000.0’ 9600 sebbeséggel . A kérdés még egyszer hangsúlyozom pic soros port programozásban nincs gyakorlatom, hogy tudom az adatokat megkapni. Egyáltalán, hogy álljak neki példaprogramokat szinte csak assemblerben találtam, de nekem Basic-es segítség kellene, mert a többi részét abban írnám meg. Segítségeteket előre is köszönöm.
(#) vilmosd válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Hali
Esetleg a PICBASIC thread?
(#) csaba7575 válasza vilmosd hozzászólására (») Ápr 6, 2010 /
 
A thread-el kitudom olvasni basicben?
(#) vilmosd válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Ha eddig nem tuttad ezutan sem tudod, de ott esetleg valaki tudna segiteni.
(#) sirály12 válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Az oshon basic-nek nagyon jó a segítsége, és is azzal használtam. Van benne demópélda is soros port kezelésre.

Az alábbi forráskódból jól látszik a sorosport kezelése. A hserout-al küldöd ki az adatokat.
A hserin-nel fogadod az adatokat.
A hseropennal nyitod meg a soros portot adott sebességgel.

  1. Define CONF_WORD = 0x3f72
  2. Define CLOCK_FREQUENCY = 12
  3. AllDigital
  4.  
  5. Define LCD_BITS = 8
  6. Define LCD_DREG = PORTD
  7. Define LCD_DBIT = 0
  8. Define LCD_RSREG = PORTE
  9. Define LCD_RSBIT = 0
  10. Define LCD_RWREG = PORTE
  11. Define LCD_RWBIT = 1
  12. Define LCD_EREG = PORTE
  13. Define LCD_EBIT = 2
  14. Define LCD_READ_BUSY_FLAG = 1
  15. Lcdinit
  16.  
  17. Dim i As Byte
  18.  
  19. Hseropen 19200
  20. WaitMs 1000
  21.  
  22. For i = 20 To 0 Step -1
  23.         Hserout "Number: ", #i, CrLf
  24.         Lcdcmdout LcdClear
  25.         Lcdout "Number: ", #i
  26.         WaitMs 1000
  27. Next i
  28.  
  29. loop:
  30.         Hserin i
  31.         Hserout "Number: ", #i, CrLf
  32.         Lcdcmdout LcdClear
  33.         Lcdout "Number: ", #i
  34. Goto loop


Ha valamit nem értesz, kérdezz!
(#) csaba7575 válasza sirály12 hozzászólására (») Ápr 6, 2010 /
 
Sirály 12.
A példa programod teljesen tökéletes most megpróbálok vele egy kicsit bűvészkedni és tanulmányozni. Próbálok innen magamtól rájönni. De, ha elakadok, akkor a segítségedet fogom venni. Segítséged köszönöm.
Remélem, ha lesz, kérdésem még számíthatok rád?
(#) sirály12 válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Bármilyen kérdésed lenne, csak nyugodtan. Ha még tudok rá válaszolni, akkor fogok is.
(#) csaba7575 válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Szóval megcsináltam a példa progidat. Az első kérdés feléd gyorsabban megy, mint gondoltam. A program megáll az „Lcdinit” –nél. Miért? Lehet, hogy kezdő kérdés?
(#) csaba7575 válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Jó, meg van gondolkoznom, kellet volna, mielőtt kérdezek.
(#) icserny válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Ha nincs LCD kijelződ, akkor az LCD-re vonatkozó sorokat ki kellene hagyni - gondolom én.
(#) sirály12 válasza csaba7575 hozzászólására (») Ápr 6, 2010 / 4
 
Elvileg nem szabadna megállnia!
Próbáld ki ezt a kódot:

  1. Define LCD_BITS = 8
  2. Define LCD_DREG = PORTD
  3. Define LCD_DBIT = 0
  4. Define LCD_RSREG = PORTE
  5. Define LCD_RSBIT = 0
  6. Define LCD_RWREG = PORTE
  7. Define LCD_RWBIT = 1
  8. Define LCD_EREG = PORTE
  9. Define LCD_EBIT = 2
  10. Define LCD_INITMS = 100
  11. Lcdinit
  12.  
  13. Dim i As Byte
  14. Hseropen 19200
  15. WaitMs 1000
  16.  
  17. For i = 20 To 0 Step -1
  18.         Hserout "Number: ", #i, CrLf
  19.         Lcdcmdout LcdClear
  20.         Lcdout "Number: ", #i
  21.         WaitMs 1000
  22. Next i
  23.  
  24. loop:
  25.         Hserin i
  26.         Hserout "Number: ", #i, CrLf
  27.         Lcdcmdout LcdClear
  28.         Lcdout "Number: ", #i
  29. Goto loop


Ha a szimulátorban nézed, akkor ott lehet, hogy sokat kell várni rá, hogy továbblépjen, mert itt van bizonyos időzítés. Ilyenkor vár, hogy az lcd biztosan beálljon.
(#) sirály12 válasza icserny hozzászólására (») Ápr 6, 2010 /
 
Igen, ez is igaz!
(#) csaba7575 válasza sirály12 hozzászólására (») Ápr 6, 2010 /
 
Megpróbálom ezt a megoldást. De mindent most itt az Oshonsoft programmal tesztelek egyelőre. Tehát van LCD.
(#) csaba7575 válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Szóval küldök egy képet, hogy néz ki az egész. Az LCD részt kivettem a programodból és beírtam gyári pl. program LCD kezelését. Avval el is jutok, teljesen kijelölt kód ig. De onnan mintha lefagyna. A terminál rész viszont megy.

Kód
Define ADC_CLOCK = 3 'default value is 3
Define ADC_SAMPLEUS = 10 'default value is 20
Define LCD_BITS = 8 'allowed values are 4 and 8 - the number of data interface lines
Define LCD_DREG = PORTB
Define LCD_DBIT = 0 '0 or 4 for 4-bit interface, ignored for 8-bit interface
Define LCD_RSREG = PORTD
Define LCD_RSBIT = 1
Define LCD_EREG = PORTD
Define LCD_EBIT = 3
Define LCD_RWREG = PORTD 'set to 0 if not used, 0 is default
Define LCD_RWBIT = 2 'set to 0 if not used, 0 is default
Define LCD_COMMANDUS = 2000 'delay after LCDCMDOUT, default value is 5000
Define LCD_DATAUS = 50 'delay after LCDOUT, default value is 100
Define LCD_INITMS = 2 'delay used by LCDINIT, default value is 100

Lcdinit 1

Dim i As Byte

Hseropen 9600

WaitMs 1



For i = 1 To 0 Step -1

Hserout "Number: ", #i, CrLf

Lcdcmdout LcdClear

Lcdout "Number: ", #i

WaitMs 1

Next i



loop:

Hserin i -----itt----

Hserout "Number: ", #i, CrLf

Lcdcmdout LcdClear

Lcdout "Number: ", #i

Goto loop
(#) sirály12 válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Természetes, hogy megáll, mert várakozik bejövő adatra. Amíg nem küldesz neki valamit, addig nem megy tovább.
Van erre egy parancs, hogy ilyenkor is továbblépjen, mindjárt megkeresem.
(#) sirály12 válasza sirály12 hozzászólására (») Ápr 6, 2010 /
 
Nem találom, pedig tudom, hogy van.
(#) csaba7575 válasza sirály12 hozzászólására (») Ápr 6, 2010 /
 
De én küldök adatott. Nem tudom, hogy amit csatoltam képet megnézted-e, ott látszik, hogy megy adat a terminálon. Ezért nem értem? Azért köszi, hogy ennyit segítesz.
(#) sirály12 válasza csaba7575 hozzászólására (») Ápr 6, 2010 /
 
Max még az átviteli sebességre tudok gondolni. A programban és a pic forrásába is egyforma érték van megadva?
(#) alap válasza sirály12 hozzászólására (») Ápr 7, 2010 /
 
Szia
Valaki csinált nekem egy digitális höméröt Pic 16f873A -val meg 4055 ic , hétszegmenses kijelzövel. A problémám a következö gondol egyet a müszer és teljesen sötét lesz . Maga a Pic kimenetein 4, 8 V mérek a 4055 szintén de a kijelzö nem ir ki semmit. HOL LEHET a HIBA tudnál e ebbe segiteni nekem?
üdv
(#) vilmosd válasza alap hozzászólására (») Ápr 7, 2010 /
 
Hali
Kapcsolasi rajz es esetleg program nelkul eleg nehez lesz
Udv Vili
(#) alap válasza vilmosd hozzászólására (») Ápr 7, 2010 /
 
Üdv!
Ha le rajzolom akkor tudnál segiteni?
(#) csaba7575 válasza sirály12 hozzászólására (») Ápr 7, 2010 /
 
Az átviteli sebbeség jó hisz az oshonsoft programban a pc serial port terminálnál is látszik, hogy van adat és ráadásul ott mutatja is a 9600 com1-et. Ma nekiállok és megcsinálom a teszt panel egy LCD és rs232 csatlakozóval. Hátha csak oshonsoft program szívat. De, ha esetleg rá jösz valamire írj. Ez eddigi segítséged is nagyon jó azért már sokkal közelebb vagyok, mint voltam.
(#) sirály12 válasza csaba7575 hozzászólására (») Ápr 7, 2010 / 4
 
Szia.

A program tökéletesen működik. Leteszteltem!
Ahogy adatot küldök neki, azonnal továbblép a Hserin i soron, és megy szépen tovább.

Ez:
  1. Define CONF_WORD = 0x3f72
  2. Define CLOCK_FREQUENCY = 12
  3. AllDigital
  4.  
  5. Define LCD_BITS = 8
  6. Define LCD_DREG = PORTD
  7. Define LCD_DBIT = 0
  8. Define LCD_RSREG = PORTE
  9. Define LCD_RSBIT = 0
  10. Define LCD_RWREG = PORTE
  11. Define LCD_RWBIT = 1
  12. Define LCD_EREG = PORTE
  13. Define LCD_EBIT = 2
  14. Define LCD_READ_BUSY_FLAG = 1
  15. Lcdinit
  16.  
  17. Dim i As Byte
  18.  
  19. Hseropen 19200
  20. 'WaitMs 1000
  21.  
  22. 'For i = 20 To 0 Step -1
  23. 'Hserout "Number: ", #i, CrLf
  24. 'Lcdcmdout LcdClear
  25. 'Lcdout "Number: ", #i
  26. 'WaitMs 1000
  27. 'Next i
  28.  
  29. loop:
  30.         Hserin i
  31.         Hserout "Number: ", #i, CrLf
  32.         Lcdcmdout LcdClear
  33.         Lcdout "Number: ", #i
  34. Goto loop



A hosszú időzítéseket és felesleges dolgokat kiszedtem, a könnyebb szimuláció miatt, ha élesben akarod használni, akkor persze kellenek!
(#) csaba7575 válasza sirály12 hozzászólására (») Ápr 7, 2010 /
 
Na, szóval leteszteltem az oshonsoft programmal és itt elindítottam a Hardver Uart Simulator interfest és ott beírtam Hex –be vagy bytba. Mindent kiírt a LCD –re. Hétvégén azért megcsinálom a teszt panelon. majd írok, ha valami nem megy. De amit rá akarok kötni hardvert és terminálon látom, az adatott azt itt nem látom ez azért érdekes? Delphiben comport komponenssel is látom az adatott, na de majd rájövök, ha nem akkor írok.
(#) csaba7575 válasza csaba7575 hozzászólására (») Ápr 7, 2010 /
 
Ja de hülye vagyok nem is köszöntem utólag is, szia.
(#) Matt válasza sirály12 hozzászólására (») Ápr 8, 2010 / 1
 
Üdv!

Ne használjátok a hserin parancsot, mert lesz olyan adat, ami nem fog megérkezni. UART megszakítást használjatok. Csak ki kell olvasni az RCREG értékét amikor megszakítás volt és már meg is van az adat. Ez a legtutibb módja annak, hogy sorosan adatot fogadjunk PIC-el. Ha jól emlékszem valahol Pixels kolléga leírta, hogy miért nem jó a folyamatos pollozás, és miért jobb az interruptos megoldás.

Remélem tudtam segíteni,

üdv,
Matt
(#) sirály12 válasza csaba7575 hozzászólására (») Ápr 9, 2010 /
 
Nincs mit!
(#) csaba7575 válasza sirály12 hozzászólására (») Ápr 9, 2010 /
 
Sziasztok. Szóval sikerült megcsinálnom teszt panelt. Rákötöttem egy laptopot, hogy adatott küldjek, minden szuper terminálban látom az szöveget bejönni. mikor leüttök, egy billentyűt akkor az megjelenik az LCD. Viszont ha rákötöm azt a külső egységet, amit működtetni akarok akkor semmi mást nem látok csak annyit, hogy’ number: 49’. A 49 az nem nulla karaktert jelent tehát, hogy semmi adat nem jön? Ja, másik ezt az Uart megszakítás, hogy kell megvalósítani?
(#) Matt válasza csaba7575 hozzászólására (») Ápr 11, 2010 /
 
Szia!

Csatoltam egy mellékletet kommentezve, amin szépen látszik, hogy kell használni a megszakítást soros adat fogadása esetén.

Ha kérdésed van, szívesen válaszolok, ha tudok.

Üdv,
Matt
(#) csaba7575 válasza Matt hozzászólására (») Ápr 11, 2010 /
 
Szia. Most értem haza és láttam, hogy írtál segítséged előre is köszönöm. Ma megnézem, és holnap megpróbálom beilleszteni a programomba, ha nem megy, szólok. Segítséged előre is köszönöm.
Következő: »»   1 / 2
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem