logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

zabezpieczenie wejść mikrokontrolera

bimbarabam 29 Lut 2012 13:18 945 0
REKLAMA
  • #1 10614585
    bimbarabam
    Poziom 14  
    Posty: 194
    Ocena: 1
    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:

    #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 = 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)
  • REKLAMA
REKLAMA