Teade

Collapse

Foorumi reeglid.

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

Taimeri probleem

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

    Taimeri probleem

    Tervitused
    olen siin juba 2 päeva üritanud tööle saada oma sonarit aga vot ei tule välja kuidagi...

    peaks tegema nii: pulseeri välja paar pulssi transmitterisse, mõõda aega, mil tuleb tagasi kaja e mõõda, kui kaua võtab aega, et PORTD6 low'ks läheks ja saada vastus LCD'le

    mis on koodis valesti, et ta nii ei tee?
    minu kood on siin:
    Kood:
    /*
    program to "talk" with sonar module
    transmitter connected to PORTD 0 and 1
    reciever connected to PORTD 6 (ICP)
    LCD connected to PORTB 4; bit mode.
    */
    
    // Alphanumeric LCD Module functions
    #asm
      .equ __lcd_port=0x18&#59;PORTB
    #endasm
    #include <lcd.h>
    #include <tiny2313.h>
    #include <delay.h>
    #include <stdio.h>
    
    #define STOP_TIMER  TCCR1B = 0xC0
    #define START_TIMER  TCCR1B = 0xC5 
    
    
    // Declare your global variables here
    int a;
    int x;
    int y;
    int tof;
    char c[10];
    char lcd_buffer[16];
    
    int timerl; //Low
    int timerh; //High
    int timert; //Total
    
    
    interrupt [TIM1_CAPT] void timer1_capt_isr(void)
    {
      timerl = ICR1L;
      timerh = ICR1H;
      timert = timerl + (timerh <<8);
      STOP_TIMER;
      y=0;
    }
    interrupt [TIM1_OVF] void timer1_overf_isr(void)
    {
      sprintf(lcd_buffer,"overflow");   //write "owerflow" into lcd_buffer
      delay_ms(1);
      lcd_clear();
      lcd_puts(lcd_buffer);
      ICR1H = 0;
      ICR1L = 0;
    }
    
    void pulseout(int p)
    {
    	for (x=0;x<p;x++)
        {
          PORTD &= ~0b00000001;
          PORTD |= 0b00000001;
         delay_us (10); 
          PORTD &= ~0b00000010;
          PORTD |= 0b00000010;
          delay_us (9);
        }
    }
    
    void main(void)
    {
    // Declare your local variables here
    
    // Crystal Oscillator division factor: 1
    #pragma optsize-
    CLKPR=0x80;
    CLKPR=0x00;
    #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
    #endif
    
    //Timer initialization
    //TCCR1B = 10xxx010
    TCCR1B=0xC5;
    TIMSK |= 0b10001000;
    
    
    
    ACSR = 0;
    
    //-----------------------------------------------------------------------
    
    // LCD module initialization
    lcd_init(8);
    #asm
    sei
    #endasm
    	PORTB	= 0xFF;
    	DDRB	= 0x00;
    	
    	PORTD	= 0x03;
    	DDRD	= 0b0000000;
      y=1;
    	while (1)
      {
    back:
       ICR1H = 0;
       ICR1L = 0;
       delay_ms(1000);
       pulseout(8);  // pulse the sonar transmitter 8 times
       START_TIMER;
       
    wait:      
       if (y > 0)
       {
         a++;
         if (a>6000)
         {
          STOP_TIMER;
          
          sprintf(lcd_buffer,"outofrange");   //write "outofrange" into lcd_buffer
          delay_ms(1);
          lcd_clear();
          lcd_puts(lcd_buffer);
                
          a = 0;
          ICR1H = 0;
          ICR1L = 0;
          delay_ms(1000);
          goto back;
         } 
         delay_us(1);
         goto wait; 
       }
       tof = timert / 146;
       sprintf(lcd_buffer,"t=%4uunits",tof);
       lcd_clear();
       delay_ms(1);
       lcd_puts(lcd_buffer);
       delay_ms(1000);
       y=1;
      }
    }
    EDIT: unustasin mainida, et olen AVR'idega suht lgaja


    #2
    Kirjuta täpsemalt, mida see kood sul ei tee, kas ei kirjuta LCD-le, või on LCD-le kirjutatav tulemus mittesobiv.

    Comment


      #3
      panin esimesse posti uue koodi.

      igatahes LCD peale tuleb pidevalt kiri "õieti"
      probleem seisneb selles, et ta ei taha eriti seda echot tuvastada... e kui ma selle ICP pini peal möllan (high/low teen talle), siis ta ei lähe koodis olevasse interrupti e ei täida minu käsku.

      overwlow interrupt töötab ilusti, seega global interrupt on töövõimaline aga vot see inp_capture interrupt ei tööta. omaarust olen kõik baidid õieti sättinud ja nendega ei tohiks probleemi olla (kõik timer 1 omad vähemalt).

      Comment


        #4
        syyvimata koodi soovitan sprintf ja lcd-le viimine katkestuse tsyklist välja visata,
        nende protseduuride täitmine vötab yksjagu aega ja samal ajal teisi katkestusi ei teenindata.

        Comment


          #5
          see mind ei sega praegusel hetkel, sest kui ta juba owerflow sai, siis tuleb mõõta uuesti niikuinii...

          Comment


            #6
            Kaks asja, mis võivad probleeme tekitada:
            1. Timeri prescaler on pannakse clk/1024 - kas kaja saabudes timer on üldse edasi liikund?
            2. Ei leidnud ma TCNT nullimist, võetakse ICP väärtus ju TCNT registrist?!

            Comment


              #7
              bloody-orc Postitatud Täna, 20:37
              see mind ei sega praegusel hetkel, sest kui ta juba owerflow sai, siis tuleb mõõta uuesti niikuinii...
              usun et eksid. suure töenäosusega su prose muud ei teegi kui saadab overflow aegu LCD-le teadet ja sealt tagasitulles avastab et uus overflow on juba platsis...
              ICPga polegi vöimalust tegeleda... kui prosel muid ylesandeid ei ole, siis vöid main programmis tsykli teha mis jälgib ICP lippu ja overflow oma kah. lisan koodjupikese mis niimoodi töötab ,taktsageduse ja icp polaarsuse pead muidugi valima ise:
              TCCR1A = 0x03;
              ..........
              __disable_interrupt();
              TCNT1 = 0; // loenduri reset
              TCCR1B = 0x49; // loenduri start, ICP pol = rising edge
              ...........
              __enable_interrupt(); // vöib lubada
              while ((TIFR & 0x24) == 0 );
              TCCR1B = 0x48; // jätab seisma
              if (TIFR & 0x20) { TIFR = 0x20; d = ICR1; } // tulemus d-s
              if ( TIFR & 4) { TIFR = 4; } // st overflow

              Comment


                #8
                tänud vastuste eest. tegin vastavaid muudatusi (õigel ajal clear ja interruptiäline LCDkirjutamine jne) ja midagi isegi juhtus. homme panen oma skeemi korralikule joodetud plaadile ka (breadboardilt), äkki siis saab hardware poole korda(-maks).

                Comment

                Working...
                X