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

[ATMega32][C]RS232 - brak transmisji

kuch_arc 15 Paź 2008 16:07 2483 13
REKLAMA
  • #1 5634257
    kuch_arc
    Poziom 14  
    Mam problem z tranmisja AVR->PC. Uzywam ATmega32-16PU@10MHz, zew. krysztal. Fusy ustawione highbyte 0xC9, lowbyte 0xFF. Zasilanie 5V, kowerter poziomow to MAX232N, piny podpiete tak
    ATMEGA MAX232 input MAX232output PC RS
    TXD T2IN T2OUT RX ( pin 2)
    RXD R2OUT R2IN TX (pin3)
    GND (pin5)


    Kod programu testowego:
    
    #define BAUDRATE 64  // 9600 at 10MHz
    #define LED 0
    #define LED2 6					 
    				
    #define F_CPU 10000000
    //tranmission led
    #define LED_ON()  PORTC |= (1<<LED)
    #define LED_OFF()  PORTC &= ~(1<<LED) 
    
    //power led
    #define LED2_ON() PORTD |= (1<<LED2)		
    #define LED2_OFF() PORTD &= ~(1<<LED2) 
    
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    void rsInit(unsigned char baud) {
      //UBRRH = 0;
      UBRRL = baud;
      UCSRC = (1<<UCSZ0) | (1<<UCSZ1);  // 8N1
      UCSRB = (1<<RXEN) | (1<<TXEN);    // enable tx and rx
    }
    
    void rsSend(unsigned char data) {
      while( !(UCSRA & (1<<UDRE)));
      UDR = data;
    }
    
    unsigned char rsRecv() {
      while( !(UCSRA & (1<<RXC)));
      return UDR;
    }
    
    void portInit() {
      
      
      //DDRD = (1 << LED); 
     // PORTC = 0xFF;
      DDRC = 0xFF;
      DDRD = (1 << LED2); 
    }
    
    volatile unsigned char bytes[16];
     
    
    int main(void){
    
    	unsigned int i=0;
    	asm("cli");
    	portInit();
    	_delay_ms(100);
    	rsInit(BAUDRATE);
    	LED2_ON();
    	bytes[0]=0x30;
    	bytes[2]=0x40;
    	bytes[3]=0x42;
    	bytes[4]=0xFF;
    	bytes[5]=0x48;
    	bytes[6]=0x40;
    	bytes[7]=0x60;
    	bytes[8]=0x70;
    	bytes[9]=0x80;
    	bytes[10]=0xF0;
    	bytes[11]=0xF0;
    	bytes[12]=0xF0;
    	bytes[13]=0xFA;
    	bytes[14]=0xFA;
    	bytes[15]=0xFA;
    	while(1){
    	
    		for(i=0;i<16;i++){
    		     rsSend(bytes[i]);
    		}
    		LED_ON();
    		_delay_ms(250);
                                    _delay_ms(250);
    		_delay_ms(250);
    		_delay_ms(250);
    		LED_OFF();
    		_delay_ms(250);
    		_delay_ms(250);
    		_delay_ms(250);
    
    	}
    	return 0;
    }
    

    Hyperterminal/Putty milcza, zarowno na lapie jak i na przejsciowce USB-RS na moim kompie. Zegar jest dobry, bo jak zrobie 4 x delay 250ms to diodka swieci sie przez sekunde. Blad zegara USART to 1.7%, czyli znosnie. Nie wiem juz co mam z tym zrobic.

    Poprawiłem tytuł - regulamin p.11.1
    Przeniosłem do właściwego działu.
    [zumek]
  • REKLAMA
  • #3 5634549
    kuch_arc
    Poziom 14  
    sky_net2:
    A nie jest to dokladnie to samo?
    Tyle ze nie mialem URSEL ale on jest domyslnie na 1.

    Putty czasem wyrzuca mi takie cos ( nie zawsze, nie wiem od czego to zalezy ;) ) - zarowno na zaproponowanych przez Ciebie, jak i na moich poprzednich ustawieniach:

    ```|`|`|```|`|`|```|`|`|```|`|`|```|`|`|```|`|`|```|`|`|```|`|`|```|`|`|`

    8bit pisze ze UCSZ1 i UCSZ0 maja byc 1. Zreszta to jest domyslne ustawienie.
    ;)

    a ten #@$*(#@$ dalej nic nie wysyla...

    update:
    po wlozeniu mojej wtyczki DB9 z 3 kabelkami - GND,RX,TX do usb dongla-convertara na RS, opor miedzy pinem 3 a 5 ( czyli TX od kompa i GND) jest ok. 200 Ohm. Po wyjeciu jest przerwa. To jest dla mnie troche dziwne, bo nie mam czegos takiego na lini TX/GND po stronie AVR'a a powinno chyba byc symetrycznie.
  • #4 5634634
    skynet_2
    Poziom 26  
    żeby było wygodniej pobierz Realterm z http://www.i2cchip.com/realterm/

    brakuje ci bytes[1], do prób najlepiej przesyłać liczbę 1 np.
    0b00000001, w Realtermie ustaw na odbiór liczb binarnych, ustaw baud i potwierdz change.
    zamiast
    
    _delay_ms(250); 
    _delay_ms(250); 
    _delay_ms(250);
    

    daj
    
    _delay_ms(750); 
    

    poco sobie życie komplikować.

    używasz przerwań ?

    niepotrzebne
    unsigned int i=0;
    lepiej wywalić i poprawić for
    for(int i=0;i<16;i++)//dodałem int


    odkomentuj
  • REKLAMA
  • #5 5643337
    _StinG_
    Poziom 14  
    i jeszcze sprawdź napięcia na wyjściu przejściówki... Tak na wszelki wypadek ;)
  • REKLAMA
  • #6 5643535
    kuch_arc
    Poziom 14  
    jakiej przejsciowki? zlaczki DB9 ?

    Zbudowalem nowy uklad na ATmega8 ( bo taki akurat mialem), nowy MAX232N,stabilizator 7085, wszystko jak w dokumentacji podlaczone + po rezystorze 1kOhm pomiedzy TXD/T2IN i RXD/R2OUT ( zeby zabezpieczyc porty).
    Internal 1MHz zegar, UBRRL=12 dla 4800 z 0.2% bledem.
    Program taki jak pierwszy, tzn wysyla 16 bytow. Na terminalu pojawiaja sie devil face'y [ taki znaczek ;), chyba zeby mnie wk..... ], i do musze naciskac klawisz na terminalu zeby on sie pojawil mimo ze nie zaimplentowalem odbioru na AVRze.
  • #7 5644025
    skynet_2
    Poziom 26  
    jak radzi kolega _StinG_ sprawdz czy przypadkiem z tej przejściówki od strony portu rs232 nie masz 5V :D

    wysyłaj liczbę 1 i odbierz to w realterm'ie żebyś widział co odbierasz, bo devil face nie wiele mówi.
  • #8 5644271
    kuch_arc
    Poziom 14  
    ok ale o jak przejsciowke chodzi ? czy nie mam 5V w "dziurce" wtyczki DB9 co wchodzi do portu COM na PC ?
  • #9 5644337
    skynet_2
    Poziom 26  
    może wyjaśnie bo troche się zamotałem.

    napisałeś
    Cytat:
    po wlozeniu mojej wtyczki DB9 z 3 kabelkami - GND,RX,TX do usb dongla-convertara na RS...

    i z tego wywnioskowałem ze używasz przejściówki USB<->RS232.

    więc czy używasz przejściówki USB<->RS232 ?
    jeśli tak schemat podłączeń wygląda tak i pomierz napięcie od strony rs232 przejściówki
    µC<->max232<->[przejściówka RS232<->USB]<->USB[PC]
    jeśli nie schemat podłączeń wygląda tak
    µC<->max232<->RS232[PC]

    w obydwu przypadkach wyślij z µC liczbę jeden, i w realterm'ie zobacz co odbierasz[tylko ustaw BAUD[zatwierdz CHANGE] i przełącz wyświetlanie na sysnem binarny[binary]]
  • REKLAMA
  • #10 5645164
    kuch_arc
    Poziom 14  
    ok uzywalem, ale stwierdzilem ze ona jest niefajna bo dodaje kolejny element niepewnosci, wiec znalazlem sledzia z DB9 i podlaczylem do plyty glownej.

    Miernik na wyjsciu z MAX232 na pinie T2OUT daje wartosci rozne ale z przedzialu -8,5V do 1.5V. Na pinie TX w ATMEDZe jest od 1.8V do 5V. Minimalnie, zeby MAX232 "zlapal" 0 musi byc 0.8V . Oczywiscie miernikiem to sobie moge mierzyć ale... tak jakby nie bylo 0 wogole.

    Moglby ktos umiescic KOMPLETNY schemat podlaczenia jakiegos AVR do MAX232, ktory na 100% byl sprawdzony i dziala ? Bede wdzieczny.
  • #12 5645305
    kuch_arc
    Poziom 14  
    o, dzieki. dokladnie tak to mialem podpiete, identycznie ;).. ale nie spinalem razem pozostalych pinow na zlaczce db9... wogole. tylko tx,rx i gnd.
  • #13 5646661
    snow
    Poziom 31  
    Akurat to nie jest konieczne do poprawnej transmisji. Wystarczą RxD , TxD i GND
  • #14 5648570
    _StinG_
    Poziom 14  
    a ja zrobiłem bez tego i mi działało :P
REKLAMA