Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

Atmega8+USART mure

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    Atmega8+USART mure

    Tervitus

    Pea kohale on kogunenud mustad murepilved ehk ei saa USART'i ppäris hästi käima. Nimelt ei toimi RS-232 formaadis saatmine nii nagu peaks. Tutorialist pärit testprogrammidega, kus pollimisega sissetulev peegeldatakse välja tagasi, tuleb esimene sümbol ilusti tagasi ja ka teine, kui on tegemist CR-ga, muidu alates teisest sümbolist nihkes. Tundub nagu UDR-ile liituks saates mingi jääkvärtus, kuigi registrid peaksid olema tühjad.
    Kui proovin lihtsalt saata mingit sümbolit, seda kas dec, bin või hex süsteemis (ning isegi ascii char-ina), on tulemus suht ette arvamatu... mingil hetkel arvujadasid saates paistis, et väljund hex-is alla E0 ei lange.

    Kivi: Atmega8-16PU, clk sisemine 8MHz(fuse-id paigas), baud 4800 ja prescaler defineeritud 103 (viga lubatud 0,2%), asünkroonne USART läbi MAX232N, formaat 8N1 voojuhtimiseta, RS-232 kuulan Docklight 1.6-ga(proovitud nii läpaka USB->Com, kui ka PC-l COM kaudu).
    Kood kompileerub ja imbub ilusti kivisse... kasutan AVRStudio 4.13, AVRISPmkII, raua poole pealt paistab kõik korras olema...

    Lihtsalt ei näe viga...

    Allpool toodud kood on saatmise proovimiseks, kuid sisaldab ka 'echo' funktsioone.
    Kood:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #define F_CPU 8000000UL
    #define USART_BAUDRATE 4800
    #define BAUD_PRESCALE 103
    #include <util/delay.h>
    
    void init_USART(void)
    {
    	UCSRB |= (1 << RXEN) | (1 << TXEN); // RX, TX on
    	UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
    	// Use 8-bit character sizes - URSEL bit set to select the UCSRC register
    	UBRRL = BAUD_PRESCALE;		// lower 8-bits
    	UBRRH = (BAUD_PRESCALE >> 8);	// upper 8-bits
    }
    
    char USARTReadChar()
    {
       //Wait untill a data is available
    char data;
    
       while(!(UCSRA & (1<<RXC)))
       {
          //Do nothing
       }
    
       //Now USART has got data from host
       //and is available is buffer
       data = UDR;
       return data;
    }
    
    void USARTWriteChar(char data)
    {
       //Wait untill the transmitter is ready
    
       while(!(UCSRA & (1<<UDRE)))
       {
          //Do nothing
       }
    
       //Now write the data to USART buffer
    
       UDR = data;
       return;
    }
    
    
    int main(void)
    {
    	DDRB	= 0xFF;
    	PORTB	= 0x00;
    	DDRC	= 0xFF;
    	PORTC	= 0x00;
    	DDRD	= 0xFF;
    	PORTD	= 0x00;
    	init_USART();
    
       for(;;)   // and sh*t hits the fan
       {
          // Loop until UDR register is empty
             while((UCSRA & (1 <<UDRE)) == 0);
          
          // Transmit letter a
             UDR = 0x61;
       };
    }

    #2
    Vs: Atmega8+USART mure

    Tagajärg:
    Esmalt postitatud Kolmjalg poolt
    Pea kohale on kogunenud mustad murepilved ehk ei saa USART'i ppäris hästi käima.

    Põhjus:
    clk sisemine 8MHz(fuse-id paigas)

    AVR-i sisemise kella täpsusest ei piisa RS232 tõrgeteta tööks. Kvartsi kasutamisel probleeme pole.
    If you think education is expensive, try ignorance.

    Comment


      #3
      Vs: Atmega8+USART mure

      Julgen vastu vaielda, võib-olla küll mitte suuremate kiiruste juures aga BAUD 9600 ja sisemine 8MHz kell sain sõnu küll ilusti üle kantud (FT232 USB to RS232 konverter oli vahel).

      Comment


        #4
        Re: Vs: Atmega8+USART mure

        kellel veab kellel mitte. sisemise kella tolerants on suhteliselt suur, et seda mitte kasutada RS232'eks. osadel chippidel on see peaaegu õige, teistel jällegi 5% möödas.

        pista väline kell külge ja vaata, kas probleemid kaovad. kui ei kao siis otsime edasi.

        Comment


          #5
          Vs: Atmega8+USART mure

          no saab ikka edukalt rc kella pealt jooksma. tuleb vaid osccal liita/lahutada natuke juurde. katseeksitus meetodil vaja enne natuke aega raisata ja kindlaks teha, palju see konkreetne eksemplar tahab saada.
          mingi forever loop kood jooksma panna, mis saadab 0x55 ja seda pc peal hyperterm peal vaadata. kui sagedus vale, siis ei ilmu mingeid kirju voi siis on vigased symbolid. kui osccal abil sageduse paika saab, on stabiilselt UUUUUUUUUUUU...
          0x55 kood ja 1 startbit ja 1 stop ja 8bitine voog on signaali poolest tpselt 1/2 baudrate sagedusest vordselt 1 ja 0 vaheldumisi, seda saaks ka tx otsa pealt sagedusmootjaga kontrollida.
          9600baud korral oleks vaja saada sinna sagedus 4800hz

          Comment


            #6
            Vs: Atmega8+USART mure

            On see siis asjalik mõte, rc gene timmida paika? Temperatuuri mõju tuleks ju siis kah arvestada, panna külge temp. andur ja teha tabel mis temp juures mis lisakoefitsent Võib-olla vaja ka rõhuandurit ja niiskusandurit, äkki ka need muudavad näitu!
            Arvan, et kvarts tuleks ikka odavam ja töötaks iga ilmaga. Veider ka teha seadet, mida vaja iga aasta kalibreerida.

            Comment


              #7
              Vs: Atmega8+USART mure

              Heureka!

              Leidsin ise peale pikka pusimist ja katsetel-eksitamist vea üles ning nagu tavaliselt, oli ka seekord viga tooli ka klaveri vahelises tihendis.
              Olin mingi hetk ilmselt peale 'echo'-tamist ja enne saatmise katsetamist init_USART'i mingi kavala toggle kirjutanud UBRRH ja UCSRC registrite vahel suhtlemiseks(koodis, mille siia copy'sin, seda sees pole), kuid nagu tavaliselt - liigne agarus on ogarus. Ühesõnaga UDR hakkas seeläbi ettearvamatult käituma ning tulemus käes... jälle kogemuse võrra rikkam.

              Sisemine RC kell paistab esialgu RS'i täiesti rahuldavat, kuid tuleviku mõttes vaatan juba "maagiliste numbritega" kristalli suunas .

              Igatahes tänud kõigile, kes nõu andsid, paistab, et selleks korraks on häire maas.

              Comment

              Working...
              X