Witam!
Mam takie pytanie, bo nie moge okrzesać transmisji komputer - atmega przy pomocy rs232. Program ma po prostu odsylac literki, w zaleznosci od tego co mu sie wysle. Napisałem taki oto kod i nie mam zielonego pojęcia czemu to nie działa:
PORTB uzylem sobie do swiecenia diodami tylko do czystej diagnostyki, wiec jest to tu nieistotne. Jezeli chodzi o czestotliwosc oscylatora to odczytalem ja biorac z wydruku UISP:
Po czym jak sięgnąłem do Datasheeta Atmela to wynikało z tego, że 4 najmlodsze bity powyzszego bajtu to CKSEL. Potem zobaczylem, ze odpowiada to czestotliwosci 2MHz wewnetrznego oscylatora RC i taka czestotliwosc ustawilem w #define. Powiedzcie mi co zle robie, bo juz koncza mi sie pomysly. Oczywicie w terminalu (gtkterm) wszystko ustawilem tak zeby sie zgadzało (8 bitow danych, 2 stopu i predkosc 9600)
Mam takie pytanie, bo nie moge okrzesać transmisji komputer - atmega przy pomocy rs232. Program ma po prostu odsylac literki, w zaleznosci od tego co mu sie wysle. Napisałem taki oto kod i nie mam zielonego pojęcia czemu to nie działa:
#define F_CPU 2000000L
#include <avr/io.h>
#include <avr/iom128.h>
#include <util/delay.h>
void init();
void transmit(unsigned char data);
unsigned char receive();
int main(int argc, char *argv[]) {
DDRB = (15 << DDB0);
PORTB = ~((1 << PB0) | (1 << PB1));
unsigned char r, t;
init();
transmit('h');
for (;;) {
transmit(56);
switch (r = receive()) {
case 'a' :
t = 'b';
transmit(t);
break;
case 'b' :
t = 'c';
transmit(t);
break;
default :
t = 'x';
transmit(t);
break;
}
}
return 0;
}
void init() {
UBRR0L = (unsigned char)12;
UCSR0B = ((1 << RXEN) | (1 << TXEN));
UCSR0C = ((1 << USBS)| (3 << UCSZ0));
}
void transmit(unsigned char data) {
PORTB = ~(7 << PB0);
while (!(UCSR0A & (1 << UDRE))) {
UDR0 = data;
}
//_delay_ms(200);
PORTB = ~((1<< PB3) | (3 << PB0));
//_delay_ms(200);
}
unsigned char receive() {
while (!(UCSR0A & (1 << RXC))) {
return UDR0;
}
}PORTB uzylem sobie do swiecenia diodami tylko do czystej diagnostyki, wiec jest to tu nieistotne. Jezeli chodzi o czestotliwosc oscylatora to odczytalem ja biorac z wydruku UISP:
Fuse Low Byte = 0xe2Po czym jak sięgnąłem do Datasheeta Atmela to wynikało z tego, że 4 najmlodsze bity powyzszego bajtu to CKSEL. Potem zobaczylem, ze odpowiada to czestotliwosci 2MHz wewnetrznego oscylatora RC i taka czestotliwosc ustawilem w #define. Powiedzcie mi co zle robie, bo juz koncza mi sie pomysly. Oczywicie w terminalu (gtkterm) wszystko ustawilem tak zeby sie zgadzało (8 bitow danych, 2 stopu i predkosc 9600)