Forum: Mikrocontroller und Digitale Elektronik PIC16F690 AN8 bis AN11 nicht nutzbar


von Georg K. (gkeller)


Angehängte Dateien:

Lesenswert?

Hallo,
ich kämpfe seit einiger zeit mit einem PIC16F690 und den AD Ports AN8 
bis AN11. Ich bekomme die einfach nicht als Analog IN geschaltet. Mit 
den Ports AN0..AN7 geht es ohne Probleme.

Aufgefallen war es mir, als in der Schaltung der AN8 und AN9 einfach 
nicht das erwartete Ergebnis lieferte. Am Pin liegt allerdings die 
analoge Spannung an. Also Verdrahtung ausgeschlossen.

Ich habe dann mal den Simulator bemüht und mir die I/O Pins angesehen. 
Dabei habe ich festgestellt, die stehen anstatt auf Ain immer auf Din.

Nun habe ich ein kleines C Programm geschrieben um das mal zu testen, 
komme aber nicht dahinter. AN8..AN11 müssten doch über ANSELH gesteuert 
werden. Egal was ich da eintrage, nix ändert sich. Bei den unteren AD 
Ports geht es wie gewünscht ....

Hier der C-Code:
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>                             //Use this to include the 
device header for your PIC.

#define _XTAL_FREQ 8000000
#pragma config FOSC=INTRCIO, WDTE=OFF, PWRTE=OFF, MCLRE=ON, BOREN=OFF, 
IESO=OFF, FCMEN=OFF
/*
 *
 */
volatile unsigned int uart_data;
int main(int argc, char** argv) {
//
//    Basic Setup der HW
//
    ANSEL   = 0b11111111;
    ANSELH  = 0b10001111;
    PORTA   = 0;
    PORTB   = 0;
    PORTC   = 0;
    TRISC   = 0b11111111;
    TRISB   = 0b00110000;

    ADCON0bits.CHS0     = 0;
    ADCON0bits.CHS1     = 0;
    ADCON0bits.CHS2     = 0;
    ADCON0bits.CHS3     = 1;
    while(1) {
        __delay_ms(1000);
    }
    return (EXIT_SUCCESS);
}

Hat jemand eine Idee oder weiß was ich falsch mache?
Vielen Dank, Georg

von Frank K. (fchk)


Lesenswert?

Georg Keller schrieb:

>     ANSELH  = 0b10001111;

Warum ist Bit 7 gesetzt?

fchk

von Georg K. (gkeller)


Lesenswert?

Ups. Ist nicht bewusst gesetzt. Ändert aber nix am Ergebnis da von 
ANSELH nur die unteren 4BIT genutzt werden.

: Bearbeitet durch User
von Jochen-paul S. (picfan)


Lesenswert?

Hallo,
hab mal das Datenblatt angeschaut. Hast du möglicherweise das SPI 
oder/und UART aktiviert?
Gruss picfan

von Georg K. (gkeller)


Lesenswert?

Hallo,
Hab ich auch schon vermutet. In der minimalen config habe ich es nicht 
verwendet bzw. nicht bewusst gesetzt.

Im Datenblatt habe ich keine weiteren Register gefunden die gesetzt 
werden müssten.

Viele Grüße Georg

: Bearbeitet durch User
von X4U (Gast)


Lesenswert?

Falschen Pic eingestellt?

Georg Keller schrieb:
> Bei den unteren AD Ports geht es wie gewünscht ....

von Georg K. (gkeller)


Lesenswert?

Hallo,
Der eingestellte Typ ist korrekt, hab ich mehrfach geprüft.

Gibt es jemanden, der es schon einmal mit einem 16F690 gemacht hat und 
einen der AD Ports die mit dem ANSELH Register selektiert werden zum 
laufen brachte?

Gruß Georg

von X4U (Gast)


Lesenswert?

Sieht alles gut und richtig aus.

Zeig doch mal den Rest vom Code (wo das Adresult gelesen wird).

Versuchsweise mal einen der Eingänge mit einen der funzt Brücken. Die 
müssen dann ja das gleiche Ergebnis haben (sonst Hardware böse).

von castlerock (Gast)


Lesenswert?

Deine Tristate ist leider inkorrekt. Die Analog Eingängen müssen als 
EINGANG definiert sein.

FALSCH:
    TRISC   = 0b11111111;
    TRISB   = 0b00110000;

RICHTIG:
    TRISC   = 0b11111111;
    TRISB   = 0b00111111;

von castlerock (Gast)


Lesenswert?

Soory, Falsche PIC im kopf gehabt :-(
deine TRIS einstellung seht richtig aus.

Ist deine TRISA auch definiert?

von Georg K. (gkeller)


Angehängte Dateien:

Lesenswert?

Hallo,

so ich poste jetzt mal das Programm - zumindest die relevanten Teile:

Im Simulator habe ich den Breakpoint auf die "for 
(kanal=0;kanal<=3;kanal++) {" Zeile gesetzt und dann ist der PORT Status 
wie im Screenshot angehängt.

Vielleicht hilft das ....
Vielen Dank für die Mithilfe, Georg

Hier das Hauptprogramm:
1
/*
2
 * File:   main.c
3
 * Author: gkeller
4
 *
5
 * Created on 23. März 2015, 00:55
6
 * Notice:      
7
 *              
8
 *              Ausgabe des 10 A/D Wandler Wetes im Dezimalformat auf die RS232
9
 */
10
11
#include <stdio.h>
12
#include <stdlib.h>
13
#include <math.h>                           
14
#include <xc.h>                             
15
16
#define _XTAL_FREQ 8000000
17
#pragma config FOSC=INTRCIO, WDTE=OFF, PWRTE=OFF, MCLRE=ON, BOREN=OFF, IESO=OFF, FCMEN=OFF
18
19
// Globals
20
volatile unsigned int uart_data;            // use 'volatile' qualifer as this is changed in ISR
21
22
23
int main(int argc, char** argv) {
24
//
25
//    deklaration von Funktionen
26
//    
27
    void Hardware_basic_init (void);
28
    void Hardware_porta_test (void);
29
    void Hardware_portc_test (void);
30
    void uart_xmit(unsigned int mydata_byte);
31
    void uart_xmit_logo(void);
32
    void Hardware_setup_Ports (void);
33
    void Hardware_setup_RS232 (void);
34
    void ADC_SC1_select(unsigned char);
35
    float ADC_get_value(unsigned char ADC_channel);
36
37
//
38
//    Hauptprogramm
39
//
40
     int i;                                     // Variable für Schleifen
41
     unsigned char kanal = 0;
42
     
43
44
//
45
//     Hier sind die Variablen für die AD Wandler Steuerung definiert
46
//
47
     char * ADCfloat_value_text;
48
     char * RS232_int_value;
49
     float AKKU_min = 10.5;
50
     float AKKU_max = 14.4;
51
     float ADCfloat_wert;
52
53
//
54
//     Flag das die Ladung aktiviert ist und das Laderelais geschaltet hat
55
//
56
     unsigned int charge;
57
     charge = 0;
58
59
60
//
61
//     Flag das der Akku auf die Last geschaltet ist
62
//
63
     unsigned int DCPower;
64
     DCPower = 0;
65
66
//
67
//     Variablen zur Steuerung des Ladeverhaltens
68
//
69
     int tmp;
70
     unsigned int hysterese = 0;
71
     unsigned int hysterese_zaehler = 50;
72
73
//
74
//     Initialisiere die weitere Hardware
75
//
76
        Hardware_basic_init();
77
        Hardware_setup_RS232();
78
        Hardware_setup_Ports();
79
80
        uart_xmit_logo();
81
82
        while (1) {
83
84
         Hardware_portc_test();
85
         Hardware_porta_test();
86
87
//
88
//         Frage die 4 AD Kanäle ab und gib den Wert auf der RS232 aus
89
//
90
         for (kanal=0;kanal<=3;kanal++) {
91
92
             ADCfloat_value_text = ftoa(ADC_get_value(kanal),&tmp);
93
94
            i = 0;
95
            while (i <= 3) { // wie viele Dezimalstellen hat der 10 Bit Wert?
96
                uart_xmit(ADCfloat_value_text[i]);
97
                i++;
98
            }
99
            //
100
            //            Ausgabe des Wertes an der RS232
101
            //
102
            uart_xmit(' ');
103
            uart_xmit('V');
104
            uart_xmit(':');
105
            uart_xmit(kanal + 48); // ASCII "0" = DEZIMAL 48
106
107
            uart_xmit(13); // CR
108
            uart_xmit(10); // LF
109
         }
110
            uart_xmit(13); // CR
111
            uart_xmit(10); //
112
            __delay_ms(2000);
113
     }
114
    return (0);
115
}

und hier das File mit den HW Setup Routinen
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <math.h>                           // Use this for TRUNC ...
4
#include <xc.h>                             //Use this to include the device header for your PIC.
5
#define _XTAL_FREQ 8000000
6
7
void Hardware_setup_RS232 (void) {
8
    //*************************************************************************************
9
    // Set up the UART
10
    // Note: See the datasheet for tables with the values of SPBRGH:SPBRGL already
11
    // calculated based on different values of Fosc and BRGH and desired
12
    // baud rates.
13
    //*************************************************************************************
14
    TXSTAbits.BRGH=0;                           // select low speed Baud Rate (see baud rate calcs below)
15
    TXSTAbits.TX9=0;                            // select 8 data bits
16
    TXSTAbits.TXEN = 1;                         // enable transmit
17
    RCSTAbits.SPEN=1;                           // serial port is enabled
18
    RCSTAbits.RX9=0;                            // select 8 data bits
19
    RCSTAbits.CREN=1;                           // receive enabled
20
21
    // calculate values of SPBRGL and SPBRGH based on the desired baud rate
22
    //
23
    // For 8 bit Async mode with BRGH=0: Desired Baud rate = Fosc/64([SPBRGH:SPBRGL]+1)
24
    // For 8 bit Async mode with BRGH=1: Desired Baud rate = Fosc/16([SPBRGH:SPBRGL]+1)
25
26
    // For our example,we will use BRGH=0,Fosc=16Mhz and we want baud rate=9600
27
    //
28
    //  9600 = Fosc/64([SPBRGH:SPBRGL]+1)
29
    //  9600 = Fosc/64(X+1)
30
    //  9600 = Fosc/64X + 64
31
    //  9600(64X + 64) = Fosc
32
    //  X = [Fosc/(9600)(64)]-1
33
    //  X = [16000000/(9600)(64)] -1
34
    //  X = SPBRGH:SPBRGL = 25.01 (round to 25)
35
36
    SPBRG=25;                                   // here is calculated value of SPBRGH and SPBRGL
37
    SPBRGH=0;
38
39
    PIR1bits.RCIF=0;                            // make sure receive interrupt flag is clear
40
    PIE1bits.RCIE=1;                            // enable UART Receive interrupt
41
    INTCONbits.PEIE = 1;                        // Enable peripheral interrupt
42
    INTCONbits.GIE = 1;                         // enable global interrupt
43
44
    __delay_ms(50);                            // give time for voltage levels on board to settle
45
}
46
47
void Hardware_setup_Ports (void) {
48
//
49
//    Hier werden die Ports initialisiert Digital I/O und AD
50
//
51
//
52
//    All IO-Ports set to Digital I/O per Default mit Deafult Wert = 0
53
//
54
    PORTA   = 0;
55
    PORTB   = 0;
56
    PORTC   = 0;
57
    ANSELH  = 0;
58
    ANSEL   = 0;
59
//
60
//    Setup der Ausgänge
61
//
62
63
64
//    Relais für Ladestrom und DC Verbraucher
65
    TRISAbits.TRISA4    = 0;
66
    TRISAbits.TRISA5    = 0;
67
68
//    Status LEDs
69
    TRISCbits.TRISC0    = 0;
70
    TRISCbits.TRISC1    = 0;
71
72
//    AD-Wandler
73
//    Generelle CONFIG
74
//
75
     TRISC   = 0b11001100;                       // AN9,AN8,AN7,AN6 auf analog IN
76
     ANSEL   = 0b11000000;
77
     ANSELH  = 0b00001111;
78
//    Set A/D Conversion Clock to Fosc/16
79
     ADCON1bits.ADCS = 6;
80
//    Enable A/D Converter
81
     ADCON0bits.ADON = 1;
82
//        Voltage Reference set to VDD
83
//        eine Einheit = 5V / 1024 = 0,0048828125V
84
     ADCON0bits.VCFG = 0;
85
//    Set to right formatted
86
     ADCON0bits.ADFM = 1;
87
}
88
89
void Hardware_basic_init (void) {
90
//
91
//    Basic Setup der HW
92
//
93
    OSCCON  = 0b011100000;
94
    ANSEL   = 0b11000000;
95
    ANSELH  = 0b00001111;
96
    PORTA   = 0;
97
    PORTB   = 0;
98
    PORTC   = 0;
99
    TRISA   = 0b00000000;
100
    TRISB   = 0b11111111;
101
    TRISC   = 0b11001100;                       // AN9,AN8,AN7,AN6 auf analog IN
102
103
    INTCON  = 0b00000000;                       // Disable all Interrupts
104
    PIE1    = 0b00000000;                       // Disable all PERIPHERAL Interrupts
105
}
106
107
void Hardware_portc_test (void) {
108
//
109
//    Basic Setup der HW
110
//
111
    PORTC   = 0;
112
    __delay_ms(500);
113
114
    PORTCbits.RC0   = 1;
115
    __delay_ms(500);
116
    PORTCbits.RC1   = 1;
117
    __delay_ms(500);
118
    PORTCbits.RC4   = 1;
119
    __delay_ms(500);
120
    PORTCbits.RC5   = 1;
121
}
122
123
void Hardware_porta_test (void) {
124
//
125
//    Basic Setup der HW
126
//
127
    PORTA   = 0;
128
    __delay_ms(500);
129
130
    PORTAbits.RA4   = 1;
131
    __delay_ms(500);
132
    PORTAbits.RA5   = 1;
133
}

und hier die RS232 Teile
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <math.h>                          
4
#include <xc.h>                             
5
#define _XTAL_FREQ 8000000
6
7
//*************************************************************************************
8
// Interrupt Service Routine
9
// Check uart receive bit and if it is what caused the interrupt, turn LED on and
10
// read the data from the uart receive buffer.
11
// Note there is only one ISR to handle all interrupts so you need to determine
12
// what caused the interrupt before taking action.
13
//*************************************************************************************
14
//void interrupt ISR() {
15
//
16
//    if (PIR1bits.RCIF)          // see if interrupt caused by incoming data
17
//    {
18
//        uart_data = RCREG;     // read the incoming data
19
//        //IncomingData_LED = 1;   // set LED to indidate byte has been received
20
//        PIR1bits.RCIF = 0;      // clear interrupt flag
21
//    }
22
//}
23
24
25
26
//*************************************************************************************
27
// Send one byte via UART
28
// RB7 = TX
29
// RB5 = RX
30
//*************************************************************************************
31
32
void uart_xmit(unsigned int mydata_byte) {
33
//
34
//            Ausgabe eines Zeichens auf der RS232
35
//
36
    while(!TXSTAbits.TRMT);    // make sure buffer full bit is high before transmitting
37
    TXREG = mydata_byte;       // transmit data
38
}
39
40
void uart_xmit_logo(void) {
41
//
42
//            Ausgabe des initialen Logos / Startup Message
43
//
44
    uart_xmit('S');                             
45
    uart_xmit('T');
46
    uart_xmit('A');
47
    uart_xmit('R');
48
    uart_xmit('T');
49
    uart_xmit(13);                              // CR
50
    uart_xmit(10);                              // LF
51
}
und hier die AD Routinen
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <math.h>                           
4
#include <xc.h>                             //Use this to include the device header for your PIC.
5
#define _XTAL_FREQ 8000000
6
7
void ADC_format_enable(void) {
8
//
9
//    SET Format (Left, Right)
10
//    Enable AD Converter
11
//
12
        ADCON0bits.ADFM = 1;
13
        ADCON0bits.ADON = 1;
14
        __delay_ms(10);
15
}
16
17
void ADC_clock_ref () {
18
//
19
//      Set ADC Clock and Reference Voltage
20
//
21
        ADCON1bits.ADCS = 6;
22
        ADCON0bits.VCFG = 0;
23
}
24
25
void ADC_SC1_select(unsigned char ADC_channel) {
26
//
27
//            Auswählen des AD Kanals
28
//
29
//            Kanal 0 = Akkuspannung
30
            if (ADC_channel == 0) {
31
                ADCON0bits.CHS0 = 1;                        // Channel Select Bit
32
                ADCON0bits.CHS1 = 0;                        // Channel Select Bit
33
                ADCON0bits.CHS2 = 0;                        // Channel Select Bit
34
                ADCON0bits.CHS3 = 1;                        // Channel Select Bit
35
            }
36
37
//            Kanal 1 = Solar panel
38
            if (ADC_channel == 1) {
39
                ADCON0bits.CHS0 = 0;                        // Channel Select Bit
40
                ADCON0bits.CHS1 = 0;                        // Channel Select Bit
41
                ADCON0bits.CHS2 = 0;                        // Channel Select Bit
42
                ADCON0bits.CHS3 = 1;                        // Channel Select Bit
43
            }
44
45
//            Kanal 2 = DC-OUT
46
             if (ADC_channel == 2) {
47
                ADCON0bits.CHS0 = 1;                        // Channel Select Bit
48
                ADCON0bits.CHS1 = 1;                        // Channel Select Bit
49
                ADCON0bits.CHS2 = 1;                        // Channel Select Bit
50
                ADCON0bits.CHS3 = 0;                        // Channel Select Bit
51
            }
52
53
//            Kanal 3 = SOLAR #2
54
            if (ADC_channel == 3) {
55
                ADCON0bits.CHS0 = 0;                        // Channel Select Bit
56
                ADCON0bits.CHS1 = 1;                        // Channel Select Bit
57
                ADCON0bits.CHS2 = 1;                        // Channel Select Bit
58
                ADCON0bits.CHS3 = 0;                        // Channel Select Bit
59
            }
60
//
61
//            Setze das Ausgabeformat und schalte den ADC ein
62
//
63
            ADC_format_enable();
64
}
65
66
float ADC_get_value(unsigned char ADC_channel) {
67
//
68
//            Messung des AD Wertes und Rückgabe eines Float Wertes mit 2 Nachkommastellen
69
//
70
        int i                       = 0;
71
        int samples                 = 0;
72
        long ADC_value              = 0;
73
        int zahl                    = 0;
74
        float ADCfloat_wert         = 0;
75
        float ADC_step              = 0.0048828125;
76
        float ADC_factor            = 4;
77
78
79
            ADC_SC1_select(ADC_channel);
80
            PIE1bits.SSPIE          = 0;
81
            PIE1bits.ADIE           = 0;
82
83
//            for (i=0;i<=samples;i++) {
84
//            while (i <= ADC_samples) {
85
//            Bevor die Messung stattfindet muss ein Delay eingebaut sein. Das ist
86
//            notwendig nach einem Channel select
87
                __delay_ms(5);
88
//            Das GO_nDONE Bit muss gesetzt werden, danach startet der ADC die Messung
89
//            Danach solange warten und die Status Bits abfragen
90
                ADCON0bits.GO_nDONE = 1;                // Start a Conversation
91
//
92
//            warte bis im ADCON0 das ADIF gesetzt und Go_nDONE gelöscht ist
93
//                while ((PIR1bits.ADIF == 0) && (ADCON0bits.GO_nDONE == 1)) {
94
                while (ADCON0bits.GO_nDONE == 1) {
95
                    __delay_us(10);
96
                // nop;
97
                // warte bis Messung abgeschlossen ist
98
                }
99
100
                //
101
//            Schalte den AD Converter aus
102
//
103
            ADCON0bits.ADON = 0;
104
105
//
106
//            Berechne den gemessenen Wert
107
//
108
                ADC_value = (ADC_value + (ADRESL + (ADRESH * 256)));
109
110
111
                //
112
//        Kalkuliere den Mittelwert der Samples
113
//        Das Ergebnis muss eine Wert im Bereich int sein (32756)
114
//
115
//            ADC_value = (ADC_value / samples);
116
//            ADC_value       = ADRESL ;
117
//            ADC_value = (ADC_value + (ADRESL + (ADRESH * 256)));
118
//
119
//        Konvertiere die Zahl in einen String
120
//
121
//
122
//        1. Wandle den Messwert in eine Zahl mit genau 2 Nachkommastellen um
123
//
124
            ADCfloat_wert = ADC_value * ADC_step * ADC_factor;
125
            zahl = ADCfloat_wert * 10;
126
            ADCfloat_wert = zahl / 10.0;
127
128
            return(ADCfloat_wert);
129
//            return(10.1);
130
}

: Bearbeitet durch User
von castlerock (Gast)


Lesenswert?

Unabhängig von deine Kanal-problem (oder auch nicht) ist deine ADC 
benützung etwas unkonventionell.

Standard wäre:
Init:
 I/O pins einstellen.
 ADC einstellen/konfigurieren
 ADC einschalten und an LASSEN.

in main:
 CH selektieren.
 (kurz warten: <100us)
 GO setzen
 auf /DONE warten.
 Werte aus ADRES lesen.


In deine software wird die I/O pins und ADC register überall eingestellt 
bzw. geändert.  Und der ADC wird ständig ein- bzw. ausgeschaltet.
Macht mann normalerweise nicht.  (über deine übermässige benützung von 
delays fange ich am besten nicht an).

Viel glück noch.

von Chris B. (dekatz)


Lesenswert?

Das hier in < float ADC_get_value(unsigned char ADC_channel) > macht 
auch wenig Sinn:
>             PIE1bits.SSPIE          = 0;

Wird SPI irgendwo verwendet? Oder sollte an der Stelle etwas anderes 
stehen?

von Georg K. (gkeller)


Lesenswert?

Warum macht das keinen / wenig Sinn?
SPI wird nicht verwendet. Ich wollte sicher sein das es def. ist.

: Bearbeitet durch User
von Stephan (Gast)


Lesenswert?

dies erklärt nicht warum es ab AN8 nicht geht, Folgendes fällt mir aber 
auf:

1)
Das Pragma FOSC=INTRCIO sollte beim 16F690 lt. Datenblatt eigentlich 
INTOSCIO heißen, oder ist INTRCIO im device file identisch definiert? 
Oer nochmal gefragt: Richtiges device file ausgewählt?

2)
In "Hardware_basic_init" hat die Zuweisung zu OSCCON ein Bit zuviel. Wer 
weiß was das anrichtet...

    OSCCON  = 0b011100000;

Gruß

von X4U (Gast)


Lesenswert?

Georg Keller schrieb:
> so ich poste jetzt mal das Programm - zumindest die relevanten Teile:

Da schlage ich ein systematisches herangehen vor, erst einmal 
eingrenzen.

Nimm nur die Teile die du brauchst und probiere es damit.

In Pseudocode:

1. µP konfigurieren
2. A/D konfigurieren
3. Kanal einstellen
4. Wandlung starten
5. Wandlungszeit abwarten.
6. Ergebnis lesen
7. An den Uart senden.

Bei dieser Herangehensweise entsteht über kurz oder lang ein getestetes 
Gerüst der Grundfunktionen. Die erweiterst du dann mit deinen 
Funktionen.

von Georg K. (gkeller)


Lesenswert?

Hallo,

hmmm, jetzt habe ich viele Hinweise bekommen und habe wohl erst noch ein 
wenig zu tun mit der Aufarbeitung. Zuerst einmal Danke an alle die sich 
die Zeit genommen haben hier bei meinem Problem zu helfen.

Als Feedback möchte ich noch den Hinweis aus dem Microchip Forum mit 
geben, hier schreibt mir jemand das die IO-PIN Simulation im MPLABx für 
den 16F690 defekt ist - ups. Er hat es auf dem Demo Board nachgestellt 
und hat im Assembler die Ports wie gewünscht ansprechen können. 
http://www.microchip.com/forums/tm.aspx?tree=true&m=866212&mpage=1

Für mich ist es gut und schlecht ;-) Jetzt weiß ich das es vermutlich 
doch geht, weiß auch das ich generell und grundsätzlich nichts falsch 
mache. Schlecht ist, auf meiner HW geht AN8..AN11 nicht, obwohl am Pin 
AN8 die analoge Spannung anliegt.

Vielleicht werde ich es noch mit einem anderen uC testen (16F1829) der 
auch so noch ein paar Vorteile für mein Vorhaben mit sich bringt und 
dann auch die hier angemerkten Punkte in der Software berücksichtigen.

Viele Grüße,
Georg

von X4U (Gast)


Lesenswert?

Georg Keller schrieb:
> Als Feedback möchte ich noch den Hinweis aus dem Microchip Forum mit
> geben, hier schreibt mir jemand das die IO-PIN Simulation im MPLABx für
> den 16F690 defekt ist

Wundert mich bei Mplab gar nicht. Die Idee alle Produkte einer Firma 
unter einer Haube zu verwursten halte ich schlicht für falsch.

Nach meiner Erfahrung läuft das z.B. bei MikroE Compilern (bin weder 
verwandt noch verschwägert) deutlich besser. Unter anderem weil da eine 
Produktreihe auch eine IDE hat.

> Vielleicht werde ich es noch mit einem anderen uC testen
Sollten Indizien darauf hinweisen das evtl. Probleme vor dem Monitor 
sitzen könnten ist es besser diese als erstes zu lösen. Zumal der ganze 
Aufbau schon vorhanden ist.

Isoliere das Problem wie oben beschrieben. Wenn es dann immer noch nicht 
funzt liegt es evtl. an was anderem als dem TE. Den Chip gibt es schon 
länger, in den Erratas steht auch nichts in der Richtung und so ein 
Fehler wäre aufgefallen (zumindest jedem außerhalb der MPlAB Abteilung 
bei Microchip).

von Stephan (Gast)


Lesenswert?

X4U schrieb:
> Den Chip gibt es schon
> länger, in den Erratas steht auch nichts in der Richtung und so ein
> Fehler wäre aufgefallen

Das sehe ich genauso. Die analogen Ports beim 16f690 funktionieren auch 
anstandslos -habe u.a. in einem Projekt mal AN10 verwendet, kann das 
also grundsätzlich bestätigen.
Auch wenn ich das in Assembler gemacht habe im Prinzip genauso 
konfiguriert wie hier gezeigt.
Ich würde mal vermuten, dass der Fehler irgendwo anders im Quelltext 
steckt, also woanders TRIS oder ANSEL überschrieben wird.

von Georg K. (gkeller)


Lesenswert?

Hallo,
ich kann die positive Rückmeldung geben, die Lösung ist gefunden.

Der Controller ist kaputt.

Ich habe einfach einmal auf Verdacht den Chip gewechselt und siehe da 
auf einmal klappt alles. Warum und wieso und was denn nun genau auf dem 
Ding kaputt ist weiß ich nicht aber der neue Baustein tut genau das was 
er soll.

Da haben mir zwei Faktoren aber einen gewaltigen Streich gespielt. Zum 
einen der kaputte Controller und zum anderen der Simulator, der einen 
ähnlichen bug hat.

Dann kann es mit der Programmierung jetzt entsprechend weitergehen. An 
dieser Stelle noch einmal vielen Dank an alle die geholfen haben.

Gruß, Georg

von Jochen-paul S. (picfan)


Lesenswert?

hallo
freut mich für Dich, dass es nun geklappt hat. Hatte mit einem anderen 
PIC auch enorm Zeit verloren, bis ich endlich gemerkt hatte dass der 
Simulator von MPPLAB nicht das machte was er sollte.
Falls die Spannungsquelle niederohmig war, die Du mit den drei 
Problem-Eingängen messen wolltest und die PORT's als Ausgänge geschaltet 
waren, hätte dies womöglich die jeweiligen PORT's beschädigt...
freundliche Grüsse Jochen-Paul

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.