• Welcome to LusoRobótica - Robótica em Português.
 

Atmega8 - Usar Rx e Tx como IO's normais

Started by metRo_, 04 de March de 2011, 00:25

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

metRo_

Tenho aqui uma duvida que se calhar até é coisa básica, basicamente quero usar o PB0 e PB1 de um atmega8 como normais IO's no entanto não está a ser possivel. O código que estou a testar é tão simples como isto:

#include <avr/io.h>

#define F_CPU 8000000UL
#include <util/delay.h>

#include "bit_tools.h"

int main(void) {

  uint8_t count=0;
  DDRB=0xff;
  DDRD=0xff;
  while(1)
  {
    PORTD=count;
    count++;
    if(count==256){
      count=0;
    }
    _delay_ms(100);
  }
 
  return 0;
}


Se fizer isto para o PORTD, como vêem no código, funciona bem, se fizer para o PORTB funciona quase bem, isto é, o PB0 manten-se sempre desligado enquanto o PB1 está sempre a piscar.

Os fuse bits são os seguintes: lfuse:0xe4 hfuse:0xd9

Alguma sugestão?!

senso

Isso é um bocadinho estranho, porque só quando se liga a USART é que esses pinos passam a ser efectivamente pinos da USART, de resto são sempre pinos digitais normais.
Avr fanboy

metRo_


senso

Experimenta meter o registo da usart, e o rxen e o txen mesmo a 0 então.
Se assim for ás tantas é por isso que o meu lcd nunca deu sinal de vida lol..
Mas se ligar um led pelo menos no atmega328p na usart, sem a ligar não faz diferença, mas esse chip é diferente..
Avr fanboy

Njay

Provavelmente é o teu bootloader que está a fazer enable à UART. Desliga-a na inicialização e tenta de novo...

metRo_

Quote from: Njay on 04 de March de 2011, 01:09
Provavelmente é o teu bootloader que está a fazer enable à UART. Desliga-a na inicialização e tenta de novo...

Acrescentei isto e continua igual:
UCSRB = (1<<RXEN)|(1<<TXEN);

Alguma outra sugestão!

Njay

Quote from: metRo_ on 04 de March de 2011, 21:04
Acrescentei isto e continua igual:
UCSRB = (1<<RXEN)|(1<<TXEN);

Alguma outra sugestão!

Sugiro que desligues a USART :D .

metRo_

Quote from: Njay on 04 de March de 2011, 21:36
Quote from: metRo_ on 04 de March de 2011, 21:04
Acrescentei isto e continua igual:
UCSRB = (1<<RXEN)|(1<<TXEN);

Alguma outra sugestão!

Sugiro que desligues a USART :D .

O meu problema é como!! lool Pensei que voces se referiam a isto :p

Njay

Colocando esses bits a zero:

UCSRB &= ~((1<<RXEN) | (1<<TXEN));

GnGz

Pois parecia-me que estava a ligar com esse código..

metRo_

Quote from: Njay on 04 de March de 2011, 21:45
Colocando esses bits a zero:

UCSRB &= ~((1<<RXEN) | (1<<TXEN));

lool
Embora estivesse a fazer mal, colei aqui o código errado e não o que testei!

metRo_

não resultou com : UCSRB &= ~((1<<RXEN) | (1<<TXEN));

GnGz


metRo_

Só estou mesmo a usar aquele codigo, antes tinha o adc e coisas assim, mas depois apaguei tudo e coloquei só mesmo esse para ter a certeza que não eram outras coisas.

metRo_

Há uma novidade, afinal o PD1 está a funcionar, o PD0 é que não, o piscar do PD1 tinha a ver com a contagem e nada mais!