Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

ATmega32 USART

hcmateusz
-
-
Posty: 1
Rejestracja: 28 lis 2007, o 13:24
Lokalizacja: Inowrocław

ATmega32 USART

Postautor: hcmateusz » 29 maja 2008, o 05:22

Witam. Mam problem. Napisalem program do wysylania danych przez RS z plytki ZL10AVR z mikrokontrolerem ATmega32. Dodatkowo w programie LabView na PC zrobilem odczyt jak i wysyl danych. Na dzien dzisiejszy program dziala tak, ze po wcisnieciu odpowiedniego przycisku na klawiaturze 4x4 wysylana zostaje odpowiednia dana (np: "1"). Na PC LabView odbiera oraz rozpoznaje dana. Wysylanie z ATmegi oraz odbior przez PC (LabView) odbywa sie swietne. Problem mam z odbiorem danych na ATmedze. Program LabView wydaje mi sie ze wysyla dana "A" do ATmelca, jednak wydaje mi sie ze zle uzywam funkcji USART_in. Prosze o pomoc. Program powinien odczytac z RS wyslana wczeniej dana z PC. Jezeli odbierze to na wyswietlaczu LED zapala sie wszystkie diody. Prosze o pomoc. Czekam na odpowiedz co robie zle.


Kod: Zaznacz cały

#include <avr/interrupt.h> #include <avr/signal.h> #include <avr/delay.h> #include <stdlib.h> #define CPU_Hz 8000000 #define OSC 8 #define BAUD 9600 #define MYUBRR CPU_Hz/16/BAUD-1 // **** fukcje dla RS232 **** void UART_init(unsigned int ubrr) { UBRRH = (unsigned char) (ubrr>>8); UBRRL = (unsigned char) ubrr; UCSRB = (1<<RXEN)|(1<<TXEN); UCSRC = (1<<URSEL)|(3<<UCSZ0); } void USART_out (unsigned char data) // wysłanie znaku { while (!(UCSRA & (1<<UDRE))); UDR = data; } unsigned char USART_in (void) // odebranie znaku { while (!(UCSRA & (1<<RXC))); return UDR; } // **** funkcja czasowa **** void waitms(unsigned char czas) { unsigned char a, b; // zmnienne licznikowe for( ; czas > 0; --czas) // ta pętla zostanie wykonana x-razy for(b = 10; b > 0; --b) // a ta 10 razy for(a = 25 * OSC; a > 0; --a) // natomiast ta 100 razy __asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl } int button1={0B00000110}; int button2={0B01011011}; int button3={0B01001111}; int button4={0B01100110}; int all={0B01111111}; //**** program glowny int main(void) { DDRD=0x00; //klawa ustawiona jako wejscie 00000000 PORTD=0xFF;//port ustawiony jako wyjscie 11111111 int i; int j; int x; int z; char przycisk1; //inicjacja na przycisk 1 char przycisk2; //inicjacja na przycisk 2 char przycisk3; //inicjacja na przycisk 3 char przycisk4; //inicjacja na przycisk 4 przycisk1=49; przycisk2=50; przycisk3=51; przycisk4=52; //---------------------- char odbiorA; odbiorA=65; //dana "A" //---------------------- DDRA = 0xFF; DDRB = 0xFF; PORTA = 0xFF; PORTB = 0x01; while (1) { _delay_ms(250); _delay_ms(250); _delay_ms(250); _delay_ms(250); _delay_ms(250); _delay_ms(250); if (PIND==0xFE){ PORTB = 2; PORTA = button1; _delay_ms(8); UART_init(MYUBRR); USART_out(przycisk1); } if (PIND==0xFD){ PORTB=2; PORTA=button2; _delay_ms(8); UART_init(MYUBRR); USART_out(przycisk2); } if (PIND==0xFB){ PORTB=2; PORTA=button3; _delay_ms(8); UART_init(MYUBRR); USART_out(przycisk3); } if (PIND==0xF7){ PORTB=2; PORTA=button4; _delay_ms(8); UART_init(MYUBRR); USART_out(przycisk4); } //----------------Chodzi gownie o ta czesc prog-czyli odbior //----------------Mozliwe ze nie moge uzywac USART_in() w warunku if //----------------Chcialbym sie dowiedziec czy skladnia jest ok i czy powinno dzialac char temp; temp=USART_in(); if (temp==odbiorA) { PORTB=8; PORTA=all; } } }

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 30 gości