Sisällysluettelo:

PIC MCU ja Python -sarjaliikenne: 5 vaihetta
PIC MCU ja Python -sarjaliikenne: 5 vaihetta

Video: PIC MCU ja Python -sarjaliikenne: 5 vaihetta

Video: PIC MCU ja Python -sarjaliikenne: 5 vaihetta
Video: Моя работа наблюдать за лесом и здесь происходит что-то странное 2024, Marraskuu
Anonim
PIC MCU ja Python -sarjaliikenne
PIC MCU ja Python -sarjaliikenne
PIC MCU ja Python -sarjaliikenne
PIC MCU ja Python -sarjaliikenne

Hei kaverit! Tässä projektissa yritän selittää kokeiluni PIC MCU- ja Python -sarjaliikenteestä. Internetissä on monia opetusohjelmia ja videoita siitä, miten kommunikoida PIC MCU: n kanssa virtuaalipäätteen kautta, mikä on erittäin hyödyllistä. Pääprojektissani yksi vaatimuksista on kuitenkin luoda sarjaliikenne PIC MCU: n ja Pythonin välille, jota en löytänyt hyvää opetusohjelmaa. Joten aloitetaan:)

Vaihe 1: Mitä tarvitsemme?

Mitä me tarvitsemme?
Mitä me tarvitsemme?
Mitä me tarvitsemme?
Mitä me tarvitsemme?

Katsotaan siis ensin, mitä tarvitsemme. Laitteiston suhteen:

  • Varmasti, PIC MCU, joka on minun tapauksessani PIC16f877a (et tarvitse tätä korttia. Tämä on yksinkertaistettava joitakin likaisia yhteyksiä)
  • USB -TTL -muunnin kommunikoidakseen PIC MCU: n kanssa USB -portin kautta käyttämällä TX- ja RX -nastoja.
  • MCU -ohjelmoija, joka on minun tapauksessani K150 -ohjelmoija, mutta voit käyttää PicKit 2: ta, 3: ta tai mitä tahansa muuta.
  • Ja vihdoin tietokone:)

Ohjelmiston osalta:

  • IDE python -koodin kirjoittamiseen, joka on minun tapauksessani Pycharm, mutta voit käyttää myös tavallista Python IDE: tä.
  • Ympäristö MCU: n ohjelmointiin, joka on minun tapauksessani MPLAB X IDE CCS C -kääntäjällä.

Vaihe 2: Laitteistoyhteydet

Laitteiston liitännät
Laitteiston liitännät

Kuvassa on liitetty laitteistoliitännät, jotka ovat PIC MCU: n ja USB TTL -muuntimen välillä seuraavasti:

RC7 (RX) ------------- TXD

RC6 (TX) ------------- RXD

GND -------------- GND

Sinun ei tarvitse liittää USB TTL -muuntimen VCC -nastaista (jos haluat, voit kuitenkin tehdä sen). Nämä kolme liitäntää riittää.

Vaihe 3: Python -ohjelmisto

Aloitetaan ohjelmiston kirjoittaminen Python -puolelle, joka on tapauksemme lähetin, koska se lähettää merkkijonon MCU: lle.

tuo sarja #import serial librarydata = '24' #data, jonka lähetämme dataa = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #yhteys porttiin ser.write (a. encode ()) #lähetä tiedot

Ensinnäkin sarjakirjasto tuodaan käyttääkseen sen futuureja. Haluamme lähettää esimerkkijonotiedot vahvistaaksemme MCU -koodissa, että hyväksyimme ne. Haluan tässä huomata yhden asian. Siksi lisäsimme merkkijonoon / \. Tämä johtuu siitä, että MCU -puolella on mahdotonta lukea merkkijono kokonaan. Se luetaan merkki luonteelta. Joten haluamme tietää merkkijonon lopettamisen lukemisen lopettamiseksi. Joten lisätään merkkijonoon '\ 0', joka osoittaa merkkijonon lopun. Sitten muodostamme yhteyden MCU: hon liitettyyn porttiin. Voit määrittää portin etsimällä Laitehallinnasta. Joten ole varovainen, että olet samassa portissa. Loppujen lopuksi lähetämme tiedot MCU: lle. ".encode ()" on lisättävä merkkijonotietoihin, jotta se voidaan lähettää vastaanottimelle.

Vaihe 4: Mikro -ohjainohjelmisto

Katsotaanpa siis MCU -koodimme. Ensinnäkin haluan näyttää sinulle "config.h" -tiedoston, jota ei vaadita, mutta tein sen yksinkertaisuuden vuoksi. Tässä muutetaan vain MCU: n taajuutta.

#ifndef CONFIG_H#määritä CONFIG_H

#sisältää

#laite ADC = 16

#FUSES NOWDT // Ei vahtikoiran ajastinta

#SULAKKEET NOBROWNOUT // Ei nollausta

#käyttöviive (kristalli = 6000000)

Katsotaan nyt pääkoodi:

#sisältää

#sisältää

#use rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, pariteetti = N, stop = 1)

#define LED_RED PIN_D0

char inp; char cmp _ = "24"; hiilipuskuri [3];

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); allekirjoittamaton int i = 0; inp = getc (); putc (inp); while (inp! = '\ 0') {puskuri = inp; inp = getc (); putc (inp); i ++; }}

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL); while (1) {enable_interrupts (int_rda); if (strcmp (puskuri, cmp_) == 0) output_low (LED_RED); else output_high (LED_RED); }}

Aluksi sisällytämme merkkijonokirjaston, josta on apua merkkijonotoiminnoissa, tässä tapauksessa merkkijonojen vertailutoiminnossa (strcmp). Joten tarkoituksemme tässä koodissa on kytkeä nastaan D0 kytketty led päälle, jos lähetetty arvo on sama kuin annettu arvo, joka on "cmp_", joka on "24".

Ensinnäkin otamme käyttöön keskeytyksen "rda", joka aiheuttaa keskeytyksen, kun tietoja lähetetään.

Toiseksi, katsotaan ISR: n (keskeytyspalvelurutiini) sisälle, jota kutsutaan "serial_communication_interrupt". Sisällä poistamme ensin keskeytyslipun, jotta voimme lukea vastaanotetun arvon ja aiheuttaa keskeytyksen edelleen. Tämän jälkeen luemme merkkijonon merkki kerrallaan, kunnes saavutetaan '\ 0'. Kun luemme merkkijonoa, kirjoitamme myös jokaisen merkin puskuriin saadaksemme vastaanotetun merkkijonon.

Lopulta palaamme taas sisälle. Tässä vertaamme puskurijonoamme, joka on vastaanotettu merkkijono ja cmp_ -merkkijono, nähdäksemme, saammeko merkkijonon oikein. Jos ne ovat yhtä suuret, kytken ledin päälle, muuten sammutan.*

*Koodissa tein käänteisen, koska levyni kääntää D -portin nasta -arvot. Muuta koodisi koodiksi:

if (strcmp (puskuri, cmp_) == 0) output_high (LED_RED); else output_low (LED_RED);

Kokoa se lopuksi ja lataa MCU -laitteeseesi ja suorita sitten koodi Pythonissa. Sinun pitäisi nähdä led -kytkimen päälle.

Vaihe 5: Johtopäätös

Olemme tehneet yhden tehtävän onnistuneesti. Toivon, että siitä on sinulle hyötyä. Jos sinulla on kysyttävää, älä epäröi kysyä:) Ennen seuraavaa projektia.

Suositeltava: