Zolw2305 Napisano Sierpień 10, 2011 Udostępnij Napisano Sierpień 10, 2011 Witam, buduję robota opartego o system Arduino. Mam problem z komunikacją po RS. Docelowo dane do robota mają być wysyłane z LabView, ale w celach testowych postanowiłem wykorzystać do tego uC ATmega16. Pin TxD Atmegi jest zwarty z pinem RxD Arduino. Program wysyłający dane z ATmegi (ma wysłać wartość 0x80): /*Ustalenie prędkości transmisji*/ #define F_CPU 1000000L #define BAUD 4800 #define MYUBRR F_CPU/16/BAUD-1 #include <stdio.h> #include <avr/io.h> #include <util/delay.h> /* Inicjalizacja USART */ void USART_init(unsigned int ubrr) { /* Ustala prędkość transmisji */ UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; /* Włącza nadawanie */ UCSRB = (1<<TXEN); /* Format ramki: 8 bitów danych, 1 bit stopu */ UCSRC = (1<<URSEL)|(3<<UCSZ0); } /* Wysyłanie znaku */ void USART_Transmit(unsigned char data) { while(!(UCSRA & (1<<UDRE))) ; UDR = data; } /* GŁÓWNA FUNKCJA */ int main(void) { /* Inicjalizuje port szeregowy AVRa */ USART_init(MYUBRR); /* Główna pętla */ while(1) { char temp = 0x80; /* Wysyła dane do portu szeregowego */ USART_Transmit(temp); } } Program Arduino, odczytujący dane (2 warianty: 1 - po odczytaniu 0x80 ma się na chwilę zapalić dioda testowa podpięta pod pin13; 2 - odczytana wartość z RxD ma zostać wyświetlona na Serial Monitor - konsoli Arduino) 1: void setup() { // inicjalizacja portu szeregowego: Serial.begin(4800); pinMode(13,OUTPUT); } void loop() { if (Serial.available() > 0) { char inByte = Serial.read(); if(inByte == 0x80) { digitalWrite(13,HIGH); delay(1000); digitalWrite(13,LOW); delay(1000); } } } W 2 wariancie instrukcje if(inByte == 0x80) {....} zastąpiono: Serial.println(inByte, BYTE); delay(2000); W pierwszym wariancie dioda nie zapala się w ogóle, natomiast w 2, na Serial Monitorze nie wyświetla się żadna wartość. Czy może to być przyczyna taktowania ATmegi przez wewnętrzny oscylator 1MHz, czy wina stoi po stronie programu?
mactro Sierpień 10, 2011 Udostępnij Sierpień 10, 2011 W drugim wariancie wysyłasz coś przez Serial Monitor i Arduino nie odpowiada? Jeśli tak, to możesz jeszcze przetestować mój kod, który odsyła znak otrzymany przez port szeregowy. int inByte = 0; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { // get incoming byte: inByte = Serial.read(); Serial.write(inByte); } } Aha, sprawdź jeszcze czy w serial monitorze masz ustawioną prędkość transmisji taką jak w programie. Jaki masz model Arduino? 1
Zolw2305 Sierpień 10, 2011 Autor tematu Udostępnij Sierpień 10, 2011 Więc tak, problem na pewno leży po stronie Arduino (model Arduino UNO z ATmega328), bo sprawdzając komunikację na samej ATmega16 przez zwarcie TxD i RxD cała komunikacja przebiega prawidłowo. Na Arduino odbieram dane przez pin RxD (wyprowadzenie oznaczone jako 0), a sprawdzając otrzymane dane, wysyłam to co otrzymałem na Serial Monitor przez USB. Prędkość na Serial Monitorze się zgadza. Przy moim 2 wariancie widać że Arduino odpowiada, bo ekran Serial Monitora się przewija, ale nic na nim nie jest wyświetlane. Właśnie sprawdziłem Twój program mactro. Problem leży gdzieś po stronie Serial Monitora, bo przesłałem dane z TxD ATmegi do RxD Arduino (z Twoim softwarem) a z TxD Arduino do RxD ATmegi i cała komunikacja śmiga jak ta lala, więc coś jest z tym Serial Monitorem nie tak. W każdym bądź razie to co miało działać działa, więc problem rozwiązany. Wielkie dzięki za pomoc.
Zolw2305 Październik 16, 2011 Autor tematu Udostępnij Październik 16, 2011 Witam ponownie, nie zakładam nowego tematu, bo problem nadal dotyczy ATmegi i Arduino. Wysyłam znak typu unsigned char (np. 200) z Atmegi przez TxD i odczytuję go na Arduino z RxD, za pomocą komendy Serial.read. Jednak odebrane dane otrzymuję w kodzie ASCII (zamiast 200 - mam 232). Chciałbym je otrzymywać jako unsigned char, bez żadnych konwersji. Nie wiem czy problem leży po stronie Arduino i instrukcji serial.read, czy może po stronie USART w Atmedze?
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »