Behöver hjälp med PIC16F882 [Löst]
Behöver hjälp med PIC16F882 [Löst]
Jag har gjort ett kort med en PIC16F882 som ska användas bl.a. för att styra en LED. Mitt problem är att jag inte kan få mikrokontrollern att exekvera utan att momentant jorda MCLR ingången.
Kortet matas med +12 V, PICen matas med +5 V via en linjär regulator kopplad till +12 V. MCLR är kopplad till +5 V via ett 10k motstånd samt till jord via 100 nF kondensator. PICen använder intern oscillator inställd på 8 MHz.
Jag använder MPLAB ICD 2 som programmerare, med denna ansluten kan jag styra MCLR och på så sätt starta/stoppa mikrokontrollern utan problem (Release from Reset/Hold in Reset från MPLAB IDE). Använder jag inte programmeraren utan bara ansluter matningen till kortet går inte mikrokontrollern igång. Triggar jag MCLR (genom att momentant kortsluta 100 nF kondensatorn) går PICen igång.
Någon som har tips på vad jag har gjort för fel?
EDIT:
Felet i mitt fall (för de som inte orkar läsa hela tråden) var att jag hade aktiverat Low-Voltage (Single-Supply) ICSP Programming (LVP-flaggan satt) samtidigt som jag hade lämnat PGM (RB3) flytande.
Ur datablad kapitel 14.10 Note 4: "RB3 should not be allowed to float if LVP is enabled. An external pull-down device should be used to default the device to normal operating mode. If RB3 floats high, the PIC16F882/883/884/886/887 devices will enter Programming mode.", vilket sannolikt var det som hände för mig.
Tack Marta!
Kortet matas med +12 V, PICen matas med +5 V via en linjär regulator kopplad till +12 V. MCLR är kopplad till +5 V via ett 10k motstånd samt till jord via 100 nF kondensator. PICen använder intern oscillator inställd på 8 MHz.
Jag använder MPLAB ICD 2 som programmerare, med denna ansluten kan jag styra MCLR och på så sätt starta/stoppa mikrokontrollern utan problem (Release from Reset/Hold in Reset från MPLAB IDE). Använder jag inte programmeraren utan bara ansluter matningen till kortet går inte mikrokontrollern igång. Triggar jag MCLR (genom att momentant kortsluta 100 nF kondensatorn) går PICen igång.
Någon som har tips på vad jag har gjort för fel?
EDIT:
Felet i mitt fall (för de som inte orkar läsa hela tråden) var att jag hade aktiverat Low-Voltage (Single-Supply) ICSP Programming (LVP-flaggan satt) samtidigt som jag hade lämnat PGM (RB3) flytande.
Ur datablad kapitel 14.10 Note 4: "RB3 should not be allowed to float if LVP is enabled. An external pull-down device should be used to default the device to normal operating mode. If RB3 floats high, the PIC16F882/883/884/886/887 devices will enter Programming mode.", vilket sannolikt var det som hände för mig.
Tack Marta!
Senast redigerad av Fredde 2 december 2012, 19:52:27, redigerad totalt 2 gånger.
Re: Behöver hjälp med PIC16F882
För långsam stigning av VDD?
Dålig avkoppling?
Fel i koden?
Det finns så mycket du kan göra fel att det är svårt att svara på utan t.ex. lite kort eller ett schema eller liknande.
Dålig avkoppling?
Fel i koden?
Det finns så mycket du kan göra fel att det är svårt att svara på utan t.ex. lite kort eller ett schema eller liknande.
Re: Behöver hjälp med PIC16F882
Det tror jag inte, jag får samma problem om jag matar +5 V direkt (kopplar förbi regulatorn).För långsam stigning av VDD?
Det tror jag inte, 100 nF precis brevid PICens VDD (<3 mm).Dålig avkoppling?
Mycket möjligt. Se nedanFel i koden?
Bifogar schema (Hoppas det fungerar)Det finns så mycket du kan göra fel att det är svårt att svara på utan t.ex. lite kort eller ett schema eller liknande.
Testat att ta bort helt och bytt till en ny, ingen skillnad.Min gissning: Skippa 100nF kondingen på MCLR.
Testmjukvara:
Kod: Markera allt
// Compiler: CCS PIC C Compiler PCM Version 4.071
#include <16F882.h>
#fuses INTRC_IO,NOPROTECT
#fuses NOBROWNOUT, BORV21
#fuses NOWDT
#fuses PUT,NOCPD,NODEBUG
#fuses LVP,NOWRT,NOIESO,NOFCMEN
#fuses MCLR
#use delay(clock=8000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(E)
// Defines:
#define TRIS_A 0b00000011
#define TRIS_B 0b11000011
#define TRIS_C 0b10000000
#define TRIS_E 0b11111111
// Pin definitions:
#bit INPUT1 = 0x06.0 // RB0
#bit INPUT2 = 0x06.1 // RB1
#bit SERVO_1_CURRENT = 0x05.0 // RA0
#bit SERVO_2_CURRENT = 0x05.1 // RA1
#bit LED_1 = 0x07.0 // RC0
#bit LED_2 = 0x07.1 // RC1
#bit SERVO_1_PWR = 0x07.2 // RC2
#bit SERVO_2_PWR = 0x07.3 // RC3
#bit SERVO_1_PULSE = 0x07.4 // RC4
#bit SERVO_2_PULSE = 0x07.5 // RC5
#bit UART_TX = 0x07.6 // RC6
#bit UART_RX = 0x07.7 // RC7
// Internal bit/byte mapping:
#byte OSCCON = 0x8F /* Oscillator control register */
// Global variables:
long clk_tick = 0;
// Interrupt functions:
// Routine to keep a running timer that increments every 10 milli-second
#int_timer2
void isr_timer2(void)
{
clk_tick++;
}
// Main Loop:
void main() {
setup_oscillator(OSC_8MHZ); // Setup internal oscillator to 8 MHz.
set_tris_a(TRIS_A); // Setup I/O
set_tris_b(TRIS_B);
set_tris_c(TRIS_C);
set_tris_e(TRIS_E);
setup_timer_2(T2_DIV_BY_16, 250, 5); // Setup Timer2 for a clock tick of 10 ms
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
SERVO_1_PWR = 0; // No power to servo
SERVO_2_PWR = 0; // No power to servo
// Infinite loop:
while(TRUE)
{
if(clk_tick > 50)
{
LED_1 = 1;
LED_2 = 0;
}
if(clk_tick > 100)
{
LED_1 = 0;
LED_2 = 1;
clk_tick = 0;
}
}// while(TRUE)
} // main
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Behöver hjälp med PIC16F882
Jag brukar inte ha den iaf. Normalt kopplar jag bara -MCLR till VDD via ett 10k motstånd, sedan får det räcka. Såklart har jag avkoppling av spänningsmatningen osv.
EDIT: Medan jag skrev kom dit svar och jag ser direkt en sak:
void isr_timer2(void)
{
clk_tick++;
}
Var nollar du interrupt-bitten?
EDIT: Medan jag skrev kom dit svar och jag ser direkt en sak:
void isr_timer2(void)
{
clk_tick++;
}
Var nollar du interrupt-bitten?
Re: Behöver hjälp med PIC16F882
Det gör jag inte, det gör kompilatorn åt mig när jag lämnar interruptfunktionen.EDIT: Medan jag skrev kom dit svar och jag ser direkt en sak:
void isr_timer2(void)
{
clk_tick++;
}
Var nollar du interrupt-bitten?
Problemet är att jag måste göra en reset via MCLR vid spänningspåslag för att PICen ska exekvera. Det ska jag inte behöva göra och frågan är vad jag gjort för fel eftersom det behövs.
Vi kan korta ner problemet ytterligare:
Kod: Markera allt
void main() {
setup_oscillator(OSC_8MHZ); // Setup internal oscillator to 8 MHz.
set_tris_a(TRIS_A); // Setup I/O
set_tris_b(TRIS_B);
set_tris_c(TRIS_C);
set_tris_e(TRIS_E);
LED_1 = 1; // Tänd LED #1.
Re: Behöver hjälp med PIC16F882
Jag har provat utan och provat byta till en ny. Ingen skillnad.
Re: Behöver hjälp med PIC16F882
Det ser ut som att Du aktiverar LVP och har PGM-pinnen flytande. Detta kan ge upphov till oförklarliga magiska fenomen om det vill sig illa. Prova att stänga av LVP och se om det gör skillnad, eller se till att PGM-pinnen hålls till logisk nolla med en pull-down.
Re: Behöver hjälp med PIC16F882
Provade att stänga av LVP och det löste problemet, nu fungerar den biten som det ska. Man lär sig något nytt varje dag, tusen tack för snabb hjälp!Marta skrev:Det ser ut som att Du aktiverar LVP och har PGM-pinnen flytande. Detta kan ge upphov till oförklarliga magiska fenomen om det vill sig illa. Prova att stänga av LVP och se om det gör skillnad, eller se till att PGM-pinnen hålls till logisk nolla med en pull-down.

(Har inte provat att ha LVP satt och hålla PGM låg)