Skocz do zawartości

Pomocna odpowiedź

  • 2 tygodnie później...

Nie działa mi stan wyspoki na porcie F w atmedze- wiecie co może być źle ? Kod prosty, tylko by sprawdzić mostek:

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

int main (void) {
DDRF=0xff;
PORTF=0x00;

DDRE=0xff;
PORTE=0x00;

while(1){

       PORTE|=(1<<PE3);
	PORTF|=(1<<PF1);


 }
}

To powinno działać:

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

int main (void) {
DDRF |=0xff;
PORTF |=0x00;

DDRE |=0xff;
PORTE |=0x00;

while(1){

       PORTE|= (1<<PE3);
	PORTF|= (1<<PF1);
_delay_ms(1000);


 }
}

Mechanicznie i elektronicznie robot jest skończony zostało jedynie programowanie. Na początku będzie to pojazd zdalnie sterowany, do prezentacji w szkole, a później wyposażę go w jakąś samodzielność 😉

  • 2 tygodnie później...

Witam!

Mam takie pytanie w co poleciliśce bipy mi wyposarzyć pilota do sterowania robotem - na pewno rfm12 , procek chyba mega8, i co jeszcze ?

@Mechano tak, widziałem, ale wolę sam coś wykminić 😉

@ps19 wiem że nie będzie łatwo, ale ten robot ma służyć mojej nauce programowania 😋

[ Dodano: 13-03-2013, 19:30 ]

Zacząłem uruchamiać moduły, ale nie obyło się bez problemów - nadajnik (M128) chyba wysyła dane , ale odbiornik (M16) chyba och nie odbiera,. Kod nadajnika:

#define SCK 1   // SPI clock
#define SDO 3   // SPI Data output (RFM12B side)
#define SDI 2   // SPI Data input (RFM12B side)
#define CS  0   // SPI SS (chip select)
#define NIRQ 7  // (PORTD)

#define HI(x) PORTB |= (1<<(x))
#define LO(x) PORTB &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PINE&(1<<NIRQ))

#define LED 7
#define LED_OFF() PORTB &= ~(1<<LED)
#define LED_ON() PORTB |= (1<<LED)

#define BAUDRATE 25 // 19200 at 8MHz

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

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define vbi(sfr, bit) (_SFR_BYTE(sfr) ^= _BV(bit))


/*
void wait4key1()
{
cbi(DDRD,4);
cbi(PORTD,4);
while(PIND&(1<<4));
}
*/
//################# UART ##########################

///////////////uart_INIT/////////////////////////


void uart_init( void )
{
UBRR0L = 51; 					       //ustawienie baudrate, 51=19.2k / 8 = 1200
UCSR0B = (1<<RXEN)|(1<<TXEN)|(1<<RXC); //wlaczenie nadajnika i odbiornika
UCSR0C =(0<<USBS)|(3<<UCSZ0);		 //8bitow, 1stop
}

///////////////uart_TRANSMIT/////////////////////////

void uart_tx( unsigned char data )
{

while ( !( UCSR0A & (1<<UDRE)) ); //czekaj az bufor sie oprozni
UDR0 = data; 			      	//wyslij dane
}



void uart_ps(char *s )
{
int n=0;
   while (s[n])
{
     uart_tx(s[n]); //wysylaj kolejno znaki z bufora
  n++;
}
}

///////////////uart_RECEIVE/////////////////////////

unsigned char uart_rx( void )
{
while ( !(UCSR0A & (1<<RXC)) ); //poczekaj na dane
return UDR0;						// zwroc dane z bufora
}

////################# UART END ########################


//################# OBSLUGA RFM12B ##########################
void portInit() {
 HI(CS);
 HI(SDI);
 LO(SCK);
 DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
 DDRB = (1<<LED);

}

unsigned int writeCmd(unsigned int cmd) {
 unsigned char i;
 unsigned int recv;
 recv = 0;
 LO(SCK);
 LO(CS);
 for(i=0; i<16; i++) {
   if(cmd&0x8000) HI(SDI); else LO(SDI);
   HI(SCK);
   recv<<=1;
   if( PINB&(1<<SDO) ) {
     recv|=0x0001;
   }
   LO(SCK);
   cmd<<=1;
 }
 HI(CS);
 return recv;
}

void rfInit() {
 writeCmd(0x80E7);
 writeCmd(0x8239);
 writeCmd(0xA640);
 writeCmd(0xC648);
 writeCmd(0x94A0);
 writeCmd(0xC2AC);
 writeCmd(0xCA81);
 writeCmd(0xCED4);
 writeCmd(0xC483);
 writeCmd(0x9850);
 writeCmd(0xCC17);
 writeCmd(0xE000);
 writeCmd(0xC800);
 writeCmd(0xC040);
}

void rfSend(unsigned char data)
{
WAIT_NIRQ_LOW();

writeCmd(0xB800 + data);
}

void rfSendString(char *s)  //wyslij string
{
int n=0;
   while (s[n])
{
     rfInit();

	   writeCmd(0x0000);
	   rfSend(0xAA); // PREAMBLE
	   rfSend(0xAA);
	   rfSend(0xAA);
	   rfSend(0x2D); // SYNC
	   rfSend(0xD4);

  	   rfSend(s[n]);		//wyslij kolejny znak z bufora
  //
  	   rfSend(0xAA); // DUMMY BYTES
	   rfSend(0xAA);
      rfSend(0xAA);
  n++;
  WAIT_NIRQ_LOW();
  _delay_ms(2);

}
}
int main()
{
 volatile unsigned int i,j;
 char *buffer="test\n\r";




 asm("cli");
 for(i=0;i<1000;i++)for(j=0;j<123;j++); //opoznienie
 portInit();
 uart_init();
 cbi(DDRD,3);
 cbi(DDRD,4);
 sbi(PORTD,4);

 uart_ps("start:\n");


	while(1)
	{

//	loop_until_bit_is_clear(PIND,4); //czekaj na wcisniecie przycisku

		LED_ON();
	rfSendString("bla");
	uart_ps(buffer);
       LED_OFF();

}
}

I odbiornika:

#define SCK 7   // SPI clock
#define SDO 6   // SPI Data output (RFM12B side)
#define SDI 5   // SPI Data input (RFM12B side)
#define CS  4   // SPI SS (chip select)
#define NIRQ 2  // (PORTD)
#define HI(x) PORTB |= (1<<(x))
#define LO(x) PORTB &= ~(1<<(x))
#define WAIT_NIRQ_LOW() while(PIND&(1<<NIRQ))

//#define LED 6
//#define LED_ON() PORTD &= ~(1<<LED)
//#define LED_OFF() PORTD |= (1<<LED)
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define vbi(sfr, bit) (_SFR_BYTE(sfr) ^= _BV(bit))
#define BAUDRATE 25 // 19200 at 8MHz

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

void portInit() {
 HI(CS);
 HI(SDI);
 LO(SCK);
 DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
//  DDRD = (1<<LED);
}

//################# UART ##########################

///////////////uart_INIT/////////////////////////

void uart_init( void )
{
UBRRL = 51; 					       //ustawienie baudrate, 51=19.2k / 8 = 1200
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXC); //wlaczenie nadajnika i odbiornika
UCSRC =(0<<USBS)|(3<<UCSZ0);		 //8bitow, 1stop
}

///////////////uart_TRANSMIT/////////////////////////

void uart_tx( unsigned char data )
{

while ( !( UCSRA & (1<<UDRE)) ); //czekaj az bufor sie oprozni
UDR = data; 			      	//wyslij dane
}



void uart_ps(char *s )
{
int n=0;
   while (s[n])
{
     uart_tx(s[n]); //wysylaj kolejno znaki z bufora
  n++;
}
}

///////////////uart_RECEIVE/////////////////////////

unsigned char uart_rx( void )
{
while ( !(UCSRA & (1<<RXC)) ); //poczekaj na dane
return UDR;						// zwroc dane z bufora
}

////################# UART END ########################

//################# OBSLUGA RFM12B ##########################

unsigned int writeCmd(unsigned int cmd) {
 unsigned char i;
 unsigned int recv;
 recv = 0;
 LO(SCK);
 LO(CS);
 for(i=0; i<16; i++) {
   if(cmd&0x8000) {
     HI(SDI);
   }
   else {
     LO(SDI);
   }
   HI(SCK);
   recv<<=1;
   if( PINB&(1<<SDO) ) {
     recv|=0x0001;
   }
   LO(SCK);
   cmd<<=1;
 }
 HI(CS);
 return recv;
}

void FIFOReset() {
 writeCmd(0xCA81);
 writeCmd(0xCA83);
}

void waitForData() {
 unsigned int status;
 while(1) {
   status = writeCmd(0x0000);
   if ( (status&0x8000) ) {
     return;
   }
 }
}

void rfInit() {
 writeCmd(0x80E7); //EL,EF,868band,12.0pF
 writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC
 writeCmd(0xA640); //freq select
 writeCmd(0xC647); //4.8kbps
 writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
 writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
 writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
 writeCmd(0xCED4); //SYNC=2DD4;
 writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
 writeCmd(0x9850); //!mp,90kHz,MAX OUT
 writeCmd(0xCC17); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
 writeCmd(0xE000); //NOT USE
 writeCmd(0xC800); //NOT USE
 writeCmd(0xC040); //1.66MHz,2.2V
}

/*
unsigned char rfRecv() {
 unsigned int data;
 writeCmd(0x0000);
 data = writeCmd(0xB000);
 return (data&0x00FF);
}
*/

unsigned char rfRecv() {
 unsigned int data;
 while(1) {
   data = writeCmd(0x0000);
   if ( (data&0x8000) ) {
     data = writeCmd(0xB000);
     return (data&0x00FF);
   }
 }
}

int main(void) {
 unsigned char data, i;

 portInit();		//inicjacja SPI, UART, RF
 uart_init();
 rfInit();
 _delay_ms(100);	//wymagane opoznienie

 sbi(DDRB,0);		//ustaw PORTD.5 jako wyjscie
 sbi(PORTB,0);
 _delay_ms(50);
 FIFOReset();
 while(1) {

     waitForData();					//czekaj na dane(low on nIRQ)

      data = rfRecv();
       uart_tx(data);
     if(data=='a')vbi(PORTB,0);		//jesli odebrano "a", zmien stan diody
     FIFOReset();						//wyczysc bufor FIFO

 }
 return 0;
}

I tak: nadajnik chyba wysyła, bo dioda miga z dużą częstotliwością, ale nadajnik nie odbiera - dioda jest zapalona cały czas. Anteny są (8,6cm) i połączenia takie jak w schemacie płytki głównej Miki tylko że na M16.

Edit :

Po 3 dniowej walce z modułami postanowiłem zrobić płytki z tiny2313 (jeden nadajnik, drugi odbiornik) i skorzystać z gotowych kodów z tematu z elektrody. Do M128 będzie po prostu wysyłało 0/1 i będzie to zdalne sterowanie, później może wykombinuję jakąś komunikację między prockami.

Pewnie tak będzie ale na początku skupię się na uruchomieniu tylko sterowania, by nie skończyć z "robotem" na kablu.

[ Dodano: 17-03-2013, 18:23 ]

Hehehe udało mi się uruchomić to dziadostwo i działa wyśmienicie 😉

Nadajnik wysyła zera a ja chodzę z kompem i odbiornikiem po domu, może ze 20m od nadajnika przez 3 ściany z zamkniętymi drzwiami jest może 1 uszkodzone zero na całe okno konsoli 😉

Zabieram się do zdalnego sterowania już jutro, bo dziś odpoczywam po bitwie 😉

Jak ktoś chce mogę udostępnić schemat zrobiony na podstawie kodu i płytkę, i oczywiście kody.

EDIT:

Schemat i płytka nadajnika (pilota) Te złacza zajmujące cały portC to złącze do attiny2313 od nadajnika.

Z żyroskopu i akcelerometru póki co zrezygnowałem, ale pewnie kiedyś się nimi pobawię.

Proszę o uwagi i jakieś wskazówki odnośnie schematu/płytki.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...