Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATmega 128 + rs232

bimbarabam 29 Lut 2012 13:18 636 0
  • #1 29 Lut 2012 13:18
    bimbarabam
    Poziom 14  

    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:

    Code:
    #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:
    Code:
    Fuse Low Byte = 0xe2

    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)

    0 0