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
Ups. Ist nicht bewusst gesetzt. Ändert aber nix am Ergebnis da von ANSELH nur die unteren 4BIT genutzt werden.
:
Bearbeitet durch User
Hallo, hab mal das Datenblatt angeschaut. Hast du möglicherweise das SPI oder/und UART aktiviert? Gruss picfan
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
Falschen Pic eingestellt? Georg Keller schrieb: > Bei den unteren AD Ports geht es wie gewünscht ....
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
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).
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;
Soory, Falsche PIC im kopf gehabt :-( deine TRIS einstellung seht richtig aus. Ist deine TRISA auch definiert?
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
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.
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?
Warum macht das keinen / wenig Sinn? SPI wird nicht verwendet. Ich wollte sicher sein das es def. ist.
:
Bearbeitet durch User
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ß
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.
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
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).
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.