¿Cómo configurar correctamente el PORTC3 ALTO / BAJO en ATmega32A?

0

Se espera que este sencillo programa para ATmega32A funcione de esta manera:

  1. Establezca PORTC 0,1,2,3 como pines de salida
  2. Configure PORTC 4, 5, 6, 7 como pines de entrada con pull ups
  3. Activa / desactiva los pines de salida 0, 1, 3: 3a. Si el pin de entrada PORTC6 es ALTO, gire 0, 1, 3 ALTO (5V) 3b. Si el pin de entrada PORTC6 es LOW, gire 0, 1, 3 LOW (0V)

    #define __DELAY_BACKWARD_COMPATIBLE__
    
    #ifndef F_CPU
    #define F_CPU 1000000UL    /* 1 MHz clock speed */
    #endif
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    int
    main(void) {
        DDRC = 0x0F;    /* 00001111, set lower nibble of PORTC to OUTPUT, upper nibble to INPUT */
        PORTC = 0xFC;   /* set HIGH PORTC.3 and PORTC.2 00001100, Low PORTC.1 PORTC.0 and set pull-ups on all INPUT pins */
    
        while(1) {
            if (PINC & (1 << PC6)) { /* lets assume a 4V supply comes to PORTC.6 and Vcc = 5V */
                PORTC |= (1 << PC3);       /* 00001011 but don't touch PORT PC2 - it stays HIGH */
                PORTC |= (1 << PC1);       /* 00001011 but don't touch PORT PC2 - it stays HIGH */
                PORTC |= (1 << PC0);       /* 00001011 but don't touch PORT PC2 - it stays HIGH */
                _delay_ms(1000);    /* delay 1s */
            } else {
                PORTC &= ~(1 << PC3);       /* turn off all output pins */
                PORTC &= ~(1 << PC1);       /* turn off all output pins */
                PORTC &= ~(1 << PC0);       /* turn off all output pins */
                _delay_ms(1000);    /* delay 1s */
           }
        }
    }
    

Construí una imagen flash y la cargué en MCU usando avr-dude ejecutando los siguientes comandos:

avr-gcc -g -DF_CPU=1000000  -Wall -Os -Werror -Wextra -mmcu=atmega32a -Wa,-ahlmns=main.lst -c -o main.o main.c
avr-gcc -g -DF_CPU=1000000  -Wall -Os -Werror -Wextra -mmcu=atmega32a -o main.elf main.o
chmod a-x main.elf 2>&1
avr-objcopy -j .text -j .data -O ihex main.elf main.flash.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex main.elf main.eeprom.hex
avr-objcopy: --change-section-lma .eeprom=0x0000000000000000 never used
avrdude -p m32 -cusbasp -B 5 -e -u -U flash:w:main.flash.hex

avrdude: set SCK frequency to 187500 Hz
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9502
avrdude: erasing chip
avrdude: set SCK frequency to 187500 Hz
avrdude: reading input file "main.flash.hex"
avrdude: input file main.flash.hex auto detected as Intel Hex
avrdude: writing flash (176 bytes):

Writing | ################################################## | 100% 0.19s

avrdude: 176 bytes of flash written
avrdude: verifying flash memory against main.flash.hex:
avrdude: load data flash data from input file main.flash.hex:
avrdude: input file main.flash.hex auto detected as Intel Hex
avrdude: input file main.flash.hex contains 176 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.10s

avrdude: verifying ...
avrdude: 176 bytes of flash verified

avrdude done.  Thank you.

PORTC0 y PORTC1 funcionan como se espera y se describe anteriormente, cuando PORTC6 está BAJO, el multímetro indica una tensión cercana a 0V, cuando PORTC6 ALTA el voltaje es de 4.92 - 4.98 V. El problema es que PORTC3 no funciona como se esperaba. Cuando debería ser LOW el multímetro muestra 4.77 V

ycuandodeberíaestarenALTOesde4.21V(!):

¿Porquéesasí?¿Estoyhaciendoalgomal?

[ACTUALIZACIÓN]

TalcomosesugiriódeshabilitarJTAGprogramandofusiblesparahfuse:w:0xD9:mhizolacosa.Muchomejorahora:

    
pregunta 4pie0

1 respuesta

3

Consulte la sección "Funciones alternativas del puerto C" de hoja de datos . La función alternativa de C3 es parte del puerto JTAG. (C0 y C1 no están asociados con el puerto JTAG). "Cuando la interfaz JTAG está habilitada, este pin no se puede usar como pin de E / S". Intente deshabilitar el puerto JTAG y luego vea si su código funciona como esperaba.

    
respondido por el kkrambo

Lea otras preguntas en las etiquetas