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

Jakikolwiek kontakt przez RS232 Atmega8

mateo19851 28 Lut 2010 10:46 1755 9
REKLAMA
  • #1 7762189
    mateo19851
    Poziom 16  
    Witam
    Próbuje napisać jakikolwiek program kontaktujący się przez RS232 PC z ATmega8.
    Niestety nie udaje się tego dokonać. Mam prośbę o sprawdzenie programu:

    
    #define F_CPU 8000000
    #include<avr/io.h>
    
    int main(void){
    	inicjalizacja();
    	while(1){
    		 while(!(UCSRA & (1<<UDRE)));
    		 UDR=0x48;
    	}
    }
    void inicjalizacja(void){
    	UCSRC=(1<<URSEL)|(1<<UPM1)|(1<<UCSZ1)|(1<<UCSZ0);
    	UBRRL=51;
    	UCSRB=(1<<RXEN)|(1<<TXEN);
    }
    

    Port jest ustawiony, program "terminal" również - transmisja na 9600bps, bit parzystości oraz 8-em bitów danych.[/code]
  • REKLAMA
  • #2 7762662
    Konto nie istnieje
    Poziom 1  
  • #3 7762701
    morson
    Poziom 14  
    Sprawdź sobie czy niemasz zamienionych pinów RXD z TXD. Jeśli masz poprawnie podpięte do RS'a to uruchom program z załącznika, podepnij się do odpowiedniego portu i sprawdź, czy nie dostajesz informacji Frame Error, wtedy albo masz źle ustawioną parzystość (u Ciebie jest Even Parity, 8bitów i 1 bit stopu).
    Jeśli pojawia się Frame Error, spróbuj dodać kalibrację oscylatora
    
     OSCCAL = 0x..;
    

    Jeśli to nie pomoże to spróbuj troszkę rozkalibrować go zmniejszając nieco tą wartość

    atom1477
    ja nigdy nie ustawiam TXD jako wyjście i chodzi, więc to chyba jest robione automatycznie
  • REKLAMA
  • #4 7763021
    chrupex
    Poziom 11  
    Witam!
    A powiedz, czy dostajesz jakies krzaki chociaz, czy tez zupelnie nic. Jesli dostajesz krzaki to prawdopodobnie, tak jak napisal morson musisz zmienic wartosc OSCCAL.

    Przesylam Ci jak wyglada u mnie konfigurowanie uarta, oraz prosty programik, ktory sprawdza Ci jaka wartosc OSCCAL jest odpowiednia.
    
    #define F_CPU 1000000L
    #define BAUD 9600
    
    ...
    
    void USART_Init()
    {
    UBRRL = 0x06; // <-- baud rate == 9600
    /* Enable receiver, transmitter and receiver interrupt */
    UCSRB = (1<<7)|(1<<4)|(1<<3);
    }


    for(int i=0; i<255; i++){
    			OSCCAL = i;
    			itoa(OSCCAL, bufer, 10);
    			send_txt(bufer);
    			_delay_ms(100);
    		}
    
    ...
    
    void send_txt(char *text)
    {
    	while(*text!=0)
    	{
    		while(!(UCSRA & (1 << UDRE)));
    		UDR=*text;
    		_delay_ms(10);
    		text++;
    	}
    }


    PS. Aha... i jeszcze tylko takie pytanko, wiem ze moze glupie, ale kazdemu zdaza sie zapomniec (np. mi raz sie zdazylo :) ) czy na pewno laczysz atmege z pc przez max232 ? :)
  • #5 7763255
    baxter007
    Poziom 11  
    mateo19851 napisał:
    jakikolwiek program kontaktujący się przez RS232 PC z ATmega8


    Najprościej jest skorzystać z gotowej biblioteki uart np. Peter Fleury's http://www.jump.to/fleury masz tam dobre przykłady zastosowania w pliku test_uart.c
  • REKLAMA
  • #6 7763744
    mateo19851
    Poziom 16  
    Już coś ruszyło morson na tym terminalu co mi go poddałeś - dzięki za niego :)
    Zmieniłem też program , chciałem żeby mi wysyłał znaki cały czas na RS'a.
    Jednak nie podoba mi sie to co PC odbiera . Przesyłając mu w hexie :
    UDR=0x49;
    Odbieram w terminalu znaki zerowe 0x00. Czego to może być przyczyną ?
    Załanczam obrazy tego jak podłączyłem ATmege z max232 i RS oraz screen z programu "terminal" .

    Jakikolwiek kontakt przez RS232 Atmega8 Jakikolwiek kontakt przez RS232 Atmega8

    Kod programu :

    
    #include <avr/io.h> 
    #include <util/delay.h> 
    #define F_CPU 8000000 
    
    void inicjalizacja(void){
    	/*predkosc 9600*/
    	UBRRH=0x00;
    	UBRRL=0x33;
    	/**************/
    	/*transmisja asynchr, brak sprawdzania parzystosci,7 bitow danych*/
    	UCSRC=0x84;
    	UCSRB|=_BV(RXEN)|_BV(TXEN);
    	
    }
    
    int main(void) 
    { 
    	DDRD=0x02; 
    	PORTD=0x00;
    	inicjalizacja();
    	while(1){
    		if(UCSRA & _BV(UDRE)){
    			/*jesli UDR puste to wyslij*/
    			UDR=0x49;//wyslij znak na port
    		}
    	};
    }
    
  • REKLAMA
  • #7 7763831
    morson
    Poziom 14  
    źle podpiąłeś tego max232, powinno być
    RXD (uC) -> R1OUT (MAX232), R1IN -> pin 2 (DB9)
    TXD (uC) -> T1IN (MAX232), T1OUT -> pin 3 (DB9)
    pin 5 (DB9) masa
    połączenie kablem NULL-MODEM

    Ustaw sobie w terminalu 8 bitów danych (data bits) i parzystość (EVEN) i ten pierwszy program ruszy.

    MAX'y są bardzo odporne na złe podłączenie, tak że po poprawie powinno wszystko ruszyć
  • #8 7764045
    mateo19851
    Poziom 16  
    Podłączone miałem dobrze (zmieniłem schemat podłączenia) - narysowało mi sie źle. Jest tak jak teraz. I w dalszym ciągu mam ten sam problem - odbiera co innego niż wysyłam.
  • #9 7764131
    Konto nie istnieje
    Poziom 1  
  • #10 7764434
    revolt
    Poziom 34  
    
    #include "stdio.h"
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #define FOSC 12000000// Clock Speed
    #define BAUD 9600
    #define MYUBRR FOSC/16/BAUD-1
    
    void USART_Init( unsigned int ubrr)
    {
    UBRRH = (unsigned char)(ubrr>>8);
    UBRRL = (unsigned char)ubrr;
    UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }
    
    
    void US_TRA(unsigned char data)
    {
    while(!(UCSRA & (1<<UDRE)));
    UDR=data;
    }
    
    int main(void) 
    { 
      USART_Init ( MYUBRR );
      sei();
     	while(1) 
    		{ 
    	_delay_ms(400);
               US_TRA('X');
    		} 
    }
    

    To działa na ATM8 na pewno.
REKLAMA