problemas usando atmega644pv jtag pins como gpio [cerrado]

0

He estado tratando de usar los pines del puerto C en un atmega644pv como gpio, y he tenido algunos problemas. Hasta donde puedo discernir, parece que los cuatro pines centrales (PORTC 2,3,4,5) están atascados en un estado de alta impedancia (usamos un destornillador para cortarlos en los cuatro pines externos, y los leds mencionados más adelante se comportaron como deseado). cavando un poco parece que estos son los pines JTAG, pero deshabilité JTAG a través de los bits de fusible. el código de abajo (debería) hacer que los leds adjuntos se iluminen secuencialmente, como una especie de jinete de cylon / caballero, pero solo va en una dirección, pero cuando lo ejecuto, los cuatro leds del medio solo se iluminan levemente, mientras que los externos tienen un brillo máximo . Para referencia, los leds están unidos entre PORTA y PORTC, y tienen una serie de resistencias con ellos en el lado PORTA. No puedo usar solo PORTA y tierra, porque necesito invertir la polarización de los leds en mi código real y luego controlar su voltaje.

-U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m

#include <avr/io.h>
#include <util/delay.h>

int setup(void)
{

    DDRD = 0x7F;
    MCUCR |= (1 << PUD);
MCUCR |= (1<<JTD);
PORTD=0x00;
DDRC=0xFF;
DDRA=0xFF;

}

int main(void)
{
DDRA=0xFF;
DDRC=0xFF;
PORTA=0x00;
    PORTC=0xFF;
    while(1){
    if (PIND&0x80){
        PORTC=0xFF;
        PORTA=(0b11111110);
        _delay_ms(10);
        PORTA=0b11111101;
        _delay_ms(10);
        PORTA=~0b00000100;
        _delay_ms(10);
        PORTA=~0b00001000;
        _delay_ms(10);
        PORTA=~0b00010000;
        _delay_ms(10);
        PORTA=~0b00100000;
        _delay_ms(10);
        PORTA=~0b01000000;
        _delay_ms(10);
        PORTA=~0b10000000;
        _delay_ms(10);
        PORTA=~0b00000000;
    }
    else{
    _delay_ms(10);
    }
}

return 0;
}

muchas gracias!

EDITAR: se olvidó de llamar a setup () al principio de main () = (
se requería más café

    
pregunta user36304

1 respuesta

1

La Sección 8.10.7 en la hoja de datos enumera las siguientes formas de desactivar JTAG

  • Deshabilita el fusible OCDEN.
  • Deshabilita el fusible JTAGEN.
  • Escriba uno en el bit JTD en MCUCR.

Dice que ha deshabilitado JTAG de los fusibles pero, por si acaso, puede agregar lo siguiente al inicio de main (o configuración)

MCUCR |=(1<<JTD);
MCUCR |=(1<<JTD); 

El bit JTD se debe escribir dos veces:

  

Para evitar la inhabilitación o habilitación involuntarias de la interfaz JTAG, se debe seguir una secuencia temporizada al cambiar este bit: el software de la aplicación debe escribir este bit al valor deseado dos veces en cuatro ciclos para cambiar su valor.

Noté que ya has incluido lo siguiente en la configuración ()

MCUCR |= (1<<JTD);

pero una sola escritura no tendrá ningún efecto como expliqué anteriormente

Agregando a lo que Ignacio Vázquez-Abrams escribió en los comentarios, puede tener problemas con la operación de lectura-modificación-escritura en lugar de una operación de solo escritura.

(usando avrgcc)

LEER / MODIFICAR / ESCRIBIR

con Os, O3, nivel de optimización O2 la lectura / modificación / escritura obtiene un código que está apenas dentro del límite de 4 ciclos pero funcionará:

    MCUCR |= (1 << JTD);
  88:   85 b7           in  r24, 0x35   ; 53
  8a:   80 68           ori r24, 0x80   ; 128
  8c:   85 bf           out 0x35, r24   ; 53
    MCUCR |= (1 << JTD);
  8e:   85 b7           in  r24, 0x35   ; 53
  90:   80 68           ori r24, 0x80   ; 128
  92:   85 bf           out 0x35, r24   ; 53

Con el nivel de optimización O1, obtienes un código que no funcionará (7 ciclos entre escrituras):

    MCUCR |= (1 << JTD);
  94:   e5 e5           ldi r30, 0x55   ; 85
  96:   f0 e0           ldi r31, 0x00   ; 0
  98:   80 81           ld  r24, Z
  9a:   80 68           ori r24, 0x80   ; 128
  9c:   80 83           st  Z, r24
    MCUCR |= (1 << JTD);
  9e:   80 81           ld  r24, Z
  a0:   80 68           ori r24, 0x80   ; 128
  a2:   80 83           st  Z, r24
  a4:   ff cf           rjmp    .-2         ; 0xa4 <main+0x10>

Con O0 (optimización desactivada) obtiene un código que está muy lejos del límite de 4 ciclos:

    MCUCR |= (1 << JTD);
  90:   a5 e5           ldi r26, 0x55   ; 85
  92:   b0 e0           ldi r27, 0x00   ; 0
  94:   e5 e5           ldi r30, 0x55   ; 85
  96:   f0 e0           ldi r31, 0x00   ; 0
  98:   80 81           ld  r24, Z
  9a:   80 68           ori r24, 0x80   ; 128
  9c:   8c 93           st  X, r24
    MCUCR |= (1 << JTD);
  9e:   a5 e5           ldi r26, 0x55   ; 85
  a0:   b0 e0           ldi r27, 0x00   ; 0
  a2:   e5 e5           ldi r30, 0x55   ; 85
  a4:   f0 e0           ldi r31, 0x00   ; 0
  a6:   80 81           ld  r24, Z
  a8:   80 68           ori r24, 0x80   ; 128
  aa:   8c 93           st  X, r24
  ac:   ff cf           rjmp    .-2         ; 0xac <main+0x24>

ESCRIBIR

Un mejor enfoque es usar una operación de escritura que funcione bien con cualquier nivel de optimización (Os, O1, O2, O3) pero no cuando desactivas la optimización (O0)

Usando Os, O3, O2

    MCUCR = (1 << JTD);
  88:   80 e8           ldi r24, 0x80   ; 128
  8a:   85 bf           out 0x35, r24   ; 53
    MCUCR = (1 << JTD);
  8c:   85 bf           out 0x35, r24   ; 53

Usando O1

    MCUCR = (1 << JTD);
  94:   e5 e5           ldi r30, 0x55   ; 85
  96:   f0 e0           ldi r31, 0x00   ; 0
  98:   80 e8           ldi r24, 0x80   ; 128
  9a:   80 83           st  Z, r24
    MCUCR = (1 << JTD);
  9c:   80 83           st  Z, r24

Usando O0

  MCUCR = (1 << JTD);
  9c:   e5 e5           ldi r30, 0x55   ; 85
  9e:   f0 e0           ldi r31, 0x00   ; 0
  a0:   80 e8           ldi r24, 0x80   ; 128
  a2:   80 83           st  Z, r24
    MCUCR = (1 << JTD);
  a4:   e5 e5           ldi r30, 0x55   ; 85
  a6:   f0 e0           ldi r31, 0x00   ; 0
  a8:   80 e8           ldi r24, 0x80   ; 128
  aa:   80 83           st  Z, r24
    
respondido por el alexan_e

Lea otras preguntas en las etiquetas