Forum: Mikrocontroller und Digitale Elektronik 16f887 Inputproblem


von Andreas F. (andreas_fri)


Lesenswert?

Hallo Leute

Ich bin gerade dabei den 16f887 zu programmieren, jedoch so einach macht 
mir der Pic mein Leben nicht.

Die Pins 33-38 schalten mir keinen Ausgang durch, jedoch die Pins 39-40 
schon.

Wird der Pin 36 mit Spannung belegt, dann sind alle Ausgänge 0.

mein File:

#include <xc.h>
#pragma config1 |= 0b.1000.0000.1101.0100 //Seite 210/212
#pragma config CP = OFF         // FLASH Program Memory Code Protection
#pragma ANSEL |= 0b.0000.0000 //ANS7 - 0 Seite 39 //1 = Analog input, 0 
= Digital I/O
#pragma ANSELH |= 0b.--00.0000 //ANS13 - 8 Seite 39
#pragma PIE1 |= 0b.0000.0000 //PERIPHERAL INTERRUPT

Wisst ihr wo mein Problem ist?

liebe Grüße
Andreas

von Michael (Gast)


Lesenswert?

Und wo ist dein Programm ?

von Andreas F. (andreas_fri)


Lesenswert?

Die 230V werden von Optokopplern in 5V umgesetzt
Die Eingangsspannung ist 4,5V.

/* File:   main.c
 * Author: andreas
 * Created on 01. September 2014, 11:07*/
#include <xc.h>
#include <stdio.h>//könnte man weglassen
#include <stdlib.h>//könnte man weglassen
#include  <pic16f887.h>



#pragma config1 |= 0b.1000.0000.1101.0100 //Seite 210/212
#pragma config CP = OFF         // FLASH Program Memory Code Protection
#pragma ANSEL |= 0b.0000.0000 //ANS7 - 0 Seite 39 //1 = Analog input, 0 
= Digital I/O
#pragma ANSELH |= 0b.--00.0000 //ANS13 - 8 Seite 39
#pragma PIE1 |= 0b.0000.0000 //PERIPHERAL INTERRUPT


void setPins()
{
    //0=Ausgang oder nicht definiert, 1=Eingang
    #define pin1 PORTEbits.RE3              //pin  1    not in use
        TRISEbits.TRISE3 = 0;
    #define ledErr PORTAbits.RA0            //pin  2
        TRISAbits.TRISA0 = 0;
    #define in230V_out_1 PORTAbits.RA1      //pin  3
        TRISAbits.TRISA1 = 1;
    #define in230V_out_2 PORTAbits.RA2      //pin  4
       TRISAbits.TRISA2 = 1;
    #define in230V_out_3 PORTAbits.RA3      //pin  5
       TRISAbits.TRISA3 = 1;
    #define in230V_out_4 PORTAbits.RA4      //pin  6
        TRISAbits.TRISA4 = 1;
    #define in24V_out_5 PORTAbits.RA5       //pin  7
        TRISAbits.TRISA5 = 1;
    #define in24V_out_6 PORTEbits.RE0       //pin  8
        TRISEbits.TRISE0 = 1;
    #define in24V_out_7 PORTEbits.RE1       //pin  9
        TRISEbits.TRISE1 = 1;
    #define in24V_out_8 PORTEbits.RE2       //pin 10
        TRISEbits.TRISE2 = 1;
//11= +
//12= -
    #define pin13 PORTAbits.RA7             //pin 13    not in use
        TRISAbits.TRISA7 = 0;
    #define pin14 PORTAbits.RA6             //pin 14    not in use
        TRISAbits.TRISA6 = 0;
    #define pin15 PORTCbits.RC0             //pin 15    not in use
        TRISCbits.TRISC0 = 0;
    #define okPin PORTCbits.RC1             //pin 16
        TRISCbits.TRISC1 = 1;
    #define out_1_in PORTCbits.RC2          //pin 17
        TRISCbits.TRISC2 = 0;
    #define out_2_in PORTCbits.RC3          //pin 18
        TRISCbits.TRISC3 = 0;
    #define out_3_in PORTDbits.RD0          //pin 19
        TRISDbits.TRISD0 = 0;
    #define out_4_in PORTDbits.RD1          //pin 20
        TRISDbits.TRISD1 = 0;
    //-------------------------------------------------
    #define out_4_out PORTDbits.RD2         //pin 21
        TRISDbits.TRISD2 = 0;
    #define out_3_out PORTDbits.RD3         //pin 22
        TRISDbits.TRISD3 = 0;
    #define out_2_out PORTCbits.RC4         //pin 23
        TRISCbits.TRISC4 = 0;
    #define out_1_out PORTCbits.RC5         //pin 24
        TRISCbits.TRISC5 = 0;
    #define pin25 PORTCbits.RC6             //pin 25    not in use
        TRISCbits.TRISC6 = 0;
    #define pin26 PORTCbits.RC7             //pin 26    not in use
        TRISCbits.TRISC7 = 0;
    #define pin27 PORTDbits.RD4             //pin 27    not in use
        TRISDbits.TRISD4 = 0;
    #define pin28 PORTDbits.RD5             //pin 28    not in use
        TRISDbits.TRISD5 = 0;
    #define pin29 PORTDbits.RD6             //pin 29    not in use
        TRISDbits.TRISD6 = 0;
    #define pin30 PORTDbits.RD7             //pin 30    not in use
        TRISDbits.TRISD7 = 0;
    //31 = -
    //32 = +
    #define in24V_in_8 PORTBbits.RB0  //pin 33
        TRISBbits.TRISB0 = 1;
    #define in24V_in_7 PORTBbits.RB1  //pin 34
        TRISBbits.TRISB1 = 1;
    #define in24V_in_6 PORTBbits.RB2  //pin 35
        TRISBbits.TRISB2 = 1;
    #define in24V_in_5 PORTBbits.RB3  //pin 36
        TRISBbits.TRISB3 = 1;
    #define in230V_in_4 PORTBbits.RB4  //pin 37
        TRISBbits.TRISB4 = 1;
    #define in230V_in_3 PORTBbits.RB5  //pin 38
        TRISBbits.TRISB5 = 1;
    #define in230V_in_2 PORTBbits.RB6  //pin 39
        TRISBbits.TRISB6 = 1;
    #define in230V_in_1 PORTBbits.RB7  //pin 40
        TRISBbits.TRISB7 = 1;
}

void controlPins()//normales durchrouten
{
    if(in230V_in_1 == 1)//Test bestanden
    {
        out_1_out = 1;
    }
    else
    {
        out_1_out = 0;
    }//----------------------------------
    if(in230V_in_2 == 1)//Test bestanden
    {
        out_2_out = 1;
    }
    else
    {
        out_2_out = 0;
    }//----------------------------------


    if(in230V_in_3 == 1)
    {
        out_3_out = 1;
    }
    else
    {
        out_3_out = 0;
    }//----------------------------------
    if(in230V_in_4 == 1)
    {
        out_4_out = 1;
    }
    else
    {
        out_4_out = 0;
    }//----------------------------------
//#######################################
    if(in24V_in_5 == 1)
    {
        out_1_out = 1;
    }
    else
    {
        out_1_out = 0;
    }//----------------------------------
    if(in24V_in_6 == 1)
    {
        out_2_out = 1;
    }
    else
    {
        out_2_out = 0;
    }//----------------------------------
    if(in24V_in_7 == 1)
    {
        out_3_out = 1;
    }
    else
    {
        out_3_out = 0;
    }//----------------------------------
    if(in24V_in_8 == 1)
    {
        out_4_out = 1;
    }
    else
    {
        out_4_out = 0;
    }//----------------------------------

    (okPin == 1) ? ledErr = 1 : ledErr = 0;//Test bestanden
}

int main(int argc, char** argv) {
    setPins();
    while(1)
    {
        INTF = 0;// Clear Interrupt Flag
        INTE = 0;// Enable external interrupt
        GIE = 0;// Enable Global Interrupt

        controlPins();
    }
    return (0);
}

von chris (Gast)


Lesenswert?

Klares Symptom. Du hast ÖVP nicht deactiviert.

von chris (Gast)


Lesenswert?

Lvp low voltage programming.

von Andreas F. (andreas_fri)


Lesenswert?

Sollte das so funktionieren?
#pragma config1 |= 0b.1001.0000.1101.0100 //Seite 210/212

von Michael (Gast)


Lesenswert?

Watchdog steht falsch.
Warum schreibste nicht direkt TRISB = 255.
Anstatt die alle einzeln auf zu führen. ?

von Frank K. (fchk)


Lesenswert?

Andreas Fri schrieb:

> #pragma ANSEL |= 0b.0000.0000 //ANS7 - 0 Seite 39 //1 = Analog input, 0
> = Digital I/O
> #pragma ANSELH |= 0b.--00.0000 //ANS13 - 8 Seite 39
> #pragma PIE1 |= 0b.0000.0000 //PERIPHERAL INTERRUPT

Das sind SFRs, die Du im main() setzen musst, keine #pragmas.

fchk

von chris (Gast)


Lesenswert?

Du musst mittels hvp LVP ausschalten und ruecklesen ob es ausgeschälten 
ist. Ansonsten nochmal schlau machen wie hvp geht.

von Andreas F. (andreas_fri)


Lesenswert?

Danke für eure Komentare und Hinweise ihr wart mir eine Große Hilfe.

Die Lösung:

vor ANSEL und ANSELH darf kein #pragma stehen
sondern
ANSEL = 0;
ANSELH = 0;

#pragma wird nur für die CONFIG1 & 2 benötigt.


lg
Andreas

von Andreas F. (andreas_fri)


Lesenswert?

Ein kleines Problem bleibt leider noch über.
Am RB3(pin36) bekomme ich kein high signal.
Widerastand ist vorhanden.

Ich glaube, dass bei der Konfiguration ein Fehler vorhanden ist, aber 
wo?


lg
Andreas

von Andreas F. (andreas_fri)


Lesenswert?

meine derzeitige Config

#pragma config1 |= 0b.1100.0000.0000.0100 //Seite 212

in der main:
    ANSEL = 0;//Analogeingänge abschalten
    ANSELH = 0;//Analogeingänge abschalten
    C1ON = 0;//comparator C1 abschalten PIN36
    C2ON = 0;//comparator C2 abschalten PIN36
    INTF = 0;// Clear Interrupt Flag
    INTE = 0;// Enable external interrupt
    GIE = 0;// Enable Global Interrupt
    PIE1 = 0;//Timer1 interupt

von Chris B. (dekatz)


Lesenswert?

Konfiguration?
> #pragma config1 |= 0b.1001.0000.1101.0100

Kann der Compiler keine Symbolischen Namen für die Einzelnen Config-Bits 
auflösen - aus der 0/1-Wurst kann man nichts rauslesen.
Na egal.

RB3 ist auch ein Comperatoreingang. Weiss jetzt nicht ob der mit 
ANSEL/ANSELH auch deaktiviert wird, aber schalte die Comperatoren 
sicheheitshalber aus mit:
CM1CON0 = 0;
CM2CON0 = 0;

(dass hat sich jetzt überschnitten - also hinfällig)....

von Andreas F. (andreas_fri)


Lesenswert?

Hilft leider nicht.
Ich schlte meine 4 Ausgänge ein, jedoch beim drücken des RB3 sind alle 
aus.

meine Config:

#pragma config1 |= 0b.1100.0000.0000.0100 //Seite 212
#pragma config2 |= 0b.1111.1110.1111.1111 //Seite 213

ANSEL = 0;//Analogeingänge abschalten
    ANSELH = 0;//Analogeingänge abschalten
    C1ON = 0;//comparator C1 abschalten PIN36
    C2ON = 0;//comparator C2 abschalten PIN36
    INTF = 0;// Clear Interrupt Flag
    INTE = 0;// Enable external interrupt
    GIE = 0;// Enable Global Interrupt
    PIE1 = 0;//Timer1 interupt
    CM1CON0 = 0;
    CM2CON0 = 0;

von Frank K. (fchk)


Lesenswert?

Siehe Datenblatt DS30292C Kapitel 12 "SPECIAL FEATURES OF THE CPU" und 
dort "REGISTER 12-1: CONFIGURATION WORD (ADDRESS 2007h)" auf Seite 120.

Dieser PIC hat nur ein Config Word. Was Du mit Deinen beiden #pragmas 
konfiguriert hast, ist nicht ersichtlich.

RB3 hat PGM als zweite Funktion, welches den Prozessor in den Low 
Voltage Programming Mode schaltet. Mit Bit 7 im Config Word schaltest Du 
das ab.

Überprüfe nochmal Dein Config Word. Dein Code passt irgendwie nicht zum 
Chip.

fchk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.