logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega 8] [C] - opoźnienie 1s delay.h

cyber48 28 Mar 2009 11:29 6443 7
  • #1 6343702
    cyber48
    Poziom 10  
    Mam następujący problem:

    Chce mrugać diodą co 1 s. Pracuje z ATmega8 ustawioną na wewnętrzny oscyl. RC 1 MHz - fuse bity ustawione jak na zdjęciu poniżej:

    [ATmega 8] [C] - opoźnienie 1s delay.h

    Opcje kompilatora również jak na zdjęciu:

    [ATmega 8] [C] - opoźnienie 1s delay.h

    Nagłówek mojego programu wygląda następująco:
    
    #include <avr/io.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include "kbd4x4.h"
    #include "lcd.h"
    #include <avr/eeprom.h>
    
    [b]#define F_CPU 1000000UL // 1MHz[/b]
    


    Problem polega na tym, że po wywołaniu funkcji:
    
    void dioda(void)
    {
    		uint8_t i=0;
    		uint8_t j=0;
    		while(i<10)
    		{
    			j=i+0x30;	
    			lcd_putc(j);
    
    			PORTC &= 0x00;		// zapal LED
    			_delay_ms(1000);	// czekaj 1s
    			PORTC |= 0xFF;		// zgaś LED
    			_delay_ms(1000);		
    			i++;
    		}
    }
    
    int main(void)
    { 
          uint8_t klawisz;
    
          system_init();
    
          lcd_clrscr();
          lcd_puts("Mrugram dioda!\n");
    		  
           while(1)
               {
                  klawisz = getkbd();                          //odczyt klaw. 4x4
                  switch(klawisz)
                  {
                      case 0x44:                                  //jesli klawisz=A, dioda
                                     dioda();
                                     break;
                  }
               }
    }
    

    dioda pulsuje szybciej niż co 1 sekundę.

    Rejestry kierunku ustawione jak poniżej:
    
    void system_init(void)
    {
      
    	DDRB=0x0F;	
    	PORTB=0xFF;
    
    	DDRC=0xFF;
    	PORTC=0xFF;
    
    	lcd_init(LCD_DISP_ON_CURSOR);	// inicjalizacja LCD
    
    }
    

    Pytanie - gdzie robię błąd?

    Kod umieszczamy w znacznikach [code] - proszę o tym pamiętać.
    [zumek]
  • #2 6343749
    _Robak_
    Poziom 33  
    Na poczatek wywal wszystko i zostaw w mainie kawalek z dioda. W lcd.h byc moze masz zapis czestotliwosci ktory jest inny niz w mainie. Jak piszesz PORTC&=0x00 to wystarczy napisac PORTC=0x00. Zakladam ze rejestry DDR sa ustawione prawidlowo ?
  • #3 6343906
    cyber48
    Poziom 10  
    Kolego Robaku w bibliotece lcd.h mam taką linijkę:

    #define XTAL 1000000 /**< clock frequency in Hz, used to calculate
    delay timer */

    Jednak czy to w jakiś sposób może wpływać na działanie funkcji delay.h w pętli głównej programu ? Nie ukrywam, że to właśnie także do obsługi LCDka ten poprawny delay, ktory powinien dawac równo sekunde przy wywołaniu _delay_ms(1000) jest mi potrzebny.
  • #4 6343929
    Tymek92
    Poziom 10  
    Jeżeli do Atmegi nie masz podłączonego zewnętrznego rezonatora kwarcowego to nie musisz w programie definiować jego częstotliwości - jest on fabrycznie ustawiony na wewnętrzny rezonator 1MHz. Jeżeli znajdę chwilę dzisiaj napiszę Ci program mrugający diodą do 1 sekundę.
  • #6 6343961
    cyber48
    Poziom 10  
    Ok, dzięki, w sumie to racja. Ja zdefiniowałem zachowawczo, bo gdzieś spotkałem się z postem gdzie było to przyczyną błędnego odczytu UARTa, którego w swoim projekcie także będę używać.
    Taki program jestem w stanie sam sobie napisac , generalnie dioda ma mi posłużyć do tego żeby sprawdzić czy _delay_ms(1000) faktycznie robi opoźnienie = 1s. W ostateczności spróbuję napisać swojego delay'a na wstawkach asm ("nop"); chyba, że ktoś wcześniej go tu doklei :)
  • Pomocny post
    #7 6344076
    _Robak_
    Poziom 33  
    <sciana> no tak nie zauwazylem. Kolega ostrytomasz wylapal swoim bystrym wzrokiem blad. Ja zawsze robie tak ze w delayu daje maks 10ms i petla for, tak zeby sie nie zastanawiac czy jeszcze taka wartosc bedzie czy juz nie, i nigdy mnie to nie zawiodlo :) A jesli kolega Tymek92 ustawia w programie czestotliwosc procka to tylko pogratulowac.
  • #8 6344141
    cyber48
    Poziom 10  
    Po uwagach kolegi Robaka oraz ostregotomasza stwierdzam ze temat można zamknąć. Pętla for załatwiła sprawę. Dziekuje za pomoc!
REKLAMA