salida analógica de la foto 18f4520

3

estoy tratando de generar una señal analógica usando el circuito de foto y dac adjunto Cuando simulo usar Proteus, la señal no hace un ciclo completo. Pensé que la imagen se restablece después de 24 ms, así que hago que el timer0 interrumpa 50u en lugar de 100u, luego la señal se reinicia después de 12us ¿Puede alguien ayudarme en eso? la señal es [vo = 2,5 + 1,5 sin (2 pi 25 t) + 0,5 sen (2 pi 1000 t) ts = 100 nosotros t = 0: 40 ms]

#include"pic18f4520.h"
#pragma config WDT = OFF
unsigned char k = 0;
unsigned char m = 401;
unsigned char signal[] = {128,144,155,156,148,134,120,112,113,124,140,156,167,168,160,146,132,124,125,    136,152,168,178,179,171,
    157,143,135,136,147,163,179,189,190,182,168,154,146,147,157,173,189,199,200,1    92,178,164,155,156,166,
        182,198,208,209,201,186,172,164,164,174,190,206,216,217,208,193,179,170,171,1    81,196,212,222,222,214,
199,184,175,176,186,201,216,226,226,217,203,188,179,179,189,204,219,229,229,220,205,190,180,180,190,
205,220,229,229,220,205,189,180,180,189,204,219,228,228,218,203,187,178,177,186,201,216,225,224,214,
199,183,174,173,182,196,211,220,219,209,193,178,168,167,176,190,204,213,212,202,186,171,160,160,168,
182,196,205,204,194,178,162,152,151,159,173,187,196,195,184,168,152,142,141,149,163,177,185,184,174,
157,141,131,130,138,152,166,174,173,162,146,130,119,118,126,140,154,162,161,150,134,118,107,106,114,
128,142,150,149,138,122,106,95,94,102,116,130,138,137,126,110,94,83,82,90,104,118,126,125,115,
99,82,72,71,79,93,107,115,114,104,88,72,61,60,69,83,97,105,104,94,78,62,52,51,60,
74,88,96,96,85,70,54,44,43,52,66,80,89,88,78,63,47,37,36,45,60,74,83,82,73,
57,42,32,31,40,55,70,79,78,69,53,38,28,28,37,52,67,76,76,67,51,36,27,27,36,
51,66,76,76,66,51,36,27,27,37,52,67,77,77,68,53,39,30,30,40,55,70,80,81,72,
57,42,34,34,44,60,75,85,86,77,63,48,39,40,50,66,82,92,92,84,70,55,47,48,58,
74,90,100,101,92,78,64,56,57,67,83,99,109,110,102,88,74,66,67,77,93,109,120,121,113,
99,85,77,78,88,104,120,131,132,124,110,96,88,89,100,116,132,143,144,136,122,108,100,101,112,128};
//unsigned char signal[] = { 128, 217, 255, 217, 128, 37, 0, 37 };

void InitTimer0()
{
T08BIT = 1;     //8bit mode
T0CS = 0;
PSA = 0;
T0PS2 = 0; T0PS1 = 0; T0PS0 = 1;
TMR0L = 5;
TMR0H    = 0xFC;
TMR0IF = 0;
TMR0ON = 1; 
T0IE = 1;
GIE = 1;


}
void interrupt timer( void )
{
GIE = 0;
if( TMR0IF ){
    TMR0L = 0x17;          ///T=0,02496
    TMR0H    = 0xFC;
    TMR0IF = 0;
   //i?lem 
    k++;
    LATC = signal[k];

    if( k == 401) 
    {TMR0ON = 0;
    LATC = 0;
    }
}
GIE = 1;
}
void main(void)
{
InitTimer0();
TRISC = 0x00;
LATC = signal[k];
while(1){
}
}

    
pregunta user3774003

1 respuesta

1

La variable k es unsigned char , por lo que solo puede contener valores de hasta 255. Idealmente, también debería ser volatile , ya que se usa tanto en main como en interrupt.

Cambie la declaración a volatile unsigned short k = 0; y vea si eso ayuda, similar a m también, así que algo como:

#include"pic18f4520.h"
#pragma config WDT = OFF
volatile unsigned short k = 0;
volatile unsigned short m = 401;
// etc.

En realidad, el código que publicaste no usa m , pero tal vez no sea todo tu código, así que ten cuidado.

Suponiendo que está utilizando el compilador XC8 de Microchip, los tipos de datos compatibles y los rangos se describen en la página 151 de la Guía del usuario del compilador XC8 . Por ejemplo, aquí están las dos tablas relevantes:

Si desea asegurarse de que su código sea portátil, independientemente de los diferentes valores predeterminados del compilador, puede #include <stdint.h> , que define los tipos que identifican específicamente el tamaño. Por ejemplo:

#include <stdint.h>
volatile k uint16_t = 0;    // 16-bit unsigned integer

Otros tipos siguen un patrón similar, por ejemplo, int32_t es un entero con signo de 32 bits, uint8_t es sin signo de 8 bits, etc.

    
respondido por el Roger Rowland

Lea otras preguntas en las etiquetas