PB7, PD7 (en ATMega32) no funcionará cuando se habiliten las extensiones. También PC6 y PC7 no muestran salida

3

Estoy haciendo un teclado 16 * 16 (en PORTB y PORTD) con ATMega32 usando proteus 6.9 y AVRstudio5.

Mi problema es que PB7 y PD7 no funcionarán cuando las extensiones en esos pines estén habilitados. Aquí sale la PD7, así que no hay problema aquí. Pero PB7 debe estar activado para la matriz. por lo que esta parte del código no funcionará como se esperaba:

if (!(keyportpin1&(1<<col8)))
{
    while (!(keyportpin1&(1<<col8))){}
    key+=7;
    return key;
}

Problema siguiente: PC6 y PC7 tampoco dan salida en ningún caso. Intenté cambiar SFR y tampoco conseguí ninguna solución.

El código completo que estoy usando es:

/*
 * keyboard.c
 *
 * Created: 10/15/2011 10:54:24 AM
 *  Author: CMANI
 */ 
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>

#define keyportpin1 PINB
#define keyportpin2 PIND
#define keyport1 PORTB
#define keyport2 PORTD
#define keyportdirection1 DDRB
#define keyportdirection2 DDRD

//#define bit_clear(bit) (!(keyportpin&(1<<bit)))
#define col1 PB0
#define col2 PB1
#define col3 PB2
#define col4 PB3
#define col5 PB4
#define col6 PB5
#define col7 PB6
#define col8 PB7


int keyboard(void)
{
    keyportdirection1=0x00;
    keyportdirection2=0xFF;
    keyport1=0xFF;
    int key=1;
    for(int i=0;i<8;i++)
    {

        keyport2=0xFF;
        keyport2&=~(0x01<<i);

        if (!(keyportpin1&(1<<col1)))
        {


            while (!(keyportpin1&(1<<col1)))
            {}
            return key;

        }

        if (!(keyportpin1&(1<<col2)))
        {

            while (!(keyportpin1&(1<<col2)))
            {}
            key+=1;
            return key;
        }
        if (!(keyportpin1&(1<<col3)))
        {

            while (!(keyportpin1&(1<<col3)))
            {}
            key+=2;
            return key;
        }
        if (!(keyportpin1&(1<<col4)))
        {

            while (!(keyportpin1&(1<<col4)))
            {}
            key+=3;
            return key;
        }
        if (!(keyportpin1&(1<<col5)))
        {

            while (!(keyportpin1&(1<<col5)))
            {}
            key+=4;
        return key;
        }
        if (!(keyportpin1&(1<<col6)))
        {

            while (!(keyportpin1&(1<<col6)))
            {}
            key+=5;
            return key;
        }
        if (!(keyportpin1&(1<<col7)))
        {

            while (!(keyportpin1&(1<<col7)))
            {}
            key+=6;
            return key;
        } 

        if (!(keyportpin1&(1<<col8)))
        {


            while (!(keyportpin1&(1<<col8)))
            {}
            key+=7;
            return key;
        }

        key+=8;
        }
        return 0;   
}
    
pregunta Bishal Paudel

1 respuesta

2

Consulte la sección Funciones alternativas del puerto B / C en la hoja de datos . Esto demuestra que para el puerto C

  

TOSC2 - Puerto C, bit 7 TOSC2, pin 2 del oscilador del temporizador: cuando el bit AS2   en ASSR está configurado (uno) para habilitar la sincronización asincrónica de   Timer / Counter2, pin PC7 se desconecta del puerto y se convierte en el   Inversión de salida del amplificador oscilador. En este modo, un cristal   El oscilador está conectado a este pin, y el pin no se puede usar como un   Pin de E / S.

     

TOSC1 - Puerto C, bit 6 TOSC1, pin 1 del oscilador del temporizador: cuando   el bit AS2 en ASSR está configurado (uno) para habilitar la sincronización asíncrona de   Timer / Counter2, pin PC6 se desconecta del puerto y se convierte en el   Entrada del amplificador oscilador inversor. En este modo, un cristal   El oscilador está conectado a este pin, y el pin no se puede usar como un   Pin de E / S

Lo que es probable por qué no puedes producir en esos pines. Hay secciones similares para otros puertos, y una tabla que muestra exactamente qué señales pueden anular cada pin (por ejemplo, Anulación de señales para funciones alternativas en PB7..PB4 ).

Revise esas entradas y luego, si todavía tiene problemas para publicar su programa completo, incluido el código de inicialización.

    
respondido por el Peter Gibson

Lea otras preguntas en las etiquetas