 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
prevodnik Neznanec

Pridružen-a: Tor 26 Okt 2010 12:38 Prispevkov: 1 Aktiv.: 0.01
|
Objavljeno: Sre Nov 10, 2010 4:04 pm Naslov sporočila: |
|
|
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 |
|
 |
žrepko Član

Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 3.77 Kraj: Ptuj-Maribor
|
Objavljeno: Pon Feb 07, 2011 12:27 pm Naslov sporočila: |
|
|
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 |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.00
|
Objavljeno: Pon Feb 07, 2011 1:29 pm Naslov sporočila: |
|
|
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 |
|
 |
žrepko Član

Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 3.77 Kraj: Ptuj-Maribor
|
Objavljeno: Sre Feb 09, 2011 9:56 pm Naslov sporočila: |
|
|
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 |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.23 Kraj: Ig
|
Objavljeno: Sre Feb 09, 2011 10:45 pm Naslov sporočila: |
|
|
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 |
|
 |
compaq Član


Pridružen-a: Tor 10 Mar 2009 12:53 Prispevkov: 100 Aktiv.: 0.50 Kraj: Maribor
|
Objavljeno: Pon Mar 07, 2011 9:57 am Naslov sporočila: |
|
|
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 |
|
 |
žrepko Član

Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 3.77 Kraj: Ptuj-Maribor
|
Objavljeno: Pon Mar 07, 2011 10:23 am Naslov sporočila: |
|
|
Si siguren, da imaš
RX - TX,
TX - RX povezavo? |
|
Nazaj na vrh |
|
 |
compaq Član


Pridružen-a: Tor 10 Mar 2009 12:53 Prispevkov: 100 Aktiv.: 0.50 Kraj: Maribor
|
Objavljeno: Pon Mar 07, 2011 10:39 am Naslov sporočila: |
|
|
ž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 |
|
 |
dule26 Član

Pridružen-a: Tor 28 Sep 2010 7:30 Prispevkov: 26 Aktiv.: 0.15 Kraj: Murska Sobota
|
Objavljeno: Pon Mar 07, 2011 12:23 pm Naslov sporočila: |
|
|
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 |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Pon Mar 07, 2011 3:52 pm Naslov sporočila: |
|
|
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 |
|
 |
compaq Član


Pridružen-a: Tor 10 Mar 2009 12:53 Prispevkov: 100 Aktiv.: 0.50 Kraj: Maribor
|
Objavljeno: Pon Mar 07, 2011 11:02 pm Naslov sporočila: |
|
|
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 |
|
 |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.27 Kraj: Yogyakarta
|
Objavljeno: Tor Mar 08, 2011 12:00 am Naslov sporočila: |
|
|
evo za PIC18F8722
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
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 |
|
 |
compaq Član


Pridružen-a: Tor 10 Mar 2009 12:53 Prispevkov: 100 Aktiv.: 0.50 Kraj: Maribor
|
Objavljeno: Pon Mar 28, 2011 9:18 pm Naslov sporočila: |
|
|
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 |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Čet Mar 01, 2012 11:47 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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: 496 dni
Powered by phpBB © 2001, 2005 phpBB Group
|