PIC16F1704 salida DAC extraña en DAC1OUT2 - parece que otros periféricos cargan el pin hacia abajo

5

Estoy intentando que el DAC del PIC16F1704 funcione, específicamente quiero que salga en el pin RA2 / DAC1OUT2. No hay nada conectado a ese pin, y he reducido el código de prueba a esto:

#define _XTAL_FREQ 4000000
#define FCY 4000000ULL
#include <htc.h>
__CONFIG (FOSC_INTOSC & CP_OFF & MCLRE_OFF & BOREN_OFF & WDTE_OFF);
__CONFIG (PLLEN_OFF & LVP_OFF & ZCDDIS_ON);


void main(void)
{
    WPUA = WPUC = 0;       // disable weak pull-ups
    nWPUEN = 1;
    ZCD1CON = 0;           // disable Zero-cross detect module

    SLRCONA = SLRCONC = 0; // disable slew-rate limiting
    ANSELA = 0xff;         // all analog
    TRISA  = 0b00111111;   // all inputs

    OSCCON = 0b01101011;   // 4 MHz internal oscillator, no PLL

    DAC1CON0 = 0b10010000; // DAC on, Vref+ = Vdd, Vref- = Vss, output on DAC1OUT2
    DAC1CON1 = 0;          // Tap #0: output 0.0V on DAC1OUT2
    while (1) {
        __delay_ms(10);
        DAC1CON1++;
    }
}

Esto debería generar una rampa 0..Vdd en aproximadamente 2.56 segundos, pero en cambio, lo que veo es esto:

MiVddes3.3V.Larampainclinadaeinvertidaesde1.0a0.4V,conunamesetaalrededorde0.8V.

Elproblemapareceestarenesepinenparticular,noenelDACensí.SicambiolaconfiguraciónDACa

DAC1CON0=0b10100000;

Esdecir,lasalidaenDAC1OUT1ensulugar(RA0),puedoleerlarampaenesepin,esperfectamentelinealynoestáinvertida.

ParecequehayalgúnperiféricoqueintentamantenerelpinRA2a0,8voltios,ylohacedeunamaneraextrañaynolineal.

¿Algunaideadequépodríaseresto?Paracompletar,aquíestáelmultiplexadodeestepin:

El circuito de detección de cruce por cero se ajusta bastante bien, pero como puede ver, lo deshabilité explícitamente (el cambio de ZCDDIS_ON a ZCDDIS_OFF no cambia nada).

El compilador es XC8 (1.31 creo) y estoy programando el chip con PicKit2.

    
pregunta anrieff

1 respuesta

5

Como se comentó en los comentarios, sospeché que mi PicKit2 no programaba la parte correctamente, dejando el bit ZCDDIS de Config Word 2 no establecido en el valor correcto de '1' (ZCD controlable por el registro ZCDCON), pero dejado como '0' (ZCD siempre habilitado). Esto coincidió con lo que vimos en el 'alcance'. Después de usar la computadora de un amigo y el programador PicKit3 , verificamos que el mismo chip, tal como está programado con PicKit3, no presenta el problema .

Por lo tanto, es un problema en la cadena de herramientas de mi máquina, probablemente el programador PicKit2, que no admite PIC16F1704 de la caja y tuve que hackear el archivo del dispositivo para admitirlo, así que lo más probable es que arruiné esa parte.

Actualizar

Si alguien tiene curiosidad, esto es lo que realmente estropeé al cortar el archivo de datos del dispositivo:

Estaba usando el editor de archivos de datos del dispositivo PICKit2 para agregar soporte para el dispositivo PIC16F1704. La forma habitual de hacerlo es copiar los parámetros desde un dispositivo similar y luego cambiar las ID de dispositivo y los tamaños de memoria esperados. Lo que no presté atención fueron los campos de ConfigMasks: estos deben establecerse en los bits en los que se implementan las palabras de configuración (y los 0 para los bits que no lo son). Parece que la parte de la que copié mis datos no tenía implementado el bit 7 de CONFIG2, por lo que su bit # 7 respectivo en ConfigMasks [1] era 0, por lo que pk2cmd más tarde no intentó programar este bit para '1', incluso si se especificó como '1' en el archivo HEX. Esto significaba que el ZCD siempre estaba habilitado y no era controlable a través de los registros periféricos.

Lo que ve en esta captura de pantalla son los valores correctos después de una intervención reciente. Como puede ver, ConfigMasks [1] = 0x3F 8 3: mi bit # 7 es '1' ahora. Con estos cambios, el PIC también se programa con éxito y funciona como se espera, incluso si se programa con PicKit2 .

    
respondido por el anrieff

Lea otras preguntas en las etiquetas