www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

UART problem
Pojdi na stran Prejšnja  1, 2, 3
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
prevodnik
Neznanec
Neznanec



Pridružen-a: Tor 26 Okt 2010 12:38
Prispevkov: 1
Aktiv.: 0.01

PrispevekObjavljeno: Sre Nov 10, 2010 4:04 pm    Naslov sporočila:   Odgovori s citatom

Kako se pravzaprav aktivira in deaktivira UART npr. na ATmega16 v Bascomu?
Ali z uporabo $baud ali z ukazi, ki uporabljajo UART (Print, Input...)?

Hvala !







rudiP je napisal/a:
Lahko daš tudi pin to pin TX-RX in rx-tx. Vendar moraš takrat izklopiti
povezavo na MAX232 obvezno.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 3.77
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Pon Feb 07, 2011 12:27 pm    Naslov sporočila:   Odgovori s citatom

Imam podobno težavo.

Koda:
#include <avr/io.h>
#include <util/delay.h>

#define FOSC 12000000// Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1


void init_uart(unsigned int ubrr)

{
   /* Set baud rate */
   UBRRH = (unsigned char)(ubrr>>8 ) ;
   UBRRL = (unsigned char)(ubrr);
   /* Enable receiver and transmitter */
   UCSRB |= (1<<RXEN);
   UCSRB |= (1<<TXEN);
   /* Set frame format: 8data, 2stop bit */
   UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);

}

void send_char(unsigned char data)
{
   /* Wait for empty transmit buffer */
   while (!(UCSRA & (1<<UDRE)));
      /* Put data into buffer, sends the data */
      UDR = data;
}

void send_string(char *data)
{
   while (*data)
   {
      send_char(*data);
      data++;
   }
}

int main()
{
   init_uart(MYUBRR);

   for(;;)
   {
   
   send_string("test\n\r");
   _delay_ms(1000);
/*
     while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR
      data = UDR; // Fetch the recieved byte value into the variable "ByteReceived"

      while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
      UDR = data; // Echo back the received byte back to the computer
*/
   }
}


Mikrokontroler mi pošilja podatke, le na hyper terminalu (ali katerem drugem) mi prikazuje samo smešne znake. Tudi če iz komentarja izvzamem kodo za vračanje podanih podatkov, črka, ki jo stisnem na tipkovnici, ni taprava črka v hyperterminalu. Ima kdo kakšno idejo?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.00

PrispevekObjavljeno: Pon Feb 07, 2011 1:29 pm    Naslov sporočila:   Odgovori s citatom

Ali ob isti črki na tipkovnici vedno dobiš v odgovor isti znak?

Če ja, si napiši na list pretvorno tabelo med znaki, nato pa v ASCII tabeli primerjaj binarne kode oddanih in sprejetih znakov.
Lahko je shiftanje v napačno smer ali napačna hitrost.

Tudi tisti & (and) ni posrečen, saj moraš vedno shiftati 8-krat, ne pa dokler ne ostanejo same 00000000 . Ob nekaterih kodah znakov se lahko to zgodi prej kot po osmih premiki . Vsak četrti je ------00, vsak osmi -----000, vsak šestnajsti znak pa celo ----0000 .

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 3.77
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Sre Feb 09, 2011 9:56 pm    Naslov sporočila:   Odgovori s citatom

Ne, ne dobim vedno enakega odgovora. Včasih en znak, včasih drug.

Poizkusil sem že vse možne kombinacije na terminalu, vse neuspešno.
Povezujem na USB preko FTDI čipa ali preko MAX232, vedno enako.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.23
Kraj: Ig

PrispevekObjavljeno: Sre Feb 09, 2011 10:45 pm    Naslov sporočila:   Odgovori s citatom

Jaz za UART uporabljam tole kodo (izlušči si kar potrebuješ). Navadil sem se pa tudi to, da če vem da bom uporabljal uart že po defoltu vzamem kristal 11059200Hz, ker sem se enkrat z 12000000 kristalom zaj**** in to pri vseh hitrostih.

LP G

Še koda:

Koda:

#ifndef F_CPU
   #define F_CPU 11059200UL
#endif

#include <avr/io.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <util/delay.h>

int delay;
int delay1;

//This function is used to initialize the USART
//at a given UBRR value
void USARTInit(uint16_t ubrr_value)
{

   //Set Baud rate

   UBRRL = ubrr_value;
   UBRRH = (ubrr_value>>8);

   /*Set Frame Format


   >> Asynchronous mode
   >> No Parity
   >> 1 StopBit

   >> char size 8

   */

   UCSRC=(1<<URSEL)|(3<<UCSZ0);


   //Enable The receiver and transmitter

   UCSRB=(1<<RXEN)|(1<<TXEN);


}
//******************************************************************************************
int uart_putch(char ch, FILE *stream)
{
   if (ch == '\n')
    uart_putch('\r', stream);

   while (!(UCSRA & (1<<UDRE)));
   UDR=ch;

   return 0;
}

int uart_getch(FILE *stream)
{
   unsigned char ch;

   while (!(UCSRA & (1<<RXC)));
   ch=UDR; 

   /* Echo the output back to the terminal */
   uart_putch(ch,stream);     

   return ch;
}
//*******************************************************************************************

/* Assign I/O stream to UART */
FILE uart_str = FDEV_SETUP_STREAM(uart_putch, uart_getch, _FDEV_SETUP_RW);

//*******************************************************************************************



void CLK_0()
{

    PORTD = 0b00100000;
    for (delay=0; delay < 10;delay++){}
    }
void CLK_1()
{
    PORTD = 0b01000000;
    for (delay=0; delay < 5;delay++){}
    }

int beri_enkoder(){
    uint8_t i;
    uint8_t encoder=0;
     uint8_t j;

     encoder = 0;
        for(i=0;i<9;i++){
          CLK_1();
        if(PIND & (1<<PD4)){
            j = 1; }

        else {
            j = 0; }

        CLK_0();
        encoder = (encoder + j);
       if(i<8){
        encoder = (encoder << 1);
        }
   
   }
   return(encoder);
}

void ADC_init(int channel)
{
   ADMUX = channel;
   //prescaler na 1MHz/8=125khz
   ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);
   channel = ADC_Read();
}

int ADC_Read(void)
{
   char i;
   int ADC_temp;
   int ADCr =0;

//sbi(ADCSRA, ADEN);
ADCSRA |=(1<<ADSC);
   while(!(ADCSRA & 0x10));
      for (i=0;i<8;i++)
      {
         ADCSRA |=(1<<ADSC);   
         while(!(ADCSRA & 0x10));
         ADC_temp = ADCL;
         ADC_temp += (ADCH <<8);
         ADCr +=ADC_temp;
         }
      ADCr = ADCr >> 3;
//cbi(ADCSRA,ADEN);
return ADCr;
}

double Beri_tlak(void)
{
   double ADC_vrednost;
   double Vout;
   double tlak;
   
   ADC_vrednost = ADC_Read();
   Vout = (5*ADC_vrednost) / 1024;

   tlak = ((0.76+Vout) / 0.05295);
   tlak = (tlak*10)+31;
   
   return (tlak);
}



int main() {
//    double tlak;      
    int encoder;
     stdout = stdin = &uart_str; // to poveže uart z STDIO.H !!!!!
    DDRD=0b01101100; //PORTD2 in PORTD3 sta izhoda, ostalo so vhodi
     USARTInit(5);    //UBRR = 5 =11059200mhz & 115200 baud
    fdevopen(out,0,0); //important if using stdio.h functions    
//    CLK_0();
//    for (delay=0; delay < 2000;delay++){}  // nekaj maleag zakasnitve
   
//   ADC_init(1);

   while(1)
   {
   
//   tlak=Beri_tlak();
//    printf("%f \n",tlak);
   //printf("mBar\n");

//   encoder = beri_enkoder();   
   printf("%d \n",encoder);
//    _delay_ms(10000);

   

   }
   

}

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
compaq
Član
Član



Pridružen-a: Tor 10 Mar 2009 12:53
Prispevkov: 100
Aktiv.: 0.50
Kraj: Maribor

PrispevekObjavljeno: Pon Mar 07, 2011 9:57 am    Naslov sporočila:   Odgovori s citatom

Je pa zanimivo naredit povezavo UART med dvema MC...

Sam se trenutno ukvarjam z uartom med dvema 16f628a picema, ampak mi nikakor ne uspe jiva povezat...sem uporabil tudi help od mikroC pa je zelo lepo razloženo za povezavo RS-232...

Bi mi vedel kdo pomagat, pri komunikaciji preko RX/TX med dvema PIC-ema ?

lp

_________________
Za vsakega drifterja raste robnik!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 3.77
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Pon Mar 07, 2011 10:23 am    Naslov sporočila:   Odgovori s citatom

Si siguren, da imaš
RX - TX,
TX - RX povezavo?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
compaq
Član
Član



Pridružen-a: Tor 10 Mar 2009 12:53
Prispevkov: 100
Aktiv.: 0.50
Kraj: Maribor

PrispevekObjavljeno: Pon Mar 07, 2011 10:39 am    Naslov sporočila:   Odgovori s citatom

žrepko je napisal/a:
Si siguren, da imaš
RX - TX,
TX - RX povezavo?


Zakaj pa nebi imel?
tx bi bil oddajni MC
rx pa sprejemni MC

Komunikacija bi pa bila samo v eno smer. Malo sem googla vprašal in pri RF komunikaciji so uporabljeni ti pini...

_________________
Za vsakega drifterja raste robnik!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dule26
Član
Član



Pridružen-a: Tor 28 Sep 2010 7:30
Prispevkov: 26
Aktiv.: 0.15
Kraj: Murska Sobota

PrispevekObjavljeno: Pon Mar 07, 2011 12:23 pm    Naslov sporočila:   Odgovori s citatom

Priloži kodo, ki si jo napisal, da ti lahko pomagamo.
Drugače pa moraš imet povezano TX prvega mikrokrmilnika na RX drugega mikrokrmilnika in obratno.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.33

PrispevekObjavljeno: Pon Mar 07, 2011 3:52 pm    Naslov sporočila:   Odgovori s citatom

Glede na to, da ti izpisuje kar neke naključne znake, po vsej verjetnosti nimaš nastavljenih enakih baudov. Kvarc je prave frekvence? Pomeri trajanje bita z osciloskopom.
_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
compaq
Član
Član



Pridružen-a: Tor 10 Mar 2009 12:53
Prispevkov: 100
Aktiv.: 0.50
Kraj: Maribor

PrispevekObjavljeno: Pon Mar 07, 2011 11:02 pm    Naslov sporočila:   Odgovori s citatom

dule26 je napisal/a:
Priloži kodo, ki si jo napisal, da ti lahko pomagamo.
Drugače pa moraš imet povezano TX prvega mikrokrmilnika na RX drugega mikrokrmilnika in obratno.


Bi jo priložil, ampak nima smisla ker je ena velika zmešnjava....
Povezave so pravilne!

Moja želja bi bila če bi mi lahko kdo na hitro spisal, dal namig kako bi naj naredil ta enostaven primer....(je pa tudi dejstvo da še uarta nisem nikoli uporabljal)

1MC - pritisnem tipko pošlje signal preko TX
2MC - preko RX sprejme signal in LEDIKA ugasne (se prižge)

to poskušam naredit ampak brez uspeha :s

_________________
Za vsakega drifterja raste robnik!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.27
Kraj: Yogyakarta

PrispevekObjavljeno: Tor Mar 08, 2011 12:00 am    Naslov sporočila:   Odgovori s citatom

evo za PIC18F8722 Mr. Green

Koda:


/**************************************************************************************
               USART1 setup function - 115200 baud rate
               15  = 115200
               31  = 57600
               95  = 19200            
**************************************************************************************/
void setup1_USART(void)
{
    Open1USART
    (
        USART_TX_INT_OFF  &
        USART_RX_INT_ON   &
        USART_ASYNCH_MODE &
        USART_EIGHT_BIT   &
        USART_CONT_RX     &
        USART_BRGH_HIGH,
        31
    );

    // Enable interrupt priority
    RCONbits.IPEN = 1;
    // Make receive interrupt high priority (1)
    IPR1bits.RC1IP = 1;
    // Enable all high priority interrupts
    INTCONbits.GIEH = 1;   

    rx1_head=0;
    rx1_tail=0;   
}



RX znake je najbolje ujeti z interupt rutino.
Po možnosti v ARRAY Very Happy
Ampak ti lahko enostavno za vsak interupt togle-aš tvoj pin.
lahko pa daš if stavek pa manipuliraš glede na char kodo
Koda:

#pragma code
#pragma interrupt ISR_handler
void ISR_handler(void)
{
    char c = 0;
   INTCONbits.GIE = 0;

   while (PIR1bits.RC1IF)
    {
        c  = Read1USART();
      //c  = RCREG1;
/
        CharBuffer1[rx1_head++] = c;       // Get character from serial port and put into fifo.
        if(rx1_head >= BUFFER_SIZE_USART1)               // Wrap pointer to beginning of buffer if at end.
           rx1_head = 0;

      
      //PIR1bits.RC1IF = 0;                     // Recive Interrupt Flag bit reset
    }

   
   INTCONbits.GIE = 0;
}

_________________
Bad things happen to good people all the time for no reason!
Blog
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
compaq
Član
Član



Pridružen-a: Tor 10 Mar 2009 12:53
Prispevkov: 100
Aktiv.: 0.50
Kraj: Maribor

PrispevekObjavljeno: Pon Mar 28, 2011 9:18 pm    Naslov sporočila:   Odgovori s citatom

dule26 je napisal/a:
Priloži kodo, ki si jo napisal, da ti lahko pomagamo.
Drugače pa moraš imet povezano TX prvega mikrokrmilnika na RX drugega mikrokrmilnika in obratno.


Koda, ki sem jo spisal je v drugi temi...

tukaj še povezava do tiste teme:

http://www.elektronik.si/phpBB2/viewtopic.php?p=274586#274586

_________________
Za vsakega drifterja raste robnik!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
RUros
Član
Član



Pridružen-a: Čet 09 Mar 2006 22:26
Prispevkov: 1031
Aktiv.: 4.39

PrispevekObjavljeno: Čet Mar 01, 2012 11:47 pm    Naslov sporočila:   Odgovori s citatom

Imam problem z UART-om na Atmega324. In sicer ko sprejemam, sprejem ni pravilen po nekem času pa se tudi sprejem ustavi in ne dela več (onemogoči tudi oddajo). Koda ki jo imam je preverjena, saj sem jo uporabil že drugje in dela brez težav. Sprva sem pomislil da je krivec notranja ura, ki jo uporabljam za takt (8Mhz), ampak mislim da temu ni tako, ker oddaja lepo deluje, če je sprejem izključen. Posumil sem v hardwarsko napako, ampak na RX pinu prisluškujem in je vse v vredu. Ne vem kaj sem še lahko spregledal. Inicializacijo sem nastavil sledeče za (8Mhz notranji clk):

UCSR0A=0;
UCSR0C=(1<<UCSZ00)|(1<<UCSZ01);
UBRR0=51; //hitrost mora biti 9600 zaradi oddajne naprave
UCSR0B=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);

Torej problem se pojavi samo takrat ko vključim sprejemnik. Zgleda kot zabasan buffer, ampak koda ki jo uporabljam lepo deluje na istem krmilniku ampak drugo vezje (eksterni clock).
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3
Stran 3 od 3

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 495 dni


Powered by phpBB © 2001, 2005 phpBB Group