collapse

* Links de Robótica

* Posts Recentes

Procuro resistências 220 Ohm de 1% por brunus
[Hoje às 15:50]


Package de cond 10uF 35V smd? por KammutierSpule
[Hoje às 11:19]


Printer 3D barata por almamater
[Hoje às 09:27]


Videos hipnoticos de mecanica industrial por TigPT
[Hoje às 00:07]


FPV Drone Racing? por brunus
[Hoje às 00:00]


Decodificar cabo por Hugu
[Ontem às 23:11]


Ajuda para replicar e reparar um Dimmer por brunus
[30 de Novembro de 2016, 23:23]


Adaptar impressora 3D a Drill Maschine por Hugu
[30 de Novembro de 2016, 23:20]


Módulo gsm por dio123
[30 de Novembro de 2016, 13:39]


RAM SO-DIMM 256 MB por Hugu
[29 de Novembro de 2016, 22:52]

Autor Tópico: sfr05  (Lida 4402 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline tiagosilva510

  • Mini Robot
  • *
  • Mensagens: 100
sfr05
« em: 29 de Maio de 2011, 12:38 »
preciso de ajuda com o sensor sfr05 e o atmega 88

Alguem tem algum tutorial sobre como por a funcionar?

Offline maurosmartins

  • Mini Robot
  • *
  • Mensagens: 483
    • msm
Re: sfr05
« Responder #1 em: 29 de Maio de 2011, 13:14 »
Viva Tiago, sobre os SRF05 posso ajudar no atmel nem por isso.

Coloca as tuas questões.

Cumprimentos, Mauro.

Offline tiagosilva510

  • Mini Robot
  • *
  • Mensagens: 100
Re: sfr05
« Responder #2 em: 29 de Maio de 2011, 17:21 »
eu do sfr05 tambem percebo mais oh menos, o pior é mesmo o atmega :P

# Define ENABLE_INT # asm ("SEI")

# Define um TRUE
# Define FALSE 0
# Define PORTBDDR 0d11111110
# Define TRIGGER PORTD.1
# Define PIND.0 ECHO
# Define ILIMITADO 25000
# Define um WAIT_FOR_ECHO
# Define ECHO_MEASURE 2




MS10 int = 0;
mS int = 0;
int seg = 0;

echomeasure int = FALSE;
echotimer int;
distância = int LIMITLESS/29;

//-----
interrupção [TIM0_COMP] timer0_comp_isr (void)
{

if (echomeasure == WAIT_FOR_ECHO)
{
if (ECHO == 1)
{
echotimer = 0;
echomeasure = ECHO_MEASURE;
}
}

if (echomeasure == ECHO_MEASURE)
{
if (ECHO == 0)
{
= distância (* echotimer 100) / 29
echomeasure = FALSE;
}
mais
echotimer + +;
}



if (+ + MS10 == 10)
{
MS10 = 0;

if ((mS% 50) == 0) 
{
TRIGGER = 1;
echotimer = 0;
echomeasure = WAIT_FOR_ECHO;
delay_us (10);
TRIGGER = 0;
}


if (+ + MS == 1000)
{
mS = 0;
s + +;
}
}

}

Penso que seja algo deste genero, mas n tenho a certeza,

Cumprimentos

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 8.988
  • Helpdesk do sitio
Re: sfr05
« Responder #3 em: 29 de Maio de 2011, 22:27 »
Basta usares sei(); para ligar as interrupções, não é preciso andar a inventar com assembly.
Avr fanboy

Offline tiagosilva510

  • Mini Robot
  • *
  • Mensagens: 100
Re: sfr05
« Responder #4 em: 05 de Junho de 2011, 23:44 »
boas amigos,

estou a tentar programar um sfr05, com a ajuda de alguma pesquisa tambem claro, porque ainda estou a dar os primeiros passos :P , enviando os dados para um lcd 16x2

para ja fiz o codigo para o sfr05 mas n sei se estara correcto. gostaria que dessem uma vista de olhos se possivel.. compil direitinho, no entanto n sei como testar no sensor se funciona,
Código: [Seleccione]
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>


#define START_CLK 0x0A // Start clock with 1:8 prescaler CTC mode
#define START_CLK_N 0x02 // Start clock running 1:8 prescaler in normal mode
#define STOP_CLK 0x08 // Stop clock


void startRange(void);
unsigned int getEcho(void);
void setup(void); // General chip setup
void startTimer(unsigned int time); // Starts the timer running for a number of uS defined by value of time
void waitForTimer(void); // Waits for the timer to stop


int main(void)
{
setup();
waitForTimer();

unsigned int range;

while(1)
{
startRange(); // Send a high on the trigger pin to start a ranging
range = getEcho(); // Wait for the echo line to go high and then measure the length of this high

startTimer(0xFFFF); // Delay before taking another ranging
waitForTimer();
}
}

void setup(void)
{
DDRC = 0x01; // Port A pin 0 ouput all others input

TCCR1A = 0x00; // Set timer up in CTC mode
TCCR1B = 0x08;

TWBR = 0x20; // 100MHz I2C clock frequency
}

void startTimer(unsigned int time)
{
OCR1A = time; // Time set to count to
TIFR0 = 0x10; // Clear timer campare match flag
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK; // Start timer running 1:8 prescaler
}


void waitForTimer(void)
{
while(!(TIFR0&0x10)); // wait for timer to set compare match flag
TCCR1B = STOP_CLK; // Stop the timer
}

void startRange(void)
{
PORTC = ( 1<<PORTC0 ); // Send trigger pin high
startTimer(0x0001); // Wait around 10uS before sending it low again
waitForTimer();
PORTC = ( 0<<PORTC0 );
}

unsigned int getEcho(void)
{
unsigned int range;
 
while(!(PINC&0x02)); // Wait for echo pin to go high,  this indicates the start of the incoming pulse
TCNT1 = 0x00; // Clear timer to zero
TCCR1B = START_CLK_N; // Start timer running 1:8 prescaler in normal mode
while((PINC&0x02)); // Wait for echo pin to go low signaling that the pulse has ended
TCCR1B = STOP_CLK; // Stop the timer and set back to CTC mode
range = TCNT1/29; // Read back value in the timer counter register, this number divided by 29 will give us the range in CM

return(range);
}

Cumprimentos

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 8.988
  • Helpdesk do sitio
Re: sfr05
« Responder #5 em: 05 de Junho de 2011, 23:48 »
Testar é usar uma fita métrica meter algo a uma distancia conhecida e ver o que o sensor te dá.
Avr fanboy

Offline tiagosilva510

  • Mini Robot
  • *
  • Mensagens: 100
Re: sfr05
« Responder #6 em: 06 de Junho de 2011, 10:48 »
sim, mas este codigo é apenas para o sensor, ainda n fiz pro lcd.. como sei o q da assim?

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.705
Re: sfr05
« Responder #7 em: 06 de Junho de 2011, 11:14 »
sim, mas este codigo é apenas para o sensor, ainda n fiz pro lcd.. como sei o q da assim?

Algo deste género, tinha umas funções para imprimir strings etc etc mas não as encontrei aqui neste PC. Isto é para atmega8 por isso pode não funcionar à primeira, podes ter que alterar algumas coisas.

Código: [Seleccione]
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1

void USART_Init( unsigned int ubrr)
{
  /* Set baud rate */
  UBRRH = (unsigned char)(ubrr>>8);
  UBRRL = (unsigned char)ubrr;
  /* Enable receiver and transmitter */
  UCSRB = (1<<RXEN)|(1<<TXEN);
  /* Set frame format: 8data, 1stop bit */
  UCSRC = (1<<URSEL)|(3<<UCSZ0);
}

void USART_Transmit( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) )
  ;
  /* Put data into buffer, sends the data */
  UDR = data;
}

void write_dec(uint16_t c)
{
  char temp[4] = {'0','0','0','0'};
  int f=0;
  while(c){
    temp[f++]=c%10+'0';
    c=c/10;
  }
  int flag=0;
  for(f=3;f>0;f--){
    if(flag || temp[f] != '0'){
      flag = 1;
      USART_Transmit(temp[f]);
     }else{
      //USART_Transmit(0x20);
     }
  }
  USART_Transmit(temp[0]);
}

int main(void) { 
  int teste=100;
  USART_Init(MYUBRR);
  USART_Transmit('T');
  USART_Transmit(':');
  USART_Transmit('\n');
  USART_Transmit('\r');
  write_dec(adcGravado);
}


« Última modificação: 06 de Junho de 2011, 11:21 por metRo_ »

Offline tiagosilva510

  • Mini Robot
  • *
  • Mensagens: 100
Re: sfr05
« Responder #8 em: 06 de Junho de 2011, 11:44 »
mas pra isso ja teria que implementar comunicaçao rs232 n existe outra maneira de testar?

Offline Tayeb

  • Mini Robot
  • *
  • Mensagens: 703
Re: sfr05
« Responder #9 em: 06 de Junho de 2011, 12:08 »
Sugiro exemplos de código para diferentes microcontroladores vêr na página do fabricante em:

http://www.robot-electronics.co.uk/acatalog/examples.html

Offline tiagosilva510

  • Mini Robot
  • *
  • Mensagens: 100
Re: sfr05
« Responder #10 em: 16 de Junho de 2011, 11:07 »
nng tem codigo pra este sensor?


Offline tiagosilva510

  • Mini Robot
  • *
  • Mensagens: 100
Re: sfr05
« Responder #11 em: 16 de Junho de 2011, 11:33 »
tenho um codigo pic, mas n consigo passar pra atmega 88


Código: [Seleccione]
int sonar()
{
   unsigned char z=0;
   unsigned int result_sonar=0;
   
    PORTAbits.RA1=1; -> envia impulso
TMR1L=0; -> demora cerca de 10 us
TMR1H=0; -> nao è esta instruço que faz demorar os 10 us. Apenas faz perder tempo.
PORTAbits.RA1=0; -> pára de enviar impulso

T1CONbits.TMR1ON=1;
while(PORTAbits.RA2==0) -> espera até receber o impulso
if(TMR1L>200)
inicio();
TMR1H=0;
TMR1L=0;
while(PORTAbits.RA2!=0) -> espera at? acabar de receber o impulso
if(TMR1H>77)
inicio();
T1CONbits.TMR1ON=0; -> grava o tempo que demorou a receber o impulso
result_sonar=(TMR1L);
result_sonar=result_sonar+TMR1H*256; -> PIC tem 16b bits. Apenas se refere aos 8 bits mais significativos.
result_sonar=result_sonar/58; -> converte para centimetros
TMR1L=0;
TMR1H=0;
TMR1L=0;
TMR1H=0;
return result_sonar;
}

Offline tiagosilva510

  • Mini Robot
  • *
  • Mensagens: 100
Re: sfr05
« Responder #12 em: 18 de Junho de 2011, 09:16 »
nng me pode ajudar?

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 8.988
  • Helpdesk do sitio
Re: sfr05
« Responder #13 em: 19 de Junho de 2011, 00:12 »
Sugiro exemplos de código para diferentes microcontroladores vêr na página do fabricante em:

http://www.robot-electronics.co.uk/acatalog/examples.html



É que até lá diz Arduino...
Avr fanboy

Offline tiagosilva510

  • Mini Robot
  • *
  • Mensagens: 100
Re: sfr05
« Responder #14 em: 20 de Junho de 2011, 15:01 »
eu uso atmega88, n uso arduino, apenas o atmega mesmo