Indholdsfortegnelse:

PIC MCU og Python seriel kommunikation: 5 trin
PIC MCU og Python seriel kommunikation: 5 trin

Video: PIC MCU og Python seriel kommunikation: 5 trin

Video: PIC MCU og Python seriel kommunikation: 5 trin
Video: Golang vs Python #shorts tiktok hackmymozg 2024, November
Anonim
PIC MCU og Python seriel kommunikation
PIC MCU og Python seriel kommunikation
PIC MCU og Python seriel kommunikation
PIC MCU og Python seriel kommunikation

Hej gutter! I dette projekt vil jeg prøve at forklare mine eksperimenter med PIC MCU og Python seriel kommunikation. Over internettet er der mange selvstudier og videoer om, hvordan man kommunikerer med PIC MCU over virtuel terminal, hvilket er meget nyttigt. I mit hovedprojekt er et af kravene imidlertid at etablere seriel kommunikation mellem PIC MCU og Python, som jeg ikke kunne finde god vejledning. Så lad os komme i gang:)

Trin 1: Hvad har vi brug for?

Hvad har vi brug for?
Hvad har vi brug for?
Hvad har vi brug for?
Hvad har vi brug for?

Så lad os først og fremmest se, hvad vi har brug for. Med hensyn til hardware:

  • Sikkert, PIC MCU, som i mit tilfælde er PIC16f877a (Du behøver ikke det kort. Dette er for at forenkle nogle beskidte forbindelser)
  • USB til TTL -konverter for at kommunikere med PIC MCU over USB -port ved hjælp af TX- og RX -ben.
  • MCU -programmerer, som i mit tilfælde er K150 -programmerer, men du kan bruge PicKit 2, 3 eller andet.
  • Og endelig en computer:)

Med hensyn til software:

  • En IDE for at skrive python -kode, som i mit tilfælde er Pycharm, men du kan også bruge almindelig Python IDE.
  • Et miljø til programmering af MCU, som i mit tilfælde er MPLAB X IDE med CCS C compiler.

Trin 2: Hardwareforbindelser

Hardwareforbindelser
Hardwareforbindelser

På billedet angives vedhæftede hardwareforbindelser, der er mellem PIC MCU og USB TTL -konverter som nedenfor:

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

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

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

Du behøver ikke at tilslutte VCC -pin på USB TTL -konverteren (Du kan dog gøre det, hvis du vil). Disse 3 forbindelser er ganske nok.

Trin 3: Python -software

Lad os begynde at skrive software til Python -siden, som vil være sender i vores tilfælde, fordi den sender strengen til MCU'en.

import serial #import serial librarydata = '24' #data, som vi sender data = a+'\ 0' ser = serial. Serial ('COM17', baudrate = 9600, timeout = 1) #connect til porten ser.write (a.encode ()) #send dataene

Først og fremmest er det serielle bibliotek importeret for at kunne bruge dets fremtid. Vi vil sende et eksempel på string -data for at bekræfte i MCU -koden, at vi har accepteret det. Jeg vil her notere en ting. Det er derfor, vi tilføjede '\ 0' til strengen. Dette skyldes, at det på MCU -siden er umuligt at læse strengen helt. Det læses karakter for karakter. Så vi vil gerne vide slutningen af strengen for at stoppe med at læse. Så vi tilføjer '\ 0' til strengen, der angiver slutningen af strengen. Derefter opretter vi forbindelse til porten, der er forbundet til MCU. Du kan bestemme denne port ved at søge i 'Enhedshåndtering'. Så pas på, at du er på samme port. Vi sender jo dataene til MCU. ".encode ()" bør tilføjes til strengedataene for at kunne sende dem til modtageren.

Trin 4: Microcontroller -software

Så lad os se vores kode til MCU. Først og fremmest vil jeg vise dig "config.h" -filen, som ikke er påkrævet, men jeg gjorde det for nemheds skyld. Her skal du bare ændre hyppigheden af din MCU.

#ifndef CONFIG_H#definere CONFIG_H

#omfatte

#enhed ADC = 16

#FUSES NOWDT // Ingen vagthundtimer

#FUSES NOBROWNOUT // Ingen brownout -nulstilling #FUSES NOLVP // Ingen lavspændingsprogrammering, B3 (PIC16) eller B5 (PIC18), der bruges til I/O

#brug forsinkelse (krystal = 6000000)

Lad os nu se hovedkoden:

#omfatte

#omfatte

#brug rs232 (baud = 9600, xmit = pin_C6, rcv = pin_C7, paritet = N, stop = 1)

#define LED_RED PIN_D0

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

#int_rda

void serial_communication_interrupt () {disable_interrupts (int_rda); usigneret int i = 0; inp = getc (); putc (inp); mens (inp! = '\ 0') {buffer = inp; inp = getc (); putc (inp); i ++; }}

void main (void) {

set_tris_d (0x00); output_d (0xFF); enable_interrupts (GLOBAL); mens (1) {enable_interrupts (int_rda); hvis (strcmp (buffer, cmp_) == 0) output_low (LED_RED); ellers output_high (LED_RED); }}

I begyndelsen inkluderer vi strengbibliotek, som vi vil være behjælpelig med strengoperationer, som i vores tilfælde er strengsammenligningsoperation (strcmp). Så vores formål med denne kode er at tænde lysdioden, der er forbundet til stiften D0, hvis den transmitterede værdi er den samme som vores givne værdi, som er "cmp_", er lig med "24".

Først og fremmest aktiverer vi interrupt "rda", som vil forårsage afbrydelse, når data overføres.

For det andet, lad os se inde i ISR (interrupt service routine), som kaldes "serial_communication_interrupt". Indenfor deaktiverer vi først interrupt -flag for at læse den modtagne værdi og forårsage afbrydelse yderligere. Derefter læser vi strengen tegn for tegn, indtil vi når '\ 0'. Mens vi læser inde i strengen, skriver vi også hver char til bufferen for at få modtaget streng.

Til sidst kommer vi igen indenfor mens. Her sammenligner vi vores bufferstreng, som er modtaget streng og cmp_ streng for at se, om vi får strengen korrekt. Hvis de er lige, tænder jeg LED, ellers slukker.*

*I kode omvendte jeg, fordi mit bord inverterer D -portens pinværdier. Skift den i din kode til:

hvis (strcmp (buffer, cmp_) == 0) output_high (LED_RED); ellers output_low (LED_RED);

Til sidst skal du kompilere det og uploade til din MCU og derefter køre kode i Python. Du skal se LED tænde.

Trin 5: Konklusion

Vi har afsluttet en opgave med succes. Jeg håber, at det vil være nyttigt for dig. Hvis du har spørgsmål, tøv ikke med at spørge:) Indtil næste projekt.

Anbefalede: