uart atmega16
uart atmega16
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
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
Re: uart atmega16
nech robim co robim toto je asi moje maximum
ale nejde uz nwm co tam mam spravit snazil som sa spojit ten na microhobby s atmegou
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!
}
Re: uart atmega16
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
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
robodoupe.cz
Re: uart atmega16
ono v podstate mi to nejde 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
ale aj tak dik
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
ale aj tak dik
Re: uart atmega16
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ě.
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
robodoupe.cz
Re: uart atmega16
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
Re: uart atmega16
Tak hurá!!
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
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
robodoupe.cz
Re: uart atmega16
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:
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);
}