Sarjaliikenne Ongelma

Vuonna 2023 tein uutta Raspberry Pi Pico prosessorilla toimivaa vesimittaria eräälle kaverilleni.
Siinä piti vesimittarin lisäksi olla kaksi lämpötila-anturia, muutama nappi, Ledi ja sarjaliikenne, jonne vesimittarin data meni.
Tietysti myös Bluetooth-moduli, jos sarjallikenne osoittautuisi liian hankalaksi.
Lisäksi siinä piti olla ulkoinen 5V teholähdeliitäntä 2.5mm ympärysmitalla, koska mittari oli eteisen lattian alla ja sinne ei voinut laittaa tietokonetta.

PICO2.jpg

Tein piirikaavion ja sitten piirilevyn ja sitten 10 kappaletta piirilevyjä.
Levyt tulivat normaalisti ja sitten laitoin osia paikoilleen.

Uusijalka.jpg

PICO PI ei ollutkaan DIP40 kokoinen vaan aivan oman levyisenä, 5*0.1 tuumaa.
Jouduin laittamaan sen Raspberry Pi Pico:n alle uuden kannan, jonka jouduin kääntämään sisäpuolelle.
Tein sen irtonaisesta piikirimasta.

piikkirima.jpg

Sitten kokeilin tehdä ohjelmaa.
Se onnistui kohtuullisesti. Tein ensin lämpötila-anturin luvun siten, että sain molemmat anturit luettua peräkkäin.
Joiduin aivan vähän kalibroimaan niitä lämpötiloja.
Kokeilin lediä ja painonappeja. Ne toimivat normaalisti.

Sitten kokeilin sarjaliikennettä.
Se antoi datan ihan oikeasti dataa PC:lle, mutta kun PC:ltä tuli data, sen pituus oli ihan oikea 5 merkkiä,
mutta merkit olivat kummia.
Niissä näkyi kuitenkin, että merkit olivat samalla tavalla ihmeellisiä.

ongrlma.jpg

Tutkin oskilloskoopilla ongelmaa.
Data tuli sarjaliikenneliittimeltä ihan normaalisti, mutta sitten siinä oli RS232/TTL muunnin, niin sepä ei kääntänytkään dataa, niinkuin piti.

No, minä mittasin yleismittarilla transistorin, mutta se näytti ihan normaalilta eli emitteriltä kannalle oli diodi ja kollektorilta kannalle toinen diodi.
Ihmettelin asiaa, mutta sitten ajattelin vaihtaa transistorin ja niin teinkin, mutta…

Täsmälleen sama asia, PC:tä tuleva sarjaliikenne toimi normaalisti, mutta käänsi tulevat merkit ihmeelliseksi nÖÖ╢Vå
Olin mitannut uuden transistorin etukäteen. Se näytti ihan normaalilta.

ongrlma1.jpg

Siinä olisi pitänyt lukea #TT02. Nuo kaksi TT olivat tuossa datassa, mutta väärin koodattuna.
Tutkin lisää tuota transistoria.

ongelma2.jpg

Kun data tulee RS232 liittimeltä, niin se tulee noin 10V tasolla, sen pitää invertoida ja muuttaa data 3.3V tasolle, koska transistorin kollektorilla on vastus 3.3V.
Pico Pi toimii 3.3 voltilla.
Nyt kuitenkin data tulee 10V:lla transistorin kannalle ja lähtee 10V saman suuntaisena PICO:lle.
Mikä ongelma?

Nyt hoksasin ongelman.
Piirilevyssä oli pieni virhe,
SOT-23 koteloinen transistori oli kääntynyt piirilevyä tehdessä 180 astetta ja silloin transistorin kanta ja emitteri olivat vaihtaneet paikkaa!
Nyt kun olin vaihtanut pienen transistorin 180 astetta, sarjaliikenne toimi normaalisti!

SOT-23.jpg
Tuo transistori SOT-23 on niin pieni ja sen molemmat puolet ovat aivan samanlaisia ja niissä ei ole mitään eroa, onko pieni, alle 1 mm mittainen uloke, Emitteri vai Kanta.

Kun olin tehnyt NTC:lle uuden ohjelman, niin en voinut tallettaa sitä PC:lle.
Pico Mite ohjelma sanoi, että ei ole tarpeeksi muistia.
Ihmettelin sitä ja katsoin Memory-komennolla muistini määrää.
Se oli melkein 100%.
Luin ohjelma kasikirjaa puoli päivää, mutta en päässyt ongelmasta perille.
Poistin ohjelman ja tein sen uudestaan, mutta sama tulos?

No, kysyin ongelmaani apua https://www.thebackshed.com/ keskustelupalstalta.

Jakoin kokelua ja datalehden lukemista ja kokeilin kaikkia mahdollisia käskyjä.
No.. lopuksi kun kokeilin Option Reset käskyä, niin ohjelman talletus onnistui.
Siis ensin XMODEM SEND ja sitten TeraTerm ohjelman valikosta File/Transfer/Xmodem/Receive ja valitsin ohjelman paikan PC:ltä ja homma onnistui,

Mikä oli syy?
Siihen en saanut vastausta.

Siitten piti tehdä keskeytysohjelma vesilaskurille.
Sen piti laskea pulsseja. joita tulee vsimittarin pyörivästä hammasrattaasta.
Siihen kohdisteaan Laser valo.

Laser.jpg

Pulssi ilmaistaan valotransistorilla.
Niitä pulsseja tulee satunnaisesti koska tahansa eli siinä tarvitaan keskeytystä.

En ollut koskaan tehnyt tälle prosessorille keskeytystä ja luin käsikirjaa.
Hain Interruptia ja löysin noin 16 keskeytysken luettelon, mutta en yhtään ohjetta kuinka keskeytys tehdään.
Pitkän ajan kuluttua löysin yhden pienen maininnan, siinä puhuttiin IO portin lukemisesta ja käskyyn voi antaa parametreja INTL, INTH, INTB.
Lisäksi vielä jonkun nimen.
Olisiko tämä oikea käsky?

Kun kokelin
SetPIN GP3, DIN
Set PIN GP3 INTL INTCOUNTER
Cont:
goto Cont

Sub INTCOUNTER
Count = Count +1
Print "Count" Count
End Sub

Niin keskeytys toimi!
Hmm miksi ei mainittu yhtään sanaa monimutkaisesta keskeytysohjelmasta?

Löysin vielä toisenkin laskenta jutun.
Käyttämällä nastoja PIN6,PIN6.PIN8 tai PIN9 voi tehdä automaattisen laskentaohjelma

Setpin GP7, FIN,1000 ' mittaa pulsseja 1 sekunnin aja ja sitten nollaa ne

alku:
print PIN(GP7) ' tähän nastaan kun tulee pulssi (1), niin se lasketaan yhteen
pin (7) =0
Pause 1000
goto alku

Pekka

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License