Skocz do zawartości

Robot wielozadaniowy Mika


Pomocna odpowiedź

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);


 }
}
Link do komentarza
Share on other sites

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);


 }
}
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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ść 😉

Link do komentarza
Share on other sites

@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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.