Skocz do zawartości

[C] Atmega16A i Arduino - USART problem


Zolw2305

Pomocna odpowiedź

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?

Link do komentarza
Share on other sites

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?

  • Lubię! 1
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.