PIC16F877

Fra HTX Arduino
Version fra 8. dec. 2022, 11:42 af Bar (diskussion | bidrag) Bar (diskussion | bidrag) (→‎Udviklingsboard)
(forskel) ←Ældre version | Nuværende version (forskel) | Nyere version → (forskel)
Spring til navigation Spring til søgning
PIC16F877 Pinout

PIC16F877 er en PIC der mest af alt har flere ben at arbejde med, og den har nogle lidt anderledes indbyggede funktioner som er til at arbejde med. Det er en 40 bens PIC, hvor de 33 ben kan bruges mere eller mindre som IO.

Det er en lidt ældre PIC-type, hvilket betyder at den på nogle punkter er lidt mere besværlig at arbejde med, f.x. kan den ikke arbejde med intern oscillator, så man skal have en resonator eller et krystal på, for at den kan fungere.

PIC16F877 er dog en meget anvendt PIC, så man kan finde rigtigt mange gode eksempel-koder på internettet, hvor den er koblet op mod alt muligt forskelligt.

Faktisk er der to forskellige PIC-typer der hedder noget med 877, nemlig en 16F877 og en 16F877A - en af forskellene er hvordan configuration fuses er placeret og hvad de kan. Derfor er der her et simpelt program-eksempel til begge typer, så man har styr på indstillingerne. Det er bare et eksempel der blinker med en lysdiode

Som pinout antyder, så kan den meget mere end bare digital IO:

Udviklingsboard

PIC16F877 Udviklingsboard


Layoutet for PIC16F877 Udviklingsboard

En del af denne beskrivelse bygger på det viste udviklingsboard, der er en del af en serie udviklet ved Holstebro HTX, for at gøre de forskellige PIC-typer lettere tilgængelige.

Udviklingsboardet er lagt ud i Eagle med schematic og board liggende i en zip-fil, der kan fremstilles som enkelt-sidet print, dog med enkelte lus.

Der er også dele i denne beskrivelse, der bygger på de generelle egenskaber der er for PIC'en, og der hvor beskrivelsen ikke slår til, må man fordybe sig i databladet for PIC'en.

Databladet for PIC'en ligger i vores samling af datablade som dækker de fleste aktive komponenter vi arbejder med.

PIC16F877 Udviklingsboard
Diagram over PIC16F877 Udviklingsboard

Fordeling af port-ben

De to porte er fordelt som følgende tabel viser:

Port A - Stik SV1

Ben Digital Analog Funktion
1 RA0 AN0 Digital, Analog, Comperator
2 RA1 AN1 Digital, Analog, Comperator
3 RA2 AN2 Digital, Analog, Reference, Comperator
4 RA3 AN3 Digital, Analog, Comperator
5 RA4 - Digital, Timer 1 Clock, Open Drain (kan kun trække lavt som output)
6 RA5 AN4 Digital, Analog,
7 - - No Connection
8 - - No Connection / Jumper til Ureguleret forsyning
9 +5V - + 5V - Forsyning
10 GND - Stel - Forsyning

Port B - Stik SV2

Ben Digital Analog Funktion
1 RB0 - Digital, Interrupt
2 RB1 - Digital
3 RB2 - Digital
4 RB3 - Digital
5 RB4 - Digital
6 RB5 - Digital
7 RB6 - Digital, Prog. Clock
8 RB7 - Digital, Prog. Data
9 +5V - + 5V - Forsyning
10 GND - Stel - Forsyning

Port C - Stik SV7

Ben Digital Analog Funktion
1 RC0 - Digital
2 RC1 - Digital, PWM2 output
3 RC2 - Digital, PWM1 output
4 RC3 - Digital
5 RC4 - Digital
6 RC5 - Digital
7 RC6 - Digital, Async. TX
8 RC7 - Digital, Async. RX
9 +5V - + 5V - Forsyning
10 GND - Stel - Forsyning

Port D - Stik SV8

Ben Digital Analog Funktion
1 RD0 - Digital
2 RD1 - Digital
3 RD2 - Digital
4 RD3 - Digital
5 RD4 - Digital
6 RD5 - Digital
7 RD6 - Digital
8 RD7 - Digital
9 +5V - + 5V - Forsyning
10 GND - Stel - Forsyning

Port E - Stik SV9

Ben Digital Analog Funktion
1 RE0 AN5 Digital, Analog
2 RE1 AN6 Digital, Analog
3 RE2 AN7 Digital, Analog
4 - - No Connection
5 - - No Connection
6 - - No Connection
7 - - No Connection
8 - - No Connection
9 +5V - + 5V - Forsyning
10 GND - Stel - Forsyning

Digitale I/O ben

Port A har 6 digitale ben, der er betegnet RA0 til RA5, hvor RA4 er lidt speciel, se beskrivelsen i næste afsnit. De andre kan være både input og output på normal vis.

Port B har 8 digitale ben, der er betegnet RB0 til RB7, som alle kan være både input og output, dog med begrænsninger på RB6 og RB7 som beskrevet i næste afsnit.

Port C har 8 digitale ben, der er betegnet RC0 til RC7, der alle kan være både input og output RC6 og RC7 har do den specielle funktion, at der kan tilsluttes en seriel port, som beskrevet under afsnittet Seriel Port.

Port D har 8 digitale ben, der er betegnet RD0 til RD7, der alle kan være både input og output.

Port E har 3 digitale ben, der er betegnet RE0 til RE2, der alle kan være både input og output

Ben B6, B7 og ben A4

Ben B6 og B7 bliver, udover at blive brugt som output af PIC’en, som forbindelse til PIC-brænderen gennem 6-bens stikket, når der skal brændes nu kode på PIC’en. Derfor er disse ben også sårbare overfor indgående signaler, som kommer fra andet elektronik tilsluttet disse ben. Derfor er de hver beskyttet med en modstand. Så tilslutning 7 og 8 på stik 2, har en formodstand, så de vil opføre sig ensmule anderledes end tilsvarende tilslutninger på det andet stik.

Men derudover virker ben B6 og B7, som styrestrøm for hver deres transistor, som åbner for forbindelse til stel for to lysdioder med formodstande, som er tilsluttet hver. Det gør at man tit kan efterlade de to ben til at være test-ben, hvor man kan markere hvor langt man kommer i programmet, når man laver fejlfinding.

Ben A4 er også lidt speciel, da dens output-trin er af open-drain typen (FET-transistor), hvilket svarer til en open collector på en normal transistor.

I praksis betyder det, at udgangen ikke kan trække højt, så den kan være lidt besværlig at arbejde med som udgang. En simpel løsning kan være at man konfigurerer sin opstilling, sådan at man bruger RA4 som input.

Der er dog en smart detalje ved ben A4, nemlig at den kan tillade at have spændinger over VDD, nemlig helt op til 8,5V. På den måde kan man arbejde med et kredsløb der er forsynet med en anden forsyningsspænding, uden at skulle lave specielle konstruktioner mellem PIC'en og det den skal drive. Man skal blot placere det således at det kan aktiveres af en lav spænding (f.x. det at trække et lille 6V relæ).

Analoge input

De ben der er benævnt AN0 til AN7 er analoge input, der hver kan måle enten i området 0-5V (ved 5V forsyning) eller i området fra Vref- (ben 4) til Vref+ (ben 5). Dvs.: RA0, RA1, RA2, RA3, RA5, RE0, RE1, RE2. Disse har også navnene AN0-AN7.

Målingen giver et 10 bit tal, ved at man angiver hvilken kanal man vil måle på, starter konverteringen og aflæser tallet, når konverteringen er slut, så man kan kun måle en kanal ad gangen, men det er relativt hurtigt at gøre, så det betyder ikke det store.

Reset og Programmeringsspænding

Ben 1 har to specielle funktioner.

Den ene er angivet ved VPP, der betyder at der skal kredsen have programmeringsspænding, når man skal brænde et nyt program ind i den.

Den anden er at man kan resette kredsen ved hjælp af et eksternt signal, så koden starter forfra.

Programmerings-ben

PGD (RB7) og PGC (RB6) er de to ben der modtager koden når PIC'en skal have brændt ny kode ind.

Indbyggede countere/timere

Der er to indbyggede countere, der kan sættes op enten som counter fra T0CKI og T1CKI, eller fra en fast frekvens, så de kan virke som timere - begge dele kan tilkobles interrupt. Den sidste kan kun virke som timer.

Timer 0 / counter 0 er 8 bits, så den kan kun tælle til 255. Timer 1 / counter 1 er 16 bits, så den kan tælle til 65535. Den kan kobles op, så T1G bestemmer om den skal tælle eller ej. Timer 2 kan kun kobles som timer, og er også begrænset til 8 bit, så den kan kun tælle til 255.

Seriel port

En af de tilføjelser der gør PIC16F877 sjovere at arbejde med er, at den har en indbygget seriel port. Sammen med timerne kan man sætte Baud-rate (bit pr. sekund) op, så man kan kommunikere med en seriel port på en PC.

På dette udviklingsboard er det implementeret ved hjælp af en MAX232, så det eneste der kræves er at man sætter en seriel port til stikket X2, der er et standard serielt stik, og at man sætter jumpere på SV4 og SV5, så de serielle signaler kan komme ud og ind af PIC'en.

Master synkron seriel port

Man kan arbejde med en synkron seriel kommunikation, enten i det der hedder Serial Peripheral Interface (SPI), eller i det der hedder Inter-Integrated Circuit standard (I2C). Konsulter databladet.

Mikroprocessor bus Interface

PIC16F877 kan interface over mod en anden mikroprocessor af den type der arbejder med en eksterne databus. Port D tilsluttes databussen, og de 3 ben i Port E styrer kontrollen fra den anden mikroprocessor.

På denne måde kan der læses og skrives bytes til og fra PIC'en over i et andet system.

Hardware interrupt

INT benet kan sættes til Interrupt, så programmet kan reagere meget hurtigt, selvom koden er i gang med noget andet.

Puls-bredde output

En lidt speciel måde at angive et analogt output på er ved at sætte et outputben højt i en %-del af tiden og lavt i resten af tiden, så hvis det f.x. er højt i 40% af tiden, så vil det give 2V ud gennemsnitligt.

CCP1 og CCP2 har denne funktion indbygget, men der kan tilkobles nogle hændelser med CCP1

Pulse width modulation er en måde at simulere en spænding, ved et digitalt output. Det fungerer sådan, at selvom outputtet enten 0V eller 5V, så kan man ved atlave kortere eller længere impulser af det høje output, lave noget der praktisk fungere som en spænding imellem 0V og 5V. Typisk kan PWM have en værdi/spænding mellem 0 og 255, hvilket svarer til 8bit. Jo hurtigere impulserne kommer efter hinanden, jo mere ”flydende” vil spænding blive. Så hvis det er en PIC med hurtig frekvens af instruktioner, så vil spændingen opleves mere jævn. Man kan med en kondensator el. Jævne ekstra ud, selvom det i de fleste tilfælde ikke er nødvendigt. En pære eller diode, vil ihvertfald opleves, som lysende jævnt, ved brug af PWM.

EEPROM

I PIC'en er der en EEPROM, det står for en Electrically Erasable Programmable Read Only Memory, altså en hukommelse der normalt kun kan læses, men som er programmerbar og som kan slettes elektrisk.

Det er samme princip som flash-hukommelse, og har den gode egenskab, at indholdet huskes også efter en strømafbrydelse, modsat RAM, hvor indholdet forsvinder, hvis strømmen har været væk.

Der er 256 bytes EEPROM i denne PIC.

Oscillator

På dette udviklingsboard skal man bruge en resonator (RES1), de fleste applikationer klarer sig fint med 4 MHz, så det vil typisk være den man monterer, med mindre man har ting der er meget tidskrævende, hvor man kan anvende helt op til 20MHz på de fleste PIC's, det kan dog være nødvendigt at tjekke med den aktuelle PIC, da nogle er mærket med 4MHz, hvorfor de selvfølgelig kun kan håndtere op til 4 MHz.

Strømforsyning

Printet kan få strøm fra to forskellige kilder. Det kan altså enten være PIC-­-brænderen der forsyner printet med 5.0V (standard for USB). Den anden mulighed er via en eksternstrømfosynings adapter, som vi kender fra mange andre elektroniske apparater derhjemme. Den har en Spændingsregulerende IC, som sørger for at ligemeget om spænding er lidt over 5V fra den eksterne kilde, så vil printet og PIC’en kun få 5V. Hvis den får væsentlig mere en 5V kan den blive meget varm eller brænde af. Den har adskillige kondensatorer, som bevirker at spædingen glattes ud. (bliver mere jævn.)

Som en ekstra feature kan man i Port A (SV1) få den uregulerede spænding ud i portstikket på ben 8, ved at sætte en jumper på SV6. Dette kan anvendes hvis man f.x. skal forsyne en operationsforstærker, så den kan komme op på 5V på udgangen, ved at den får en forsyningsspænding der ligger på mindst 9V.

Jal standard settings

-- Chip def
include 16f877

-- Setup pic
pragma target clock 4_000_000
pragma target WDT DISABLED
pragma target OSC XT
pragma target PWRTE ENABLED
pragma target CP DISABLED
pragma target CPD DISABLED
pragma target BROWNOUT ENABLED
PIC
PIC-Typer PIC16F84 - PIC12F675 - PIC16F628 - PIC16F684 - PIC16F690 - PIC16F877 - PIC18F2550
Programmeringsbegreber Maskinkode - Mikrocontroller
Programmeringsmiljø PIC-brænder - UsbPicProg - Analog indgang - ICSP