uart atmega16

Chcete si postavit robota, ale tak nějak nevíte kudy do toho?
jur3c

uart atmega16

Příspěvek od jur3c »

pls potrebujem pomoc ako napisat program na uart ked chcem prijimat ascii znaky a na to nasledne spravit podmienku (napr. ak primem C tak ide dolava)
baudrate 19200 kbps 8N1
len ma pls neodkazte na datasheet ja to potrebujem a moc s registrami a tymi vecami okolo nwm robit
staci mi ak date nejaku ukazku na jedno pismeno aby prijimal ostatok si spravim len potrebujem tie nastavenia, registry , a ten algor. na prijimanie dat na uart
v podstate potrebujem nieco taketo len na atmegu 16 http://microhobby.net/26-06-2011/projec ... ot-bt-bot/ len akokeby prepisat tie registry alebo ako sa tomu hovori na 16
diky
jur3c

Re: uart atmega16

Příspěvek od jur3c »

nech robim co robim toto je asi moje maximum :D

Kód: Vybrat vše

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL //Defines clock speed
#define USART_BAUDRATE 9600 //Baudrate for serial comm.
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#include <util/delay.h>
 

char rotDir = 'L';
char state;
 
void forward(void)
{
    state = 'U';
    PORTD=120;PORTA=1;
    
}
 
void backward(void)
{
    state = 'D';
    PORTD=116;PORTA=2;
  
}
 
void rightTurn(void)
{
    PORTD=120;PORTA=0;
    _delay_ms(350);
    if (state == 'U') forward();
    else if (state == 'D') backward();
}
 
void leftTurn(void)
{
    PORTD=112;PORTA=1;
    _delay_ms(350);
    if (state == 'U') forward();
    if (state == 'D') backward();
}
 
void leftPirouette(void)
{
    state = 'a';
    rotDir = 'L';
    //PORTB = 0b00001010;
    PORTD=116;PORTA=1;
    
}
 
void rightPirouette(void)
{
    state = 'e';
    rotDir = 'R';
    //PORTB = 0b00010001;
    PORTD=120;PORTA=2;
    
}
 
void stop(void)
{
    if (state == 'U')
    {
        backward();
        _delay_ms(40);
    }
 
    else if (state == 'D')
    {
        forward();
        _delay_ms(40);
    }
     
    state = 'C';
    PORTD=112;PORTA=0;    
	_delay_ms(1000);
    
}
 

    
 

 
//Serial com. Interrupt Service Routine (runs each time a byte is received)
ISR(USART_RX_vect) 
{ 
    char ReceivedByte; 
    ReceivedByte = UDR; // Retrieves byte from serial port (bluetooth module)
    //UDR = state; // Echoes it back for fun
 
    switch (ReceivedByte) //Which ASCII character was received?
    {
        case '!':   
                    break;
         
        case 'U':   forward();
                    break; //Increase PWM duty cycle
 
        case 'C':   stop();
                    break; //Break motor by raising both direction inputs, PWM duty cycle 0%
 
        case 'D':   backward();
                    break; //Decrease PWM duty cycle
 
        case 'L':   leftTurn();
                    break;
 
        case 'R':   rightTurn();
                    break;
 
        case 'a':   leftPirouette();
                    break;
 
        case 'e':   rightPirouette();
                    break;
 
        default:    UDR = '?';
                    break; //Character unknown to my routine, discard character
  
    }
         
}
 
 
int main(void)
{
    DDRC=0;
  DDRD=124;
  PORTC=255;
  OCR1A=255;
  OCR1B=255; 
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) |(1<<WGM10);
  TCCR1B = (1<<WGM12) | (1<<CS10);
  DDRA=3;
  DDRB=0;
  PORTB=255;
  PORTA=3;
 
    //UART
    	UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //Enable Tx and Rx
    UCSRC |= (1 << UCSZ0) | (1 << UCSZ1);
    UBRRL = BAUD_PRESCALE;          //Sets
    UBRRH = (BAUD_PRESCALE >> 8); //baudrate registers
    UCSRB |= (1 << RXCIE); //Enable USART-interrupt
 
 
    /* This program is completely interrupt driven, so nothing goes on in while loop*/
    while(1); //Never gets out from here!
 
    return 0; //Never reaches this point!
}
ale nejde uz nwm co tam mam spravit snazil som sa spojit ten na microhobby s atmegou
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1519
Registrován: 16 úno 2013, 14:26

Re: uart atmega16

Příspěvek od Dex »

A funguje to "maximum" tak jak chceš? :)

To je těžký když ti datasheet nevoní ... ;)

Když jsem kdysi začínal s AVR tak jsem taky zápasil s UARTem a navíc na ATmega128, která má dva. Datasheet jsem četl ale co čert nechtěl zrovna v mém případě obsahoval chybu :)

Tenkrát jsem narazil na tuhle http://homepage.hispeed.ch/peterfleury/uartlibrary.zip knihovnu, kterou jsem pak mnohokrát použil. Na ATmega16 jsem ji nezkoušel ale na ATmega32 fungovala dobře.

Dokumentaci najdeš tady http://homepage.hispeed.ch/peterfleury/ ... _uart.html

Je k tomu přibalen i perfektně okomentovaný příklad. Doufám, že angličtina není problém ;)
"all your robots are belong to us"
robodoupe.cz
jur3c

Re: uart atmega16

Příspěvek od jur3c »

ono v podstate mi to nejde :D ale vsak 16 a 32 su v podstate rovnake nie? len pamat je ina
ja jedine co potrebujem je prijimat tie pismena cez uart a napisat na ne podmienky co robi ked prijme napr. C ja potrebujem len tie registry ako maju byt a ten zakladny prerusovaci program ci ako sa tomu hovori (tusim to znamena ze ked zaciti signal tak prijme a prepne ) v podstate mi len o to ide abz to prijimalo asi tak 10 ASCII znakov podla mna to nebude tazke len ja to nwm :D
ale aj tak dik
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1519
Registrován: 16 úno 2013, 14:26

Re: uart atmega16

Příspěvek od Dex »

Zkus si projít to co jsem ti naservíroval na stříbrném podnose. Prošel jsi si to vůbec?

Ten příklad popisuje inicializaci knihovny (tj. nastavuje registry), příjem znaku a jeho odeslání zpět včetně ošetření chyb při přenosu. Ta knihovna využívá přerušení a znaky ukládá do bufferu kde si je jen pohodlně vyzvedneš.

Vždyť stačí do kódu tam kde se odesílá přijatý znak zpět dopsat tvoje podmínky a je to hotové!

Pokud je to i tak moc složité tak by jsi možná měl začít třeba Arduinem tam je to ještě trochu jednodušší.

Jinak ATmega16 a 32 se moc neliší proto to myslím bude fungovat úplně stejně.
"all your robots are belong to us"
robodoupe.cz
jur3c

Re: uart atmega16

Příspěvek od jur3c »

velmi pekne dakujem uz mi to ide len ja som nezbadal ze ten test je v tom baliku ja som najprv pozeral na to pod tym tu html a ked som to zbadal som sa zlakol ze to nebudem vediet ale akonahle som videl ten testuart.c tak to stacilo prepisat na tie podmienky a je to vazne dakujem a este k tomu BT modulu OBS410 som sa na jednom RR fore pytal tam stacilo dat pin 0 a spojilo ma s PC a az potom trebalo nastavit povolenie na komun. s inymi zariadeniami
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1519
Registrován: 16 úno 2013, 14:26

Re: uart atmega16

Příspěvek od Dex »

Tak hurá!! :D

Nešlo mi do hlavy co by na to bylo tak komplikované. Tak až to bude něco dělat dej na fórum pár fotek nebo video ať se můžeme pokochat ;)
"all your robots are belong to us"
robodoupe.cz
jur3c

Re: uart atmega16

Příspěvek od jur3c »

ked mu dokončím aj kryt tak ho sem určite dám :)
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1519
Registrován: 16 úno 2013, 14:26

Re: uart atmega16

Příspěvek od Dex »

Klidně bez krytu ať je něco vidět :)
"all your robots are belong to us"
robodoupe.cz
Uživatelský avatar
McBig
Příspěvky: 10
Registrován: 07 bře 2013, 11:37
Bydliště: Kolín
Kontaktovat uživatele:

Re: uart atmega16

Příspěvek od McBig »

Pokud si dobře pamatuji (na tyhle sekce už sem dlouho nekoukal, ale až začnu laborovat s I2C zase začnu) v datasheetech k AVR - v těch velkých kompletních, jsou i ukázky asm a C kódu. Takže listovat v nich se opravdu vyplatí !

Ukázka z datasheetu ATmega48A/PA/88A/PA/168A/PA/328/P:

Kód: Vybrat vše

#define FOSC 1843200 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
void main( void )
{
...
  USART_Init(MYUBRR)
...
}
void USART_Init( unsigned int ubrr)
{
  /*Set baud rate */
  UBRR0H = (unsigned char)(ubrr>>8);
  UBRR0L = (unsigned char)ubrr;
  Enable receiver and transmitter */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  /* Set frame format: 8data, 2stop bit */
  UCSR0C = (1<<USBS0)|(3<<UCSZ00);
}
Odpovědět