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 

CVAVR pomoč

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
cupacup
Član
Član



Pridružen-a: Tor 20 Jul 2004 21:28
Prispevkov: 68
Aktiv.: 0.29
Kraj: Tam kjer ma mraz mlade

PrispevekObjavljeno: Ned Jun 18, 2006 10:04 pm    Naslov sporočila:  CVAVR pomoč Odgovori s citatom

Imam problem iz porta PC0 berem analogno vrednost vendar mi uc vedno vrže 1023 in ne nižjih vrednosti čepravi bi moral, kaj delam narobe?
Koda:
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Standard
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Chip type           : ATmega8
Program type        : Application
Clock frequency     : 8,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
   {
   --tx_counter;
   UDR=tx_buffer[tx_rd_index];
   if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer[tx_wr_index]=c;
   if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
   ++tx_counter;
   }
else
   UDR=c;
#asm("sei")
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

unsigned int adc_data;
#define ADC_VREF_TYPE 0x00

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// Read the AD conversion result
adc_data=ADCW;
}

// Read the AD conversion result
// with noise canceling
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
#asm
    in   r30,mcucr
    cbr  r30,__sm_mask
    sbr  r30,__se_bit | __sm_adc_noise_red
    out  mcucr,r30
    sleep
    cbr  r30,__se_bit
    out  mcucr,r30
#endasm
return adc_data;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 38400
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AREF pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8E;

// Global enable interrupts
#asm("sei")

while (1)
      {
      delay_ms(1000);
      printf("adc0 kaže %4u\n",read_adc(0));
      printf("adc1 kaže %4u\n",read_adc(1));
      };
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
VolkD
Član
Član



Pridružen-a: Pet 24 Sep 2004 21:58
Prispevkov: 14228
Aktiv.: 60.07
Kraj: Divača (Kačiče)

PrispevekObjavljeno: Pon Jun 19, 2006 8:50 am    Naslov sporočila:   Odgovori s citatom

A na PC1 dobiš pravilne rezultate ?
_________________
Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
cupacup
Član
Član



Pridružen-a: Tor 20 Jul 2004 21:28
Prispevkov: 68
Aktiv.: 0.29
Kraj: Tam kjer ma mraz mlade

PrispevekObjavljeno: Pon Jun 19, 2006 12:24 pm    Naslov sporočila:   Odgovori s citatom

ne na nobenem vhodu ni pravilne vrednosti vsi porti so vhodi a,b in c pa še vedno nič, zanima me ali sploh pravilno kličem porte? z read__adc ali bi moral uporabiti za branje adc_data
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
CarpeDiem
Član
Član



Pridružen-a: Pon 16 Feb 2004 17:24
Prispevkov: 333
Aktiv.: 1.41
Kraj: Vrhnika

PrispevekObjavljeno: Pon Jun 19, 2006 2:21 pm    Naslov sporočila:   Odgovori s citatom

Primer uporabe AD pretvorbe (h*tp://userweb.upctelemach.net/~u052009/):

Uporaba IC4511 (2x 7seg LED driver).
Uporaba Timer0 overflow interupta.
Na dveh 7seg LED se izpisuje rezultat AD pretvorbe (loop).
Izpisani rezultat je povprecje 20-ih meritev. Konstantnejsa meritev.

10k potenciometer je na PORTA.0.

Timer0 prescaler je nastavljen na Fosc/1024. Torej TCCR0=0x05 (101)

#n = (zeljeni cas * Fosc)/prescaler
V tem primeru pride do preliva vsakih ~5ms po priblizno ~15 urinih pulzov.
Zato moramo Timer0 TCNT0 po vsakem prelivu ponovno napolniti z
256 - 215 = 241 (0xF1).

Cas 5ms uporabimo za izmenicno priziganje 7segLED-ic.

V tem primeru je uporabljen 4MHz-ni kristal.

CodeVisionAVR C Compiler
(C) 2000-2002 HP InfoTech S.R.L.
www.hpinfotech.ro

Chip: Mega8535

Koda:

// I/O register definitions for Mega8515
#include <Mega8535.h> 

// Quartz crystal frquency [Hz]
#define xtal 4000000   

#include <delay.h> 



// Declare your global variables here
unsigned char vrednost = 0;
unsigned char toggle = 1;
unsigned char inc = 1;


unsigned char st1;
unsigned char st2;
unsigned char st1_e;
unsigned char st1_d;
unsigned char st2_e;
unsigned char st2_d; 

unsigned int adc_data;     
unsigned char adc_counter = 0; 
unsigned int adc_sum = 0; 
unsigned int adc_rez = 0; 

#define ADC_VREF_TYPE 0x00

#define led1     PORTB.0
#define led2     PORTB.1
#define led3     PORTB.2
#define led4     PORTB.3


#pragma savereg-   
// AD interrupt
interrupt [ADC_INT] void adc_isr(void)
{
    #asm
        push r26
        push r27
        push r30
        push r31
        in   r30,sreg
        push r30
    #endasm
   
   
    // Read the ADC conversion result
    adc_data = ADCW; 
    // stevec AD pretvorb
    adc_counter++;
       
    ADMUX = 0;   
   
    #asm
        pop  r30
        out  sreg,r30
        pop  r31
        pop  r30
        pop  r27
        pop  r26
    #endasm
}
#pragma savereg+
 
// Timer0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{   

    //TCCR0=0x00;     // prescaler 0
           
    // Reinitialize Timer 0 value           
    TCNT0=0xF1;     // vpisemo 256 - 15 = 241 -> 5ms 
                                   
    // vsak overflow prizgemo drugo 7segLED
    if(toggle == 4)toggle = 0;
    else toggle++;   
   
    // izracun stevilk za izpis
    st2_d = 0;   // 1. stevilka desetice
    st2_e = 0;   // 1. stevilka enice
    st1_d =  adc_rez/10;   // 2. stevilka desetice
    st1_e =  adc_rez%10;   // 2. stevilka enice         
       
       
         
    // Start the next ADC conversion
    ADCSRA.6 = 1;   
   
    adc_sum = adc_sum + adc_data;
   
    if(adc_counter == 20)
    {
       // izracun povprecja ADC
       adc_rez = adc_sum / adc_counter;                   
       
       // pretvorba iz merilnega obmocja 0 - 1024 na 0 - 51[°C]
       adc_rez = adc_rez / 20;
                 
       // resetiranje spremenljivk
       adc_sum = 0;
       adc_counter = 0;               
    } 
   
       
    if(toggle == 1)
    {                                                                 
    //prizgemo 1. led
    led1 = 1;              // aktiviraj   1. 7segLED 
    led2 = 0;              // deaktiviraj 2. 7segLED   
    led3 = 0;              // deaktiviraj 3. 7segLED 
    led4 = 0;              // deaktiviraj 4. 7segLED                                               
    PORTC = st1_e;         // output data               
    }
    else if(toggle == 2)
    {
    //prizgemo 2. led
    led1 = 0;              // aktiviraj   1. 7segLED 
    led2 = 1;              // deaktiviraj 2. 7segLED   
    led3 = 0;              // deaktiviraj 3. 7segLED 
    led4 = 0;              // deaktiviraj 4. 7segLED             
    PORTC = st1_d;         // output data 
    }
    else if(toggle == 3)
    {
    //prizgemo 1. led
    led1 = 0;              // aktiviraj   1. 7segLED 
    led2 = 0;              // deaktiviraj 2. 7segLED   
    led3 = 1;              // deaktiviraj 3. 7segLED 
    led4 = 0;              // deaktiviraj 4. 7segLED                 
    PORTC = st2_e;         // output data               
    }
    else if(toggle == 4)
    {
    //prizgemo 2. led
    led1 = 0;              // aktiviraj   1. 7segLED 
    led2 = 0;              // deaktiviraj 2. 7segLED   
    led3 = 0;              // deaktiviraj 3. 7segLED 
    led4 = 1;              // deaktiviraj 4. 7segLED               
    PORTC = st2_d;         // output data                         
    }   
   
    //TCCR0=0x05;     // prescaler 1024 -> TCCR0= 0b101
}         


void main(void)
{

        // Declare your local variables here

        delay_ms(100);
       
        // Input/Output Ports initialization
        PORTC=0x00;
        DDRC=0xFF;            // all output
        PORTB=0x00;
        DDRB=0xFF;            // all output   
       
        // ADC initialization
        // ADC Clock frequency: 62,500 kHz
        ADMUX = 0;
        ADCSRA = 0xCF;             
       
        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: 4000,000 kHz
        // Mode: Normal top=FFh
        // OC0 output: Disconnected
        TCCR0=0x05;     // prescaler 1024 -> TCCR0= 0b101
        //TCNT0=0xE3;     // vpisemo 256 - 29 = 227  (glej zgornji text)
        TCNT0=0xF1;     // 5ms pri 1024 prescalerju
        OCR0=0x00;      // output Compare Register
       
        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=0x01;     // Timer0 Overflow Interrupt Enable (prescaler postavimo na 0)     
       
        // Global enable interrupts
        #asm("sei")       
       
       
        //neskoncna zanka       
        while (1)
                {

                                 
                };
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
PrimozL
Član
Član



Pridružen-a: Tor 21 Mar 2006 10:55
Prispevkov: 404
Aktiv.: 1.72
Kraj: okolica Vipave

PrispevekObjavljeno: Tor Jun 20, 2006 9:48 am    Naslov sporočila:  ADC na ATmega 8 Odgovori s citatom

Živijo,

Predlagam ti, da z vgrajenim čarovnikom generiraš najbolj osnovno kodo za ADC (brez prekinitev), jo preizkusiš, nadaljuješ s prekinitvami (če jih potrebuješ itn. Sam veliko uporabljam ADC in mi CVAVR nikoli ni delal težav (vedno sem si jih sam Laughing ).

Ko zadeva deluje, prekopiraš nastavitve registrov v svojo kodo in bo šlo. Po mojih izkušnjah je vgrajen čarovnik zelo dober.

LP Primož.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
cupacup
Član
Član



Pridružen-a: Tor 20 Jul 2004 21:28
Prispevkov: 68
Aktiv.: 0.29
Kraj: Tam kjer ma mraz mlade

PrispevekObjavljeno: Tor Jun 20, 2006 2:05 pm    Naslov sporočila:   Odgovori s citatom

Hval za pomoč, mi je uspelo z arduino naredit!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
CarpeDiem
Član
Član



Pridružen-a: Pon 16 Feb 2004 17:24
Prispevkov: 333
Aktiv.: 1.41
Kraj: Vrhnika

PrispevekObjavljeno: Tor Jun 20, 2006 4:49 pm    Naslov sporočila:   Odgovori s citatom

PrimožL:

Ko delam z AD pretvorbo se mi rezutat včasih vozi gor in dol (cca 2-4%). Zato ponavadi naredim več meritem in računam povprečje. Se to sliši znano?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
mrsek
Neznanec
Neznanec



Pridružen-a: Pon 06 Nov 2006 20:15
Prispevkov: 3
Aktiv.: 0.01

PrispevekObjavljeno: Pon Nov 06, 2006 8:30 pm    Naslov sporočila:  Težava z RS232 Odgovori s citatom

Lep pozdrav.

Imam probelm, ki se za nekatere zdi banalen, sam pa sem zabil že kar precej časa. Nikakor mi na RS 232 ne uspe poslati "Hello world". Dobim samo xxx ... Uporabljam CodeVisionAVR in MEGA8.

Tu je še koda, ki je zgenerirana z čarovnikom.

Lp Matjaž

Koda:

/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Professional
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Project :
Version :
Date    : 6.11.2006
Author  : F4CG                           
Company : F4CG                           
Comments:


Chip type           : ATmega8
Program type        : Application
Clock frequency     : 4,000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega8.h>

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 19200
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
      {
      // Place your code here
      printf("Hello world");
      };
}


_________________
Če glava ne dela, telo trpi!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tejko
Član
Član



Pridružen-a: Pet 11 Feb 2005 12:57
Prispevkov: 108
Aktiv.: 0.46
Kraj: Pragersko

PrispevekObjavljeno: Pon Nov 06, 2006 9:11 pm    Naslov sporočila:   Odgovori s citatom

Uporabljaš kvarz ali interni oscilator? Interni oscilator je načeloma preslab za asinhron prenos. Kateri terminal uporabljaš. Preveri, da je imaš nastavljeno pravilno bitno hitrost!

LP Matej

_________________
Vseh čarov čar, ELEKTRIČAR!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mrsek
Neznanec
Neznanec



Pridružen-a: Pon 06 Nov 2006 20:15
Prispevkov: 3
Aktiv.: 0.01

PrispevekObjavljeno: Pon Nov 06, 2006 9:21 pm    Naslov sporočila:   Odgovori s citatom

Uporabljam interni oscilator. Nastavitve so pa tudi pravilne. Zanimivo je, da če skopiram primer iz pomoči kjer se uporablja putchar in getchar rutina stvar dela. Ko tipkam se tekst izpisuje na terminal, tako da terminal naj bi delal.

Imaš kako idejo??
Lp Matjaž

_________________
Če glava ne dela, telo trpi!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.71
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Tor Nov 07, 2006 11:38 am    Naslov sporočila:   Odgovori s citatom

Problem je lahko flow control. Podatki na RS232 port pridejo prehitro. Poizkusi zakasnitev (nekaj milisekund ali več) pri pošiljanju med posameznimi znaki. To da putchar deluje, dolg tekst pa ne, kaže na to, da pošiljaš prehitro.

Windowsi uporabljajo tri načine flow controla:
none (nič),
xoff/xon (controlS ustavi podatke, controlQ nadaljuje),
hardware (pretok podatkov se regulira z CTS/RTS ali DSR/DTR, to so poleg RX in TX ostale žice na modemskem/RS232 konektorju.

Če flow control na strani naprave (na primer mikrokontroler) in na strani PCja nista nastavljena prav, ali nista aktivna, lahko pride do težav. PC ni pripravljen sprejemati prevelike (ima manjhen buffer) ali prehitre količine podatkov (podatke je potrebno sproti brati). Flow control je edini način, da podatki ostanejo pravilni.

Napačne nastavitve terminala (speed, parity, stop biti...) lahko povzročijo, da so posamezni znaki pravilni. Poizkusi putchar z zaporedjem znakov. Na primer 1 2 3 4 5 6 (vsak z svojim putchar). Če dobiš na terminal 1 " 3 { 5 ~ (vsak drugi znak defekten), so napačne nastavitve terminala.

Načeloma se ne sliši logično, da bi PC ne zmogel prebrati nekaj bytov brez problema. Če ne poskrbiš za vse, je žal točno tako.

Smiley na priloženi sliki ima podplute oči, ker je večkrat stopil na grablje od COM porta.

Jur



blue.jpg
 Opis:
 Velikost datoteke:  818 Bytov
 Pogledana:  4229 krat

blue.jpg


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 -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
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: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group