Autor Tema: dsPIC Curso Basico con C30  (Leído 349895 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: dsPIC Curso Basico con C30
« Respuesta #120 en: 01 de Abril de 2008, 13:13:59 »
Pero el como programar el TRISB que en ensamblador es muy facil por ejemplo aquí no te dice ni los manuales de C ni los de C30 como hacerlo, y de la misma forma el resto de registros del dsPIC, las cosas mas elementales entre el asm y el C30 las omite, ya no de C que si que entiendo bastante

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: dsPIC Curso Basico con C30
« Respuesta #121 en: 01 de Abril de 2008, 20:15:39 »
En ese caso ... bajar un ejemplo de los muchos que hay en microchip y aplicarle ingenieria inversa!

Saludos!
Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #122 en: 02 de Abril de 2008, 02:48:42 »
Hola, El Family Reference Manual te da la función de los registros de cada módulo, por ejm te da la función de cada bit del registro T1CON, para escribirlo en el C30 lo puedes hacer asi:

T1CON=0x1234;
o si quieres modificar un solo bit sería:
T1CONbits.TON=1;

De donde viene este formato, abre el archivo p30F4011.h si usas el 4011, y veras que hay un monton de estructuras, cada una representa un módulo y cada una tiene un nombre, también están los "defines", chequea eso.

saludos
control de movimiento

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: dsPIC Curso Basico con C30
« Respuesta #123 en: 04 de Abril de 2008, 06:10:26 »
Se puede definir una array de 3 bis en lugar de 3 bytes???, he creado una variable de 8bits y de ahí quiero meter los bits 0, 1 y 2 en un registro de 16bits en las posiciones 7, 6 y 5 y no se como hacerlo, ¿hay alguna forma?

Desconectado Sispic

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
Re: dsPIC Curso Basico con C30
« Respuesta #124 en: 04 de Abril de 2008, 13:47:57 »
Puedes plantearlo asi por ejemplo :

Código: C
  1. __extension__ typedef struct {
  2.   union {
  3.     struct {
  4.       unsigned char   bit0:1;
  5.       unsigned char   bit1:1;
  6.       unsigned char   bit2:1;
  7.       unsigned char   bit3:1;
  8.       unsigned char   bit4:1;
  9.       unsigned char   bit5:1;
  10.       unsigned char   bit6:1;
  11.       unsigned char   bit7:1;
  12.     };
  13.     struct {
  14.       unsigned char  byte;
  15.     };
  16.   };
  17. } Mi_Byte;
  18.  
  19.  
  20. __extension__ typedef struct {
  21.   union {
  22.     struct {
  23.       unsigned char   bit0:1;
  24.       unsigned char   bit1:1;
  25.       unsigned char   bit2:1;
  26.       unsigned char   bit3:1;
  27.       unsigned char   bit4:1;
  28.       unsigned char   bit5:1;
  29.       unsigned char   bit6:1;
  30.       unsigned char   bit7:1;
  31.       unsigned char   bit8:1;
  32.       unsigned char   bit9:1;
  33.       unsigned char   bit10:1;
  34.       unsigned char   bit11:1;
  35.       unsigned char   bit12:1;
  36.       unsigned char   bit13:1;
  37.       unsigned char   bit14:1;
  38.       unsigned char   bit15:1;
  39.  
  40.     };
  41.     struct {
  42.       unsigned char  byte0;
  43.       unsigned char  byte1;
  44.     };
  45.     struct {
  46.       unsigned int  word;
  47.     };
  48.   };
  49. } Mi_Word;

Y ya haces lo que quieres .

Código: C
  1. int main(void){
  2.  
  3.    Mi_Byte a;     Mi_Word b;
  4.  
  5.      b.bit0 = a.bit3;
  6.      b.bit13 = a.bit4;
  7.     a.byte = b.byte0;  
  8.  
  9. }

Creo NO se pueden crear arrays de 1 bit con c30 , yo jugaria con las estructuras o sacrificarlo con bytes


Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: dsPIC Curso Basico con C30
« Respuesta #125 en: 08 de Abril de 2008, 06:56:03 »
y cuando defines una variable, por ejempo, ¿no se puede hacer esto?:

unsigned char aux;
aux.bit3 = 1;
TRISB.bit8= aux.bit0;



Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #126 en: 08 de Abril de 2008, 07:29:50 »
No, con un char no se puede, salvo que asignes su contenido a una estructura como la que te propone el maestro.

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: dsPIC Curso Basico con C30
« Respuesta #127 en: 08 de Abril de 2008, 07:52:14 »
He incluido en el "p30f4013.h" estas lineas:

/*Registro auxiliar REG_AUX*/
typedef struct {
      unsigned char   bit0:1;
                unsigned char   bit1:1;
      unsigned char   bit2:1;
      unsigned char   bit3:1;
      unsigned char   bit4:1;
                unsigned char   bit5:1;
      unsigned char   bit6:1;
                unsigned char   bit7:1;
      unsigned char   bit8:1;
      unsigned char   bit9:1;
                unsigned char   bit10:1;
                unsigned char   bit11:1;
                unsigned char   bit12:1;
                unsigned char   bit13:1;
                unsigned char   bit14:1;
                unsigned char   bit15:1;
      } Mi_Word;
      
extern volatile Mi_Word REG_AUX __attribute__((__sfr__));



y luego en el main.c, mi programa, pongo esta linea:
REG_AUX.bit0 = 1;

y al hacer build all me dice:
undefined reference to `REG_AUX'
Link step failed.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: dsPIC Curso Basico con C30
« Respuesta #128 en: 18 de Julio de 2008, 15:15:50 »
Hola

Estoy empezando con el dspic30f4011. Uso mplab 8.0 y el compilador c30. Estoy compilando un ejemplo levemente modificado del libro Diseño práctico de aplicaciones de Angulo. Para configurar las entradas y salidas uso el Visual Initializer.

Configuro...

Port B - RB0, RB1 y RB2 como salidas
Oscillator - Fosc 4MHz, primary oscillator xt mode
16 bit timer 1 - Enable on startup, prescale 1:256, desired time period 1000ms, actual time period 0.001000ms (creo que aquí está el problema)
Interrupts and flags configuration - Enabled ints T1, priority 4

El programa principal es...

Código: [Seleccionar]
#include "p30f4011.h"

/*
RB0 verde
RB1 ámbar
RB2 amarillo
*/

void __attribute__((__interrupt__)) _T1Interrupt(void)
{
IFS0bits.T1IF=0; //borra flag de interrupción
if(PORTBbits.RB0==1) //rojo
PORTB=2; //prende ámbar
if(PORTBbits.RB1==1) //ámbar
PORTB=4; //prende verde
if(PORTBbits.RB2==1) //verde
PORTB=1; //prende rojo
}


int main()
{
VisualInitialization(); //usa lo configurado en el VI

PORTB=1; //valor inicial

while(1)
asm("clrwdt"); //borra watchdog

return 0;
}

Compilo y todo sale bien, a excepción de una advertencia  :x

Código: [Seleccionar]
Clean: Deleting intermediary and output files.
Clean: Deleted file "D:\santiago\PICs\programas\dspic semaforo\init_dsPIC30F4011.o".
Clean: Deleted file "D:\santiago\PICs\programas\dspic semaforo\semaforo.o".
Clean: Deleted file "D:\santiago\PICs\programas\dspic semaforo\dspic adc.cof".
Clean: Deleted file "D:\santiago\PICs\programas\dspic semaforo\dspic adc.hex".
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F4011 -c "Generated Files\VDIInit\init_dsPIC30F4011.s" -o"init_dsPIC30F4011.o" -Wa,-g
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F4011 -x c -c   "semaforo.c" -o"semaforo.o" -g -Wall
semaforo.c: In function '_T1Interrupt':
semaforo.c:10: warning:  PSV model not specified for '_T1Interrupt';
   assuming 'auto_psv' this may affect latency
semaforo.c: In function 'main':
semaforo.c:23: warning: implicit declaration of function 'VisualInitialization'
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F4011 "init_dsPIC30F4011.o" "semaforo.o" -o"dspic adc.cof" -Wl,-L"C:\Archivos de programa\Microchip\MPLAB C30\lib",-Tp30F4011.gld,-Map="dspic adc.map",--report-mem


Program Memory Usage

section                    address   length (PC units)   length (bytes) (dec)
-------                    -------   -----------------   --------------------
.reset                           0                 0x4             0x6  (6)
.ivt                           0x4                0x7c            0xba  (186)
.aivt                         0x84                0x7c            0xba  (186)
.text                        0x100               0x13a           0x1d7  (471)
.dinit                       0x23a                 0x2             0x3  (3)
.isr                         0x23c                 0x2             0x3  (3)
__FOSC                    0xf80000                 0x2             0x3  (3)
__FWDT                    0xf80002                 0x2             0x3  (3)
__FBORPOR                 0xf80004                 0x2             0x3  (3)

                     Total program memory used (bytes):          0x360  (864) 1%


Data Memory Usage

section                    address      alignment gaps    total length  (dec)
-------                    -------      --------------    -------------------

                        Total data memory used (bytes):              0  (0)


Dynamic Memory Usage

region                     address                      maximum length  (dec)
------                     -------                      ---------------------
heap                             0                                   0  (0)
stack                        0x800                               0x800  (2048)

                        Maximum dynamic memory (bytes):          0x800  (2048)

Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-bin2hex.exe" "D:\santiago\PICs\programas\dspic semaforo\dspic adc.cof"
Loaded D:\santiago\PICs\programas\dspic semaforo\dspic adc.cof.
BUILD SUCCEEDED: Fri Jul 18 13:12:03 2008


Conecto el dspic con su cristal de 4MHz, sus capacitores; los leds con sus resistencias; mclr a 5V; y todos los vdd, vss, avdd y avss con sus voltajes respectivos.

¿Qué hace el dspic? Solo se queda en la parte del while(1) y aparentemente no entra a la interrupción del timer 1, es decir no cambian las salidas RB1 ni RB2, solo se queda encendido RB0.

¿Qué me sugieren? Está raro el problema, pero como soy nuevo ya se me acabaron las ideas  :D

Gracias  :)
« Última modificación: 18 de Julio de 2008, 15:31:01 por migsantiago »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #129 en: 18 de Julio de 2008, 15:26:58 »
¿Puedes colgar el programa y el proyecto para echarle una ojeada?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: dsPIC Curso Basico con C30
« Respuesta #130 en: 18 de Julio de 2008, 15:33:13 »

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: dsPIC Curso Basico con C30
« Respuesta #131 en: 19 de Julio de 2008, 01:03:06 »
Hola migsantiago, prueba reemplazando tu línea de interrupción por esta:

void __attribute__((interrupt, no_auto_psv))  _T1Interrupt(void)

le dices al compilador que no vas a crear variables en la memoria flash vistas desde la ram (32Kbytes), el warning debe desaparecer.

saludos
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #132 en: 19 de Julio de 2008, 02:52:55 »
Sospecho que hay algún problema con el Visual Initializer, Migsantiago.

Si activas el bit de Interrupción manualmente en tu main, después de la llamada al Visual Initializer funciona perfectamente:
_T1IE=1;

He seguido probando cosas, eliminando esa línea de nuevo y también he conseguido que funcione cambiando la prioridad de la interrupción T1 de 4 a 1.

Como no tiene mucho sentido, supongo que hay algún problema con la activación del bit T1IE de manera automática y por eso al cambiar de prioridad lo hace bien.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: dsPIC Curso Basico con C30
« Respuesta #133 en: 19 de Julio de 2008, 21:49:06 »
Hola

Renatox, agragué la línea y el warning desapareció, gracias.

Nocturno, probé lo siguiente...

- Prioridad a 0
- Desired time a 1ms y actual time cambió a 0.976562ms, agregué un contador de 1000 para simular 1 segundo.
- Agregué la línea de activación de la interrupción timer1

Pero no funcionó, se quedó en el led encendido sin hacer nada.

Voy a hacer desde cero el proyecto para ver si me equivoqué en algo, pero por mientras voy a leer el Family Reference Manual de los dspic30, porque no tengo ni idea de cómo se calcula el tiempo con estos timers, sólo sé que usan tres modos, A, B y C.
« Última modificación: 19 de Julio de 2008, 21:51:35 por migsantiago »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dsPIC Curso Basico con C30
« Respuesta #134 en: 20 de Julio de 2008, 02:28:25 »
Es raro, a mí me funciona  :?