PIC16F877(A) meistern: Features, Pinout, I/O-Ports & LED-Blink-Tutorial
Der PIC16F877A (verbesserte Version des PIC16F877) ist ein 8-Bit-Mikrocontroller von Microchip (heute Microchip Technology), der durch günstigen Preis, breite Verfügbarkeit, umfangreiche Peripherie und gute Tool-Unterstützung (MPLAB X, XC8 Compiler, PICkit) zu den beliebtesten Einstiegs- und professionellen Controllern zählt. Dieser Artikel gibt Überblick über Features, Pinbelegung, Port-Architektur und ein erstes LED-Blink-Projekt.
1. Überblick
- Architektur: Harvard (getrennte Programm-/Datenbus), RISC (35 Instruktionen)
- Takt: bis 20 MHz (externer Quarz/Keramik) oder intern 4/8 MHz (PIC16F877A)
- Flash: 8 KB (4096 Instruktionen), 10.000 Löschzyklen
- RAM: 368 Byte
- EEPROM: 256 Byte
- I/O: bis 33 Pins (5 Ports: A–E), davon 12 ADC-Kanäle (10-bit)
- Peripherie: 3 Timer (1×16-bit, 2×8-bit), 2×CCP (PWM/Capture/Compare), MSSP (SPI/I²C), USART, WDT, BOR, Komparator, Vref
- Gehäuse: 40-Pin DIP, 44-Pin TQFP/QFN
- Spannung: 2,0 – 5,5 V (A), 4,0 – 5,5 V (ohne A)
2. Wichtigste Features
- Niedrigstrom-Modi: Sleep (WDT, Ext-Int, Port-Change Weckung), Idle
- PWM: 2 Kanäle (CCP1, CCP2), 10-bit Auflösung, bis 20 kHz bei 20 MHz
- ADC: 10-bit, 8 Kanäle (AN0–AN7), simultanes Sampling nicht, aber schnelle Kanalumschaltung
- Kommunikation: USART (Sync/Async), MSSP (SPI Master/Slave, I²C Master/Slave)
- In-Circuit Debugging: ICD2/3/4, PICkit 3/4/5 über PGC/PGD (RB6/RB7)
- In-Circuit Serial Programming (ICSP): VPP (MCLR), VDD, VSS, PGC, PGD
3. Pin-Diagramm (40-Pin DIP)
| Pin | Name | Hauptfunktion |
|---|---|---|
| 1 | MCLR/VPP | Master Clear (Reset, aktiv Low), Programmierspannung |
| 2 | RA0/AN0 | Port A0 / ADC Ch0 |
| 3 | RA1/AN1 | Port A1 / ADC Ch1 |
| 4 | RA2/AN2/VREF- | Port A2 / ADC Ch2 / VREF- |
| 5 | RA3/AN3/VREF+ | Port A3 / ADC Ch3 / VREF+ |
| 6 | RA4/T0CKI | Port A4 / Timer0 Clock Input |
| 7 | RA5/AN4/SS | Port A5 / ADC Ch4 / SPI Slave Select |
| 8 | RE0/RD/AN5 | Port E0 / Read / ADC Ch5 |
| 9 | RE1/WR/AN6 | Port E1 / Write / ADC Ch6 |
| 10 | RE2/CS/AN7 | Port E2 / Chip Select / ADC Ch7 |
| 11 | VDD | Positive Versorgung (5 V) |
| 12 | VSS | Masse |
| 13 | OSC1/CLKIN | Oszillator-Eingang / Externer Takt |
| 14 | OSC2/CLKOUT | Oszillator-Ausgang |
| 15 | RC0/T1OSO/T1CKI | Port C0 / Timer1 Osc Out / Timer1 Clock |
| 16 | RC1/T1OSI/CCP2 | Port C1 / Timer1 Osc In / CCP2 |
| 17 | RC2/CCP1 | Port C2 / CCP1 (PWM) |
| 18 | RC3/SCK/SCL | Port C3 / SPI Clock / I²C Clock |
| 19 | RD0/PSP0 | Port D0 / Parallel Slave Port |
| 20 | RD1/PSP1 | Port D1 / PSP |
| 21 | RD2/PSP2 | Port D2 / PSP |
| 22 | RD3/PSP3 | Port D3 / PSP |
| 23 | RC4/SDI/SDA | Port C4 / SPI Data In / I²C Data |
| 24 | RC5/SDO | Port C5 / SPI Data Out |
| 25 | RC6/TX/CK | Port C6 / USART TX / Sync Clock |
| 26 | RC7/RX/DT | Port C7 / USART RX / Sync Data |
| 27 | RD4/PSP4 | Port D4 / PSP |
| 28 | RD5/PSP5 | Port D5 / PSP |
| 29 | RD6/PSP6 | Port D6 / PSP |
| 30 | RD7/PSP7 | Port D7 / PSP |
| 31 | VSS | Masse |
| 32 | VDD | Positive Versorgung |
| 33 | RB0/INT | Port B0 / Externer Interrupt |
| 34 | RB1 | Port B1 |
| 35 | RB2 | Port B2 |
| 36 | RB3 | Port B3 |
| 37 | RB4 | Port B4 |
| 38 | RB5 | Port B5 |
| 39 | RB6/PGC | Port B6 / ICSP Clock |
| 40 | RB7/PGD | Port B7 / ICSP Data |
4. I/O-Port-Architektur
Jeder Port hat zwei Register:
- TRISx (Data Direction): 1 = Eingang, 0 = Ausgang
- PORTx: Lesen (Eingang) / Schreiben (Ausgang)
- LATx (Latch, nur PIC18, nicht PIC16): bei PIC16 Lesen/Schreiben über PORTx
Port-Details
- Port A (RA0–RA5, 6 Pins): Analogeingänge (AN0–AN4, VREF±), RA4 nur Open-Drain-Ausgang (T0CKI).
- Port B (RB0–RB7, 8 Pins): Digital I/O, RB0 Externer Interrupt, RB6/7 ICSP, Pull-ups aktivierbar (OPTION_REG).
- Port C (RC0–RC7, 8 Pins): Timer1, CCP1/2 (PWM), MSSP (SPI/I²C), USART. Vielseitigster Port.
- Port D (RD0–RD7, 8 Pins): Digital I/O, Parallel Slave Port (PSP) für 8-Bit-Mikroprozessor-Interface.
- Port E (RE0–RE2, 3 Pins): Steuer-signale für PSP (RD, WR, CS), auch ADC AN5–AN7.
Wichtig: Nach Reset sind alle Pins (außer MCLR, VDD, VSS) als Eingänge konfiguriert (TRIS = 1). Analogfunktion an Port A/E standardmäßig aktiv → ADCON1 = 0x0F setzt alle auf Digital.
5. Praxis: LED an PORTD (RD2) blinken lassen
Hardware
- PIC16F877A im 40-Pin-DIP-Sockel
- 16 MHz Quarz an Pin 13/14 + 2 × 22–33 pF an GND
- MCLR (Pin 1): 10 kΩ an VDD + 100 nF an GND (Reset-Schutz)
- VDD (11, 32) an 5 V, VSS (12, 31) an GND
- LED + 470 Ω Vorwiderstand an RD2 (Pin 21) → GND
- PICkit 3/4 an PGC/PGD (39/40), VPP (1), VDD, VSS
Software (MPLAB X + XC8)
#pragma config FOSC = HS // High-Speed Oszillator
#pragma config WDTE = OFF // Watchdog aus
#pragma config PWRTE = ON // Power-up Timer an
#pragma config BOREN = ON // Brown-out Reset an
#pragma config LVP = OFF // Low-Voltage Programming aus
#pragma config CPD = OFF // Data EE Protect aus
#pragma config WRT = OFF // Flash Write Protect aus
#pragma config CP = OFF // Code Protect aus
#include <xc.h>
#define _XTAL_FREQ 16000000
void main(void) {
// Port D als Ausgang
TRISD = 0x00; // Alle Pins Output
PORTD = 0x00; // Alle Low
// ADC aus (Port A/E digital)
ADCON1 = 0x0F;
while (1) {
PORTDbits.RD2 = 1; // LED an
__delay_ms(500);
PORTDbits.RD2 = 0; // LED aus
__delay_ms(500);
}
}
Erklärung
- Config-Bits: HS-Oszillator (16 MHz), WDT aus, PWRT an, BOR an.
_XTAL_FREQfür__delay_ms()nötig.TRISD = 0→ ganz Port D Ausgang.ADCON1 = 0x0F→ Port A/E digital (sonst Analog-Eingang, kein Digital-Out).- Endlosschleife toggelt RD2 mit 500 ms Delay.
Fazit
Der PIC16F877A ist ein klassischer, robuster 8-Bit-Controller für Lernzwecke und industrielle Steuerungen. Die Port-Architektur (TRIS/PORT) ist einfach, die Peripherie deckt 90 % typischer Anwendungen ab. Mit MPLAB X IDE, XC8 Compiler und PICkit 4/5 ist die Entwicklungsumgebung professionell und kostenlos. Nächste Schritte: Timer-Interrupts, ADC-Nutzung, PWM-Motorschaltung, I²C-Sensoren, UART-Debugging.
Benötigen Sie ein Beispiel für ADC, PWM oder I²C? Kontaktieren Sie uns.
Industrietechnik
- E3.series 2021: Fortgeschrittene Kabel- & Kabelbaum-Funktionen & Gratis-Testversion
- Batterieverschaltung richtig wählen: Reihenschluss, Parallelschaltung & Reihenschluss-Parallelschaltung
- Spritzguss mit Auswerferstiften optimieren: Typen & Best Practices
- Fase vs. Fase: Wichtige Unterschiede, die jeder Designer kennen muss
- Effizienz maximieren: Funktionen & Vorteile von Inventarmanagement-Software
- PIC18 Mikrocontroller: Eigenschaften, Performance & Programmierung
- 2N3771 NPN-Leistungstransistor: Pinout, Daten, Anwendungen & Alternativen
- AT89C51 Mikrocontroller: Übersicht, Pinout, Programmierung & Alternativen
- Arduino Protoshield selbst bauen: Schritt-für-Schritt-Montageanleitung
- Schnellrücklaufmechanismus: Funktion, Anwendungen und Vorteile