Elektroda.pl
Elektroda.pl
X
Relpol
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zegar czasu rzeczywistego w c++ AVR

szymonweeia 23 Kwi 2009 12:06 4487 5
  • #1 23 Kwi 2009 12:06
    szymonweeia
    Poziom 8  

    Witam wszystkich czy ktoś mógłby podpowiedzieć jak uzyskać odliczanie czasu w sek na atmedze? w programie CodevisionAVR uzyskuje taki kod w którym niby jest już jakiś wietrzny timer ustawiam go nawet na 8MHz ale nie wiem jak wyprowadzić to odliczanie sekund np na lcd wystarczy żeby ktoś podpowiedział to a dalsza cześć czyli odliczanie minut i godzin spr napisać sam;) (o ile wystarczy pisać funkcje fory klasy itp) (jestem świadom ewentualnej konieczności podłączenia zewnętrznych kwarców do atmegi)

    załączam tez screen z otwieraniem nowego projektu w tym programie. Widoczna jest zakładka z timerami

    kod "pustego" programu z działająca już obsługa LCD

    Code:
    /*****************************************************
    
    This program was produced by the
    CodeWizardAVR V2.03.4 Standard
    Automatic Program Generator
    © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com

    Project :
    Version :
    Date    : 2009-04-23
    Author  :
    Company :
    Comments:


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

    #include <mega8.h>

    // Alphanumeric LCD Module functions
    #asm
       .equ __lcd_port=0x12 ;PORTD
    #endasm
    #include <lcd.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=Out
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=1
    PORTB=0x01;
    DDRB=0x01;

    // 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: 8000,000 kHz
    TCCR0=0x01;
    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;

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

    // LCD module initialization
    lcd_init(20);

    while (1)
          {
          // Place your code here

          };
    }



    do pisania na lcd slurza funkcje:
    Code:
    /* LCD driver routines
    

      CodeVisionAVR C Compiler
      (C) 1998-2003 Pavel Haiduc, HP InfoTech S.R.L.

      BEFORE #include -ING THIS FILE YOU
      MUST DECLARE THE I/O ADDRESS OF THE
      DATA REGISTER OF THE PORT AT WHICH
      THE LCD IS CONNECTED!

      EXAMPLE FOR PORTB:

        #asm
            .equ __lcd_port=0x18
        #endasm
        #include <lcd.h>

    */

    #ifndef _LCD_INCLUDED_
    #define _LCD_INCLUDED_

    #pragma used+

    void _lcd_ready(void);
    void _lcd_write_data(unsigned char data);

    // write a byte to the LCD character generator or display RAM
    void lcd_write_byte(unsigned char addr, unsigned char data);

    // read a byte from the LCD character generator or display RAM
    unsigned char lcd_read_byte(unsigned char addr);

    // set the LCD display position  x=0..39 y=0..3
    void lcd_gotoxy(unsigned char x, unsigned char y);

    // clear the LCD
    void lcd_clear(void);

    void lcd_putchar(char c);

    // write the string str located in SRAM to the LCD
    void lcd_puts(char *str);

    // write the string str located in FLASH to the LCD
    void lcd_putsf(char flash *str);

    // initialize the LCD controller
    unsigned char lcd_init(unsigned char lcd_columns);

    #pragma used-
    #pragma library lcd.lib

    #endif

    [/code]

    0 5
  • Relpol
  • #2 23 Kwi 2009 12:53
    _Robak_
    Poziom 33  

    Jezeli nie wiesz nawet czy piszesz w C czy C++ to ja to ciezko widze.

    0
  • Relpol
  • #4 23 Kwi 2009 13:55
    szymonweeia
    Poziom 8  

    no niech będzie fakt jest to C... w takim razie czy komuś chciało by się dopisać coś do kodu który zamieściłem żeby choć wyświetlał sekundy albo choć wskazał jak to zrobić jak uzyskać zmienna reprezentującą sekundy

    a co do wypowiedzi kolegi

    kemot55 napisał:
    A może skorzystać z gotowca na stronie ATMELA:
    http://www.atmel.com/dyn/resources/prod_documents/Avr134.zip
    (źródło chyba zgodne z kompilatorem IAR)


    to dziękuję ;) właśnie walczę z kompilacja ;/

    0
  • #5 23 Kwi 2009 14:20
    _Robak_
    Poziom 33  

    Ten kod jest pod gcc, wiec proponuje go skompilowac w avrstudi a nie w codevision ;) Co nie znaczy ze po malych przerobkach nie bedzie sia dalo :)

    0
  • #6 25 Kwi 2009 18:01
    szymonweeia
    Poziom 8  

    kompilowałem pod codevisionAVR zmieniłem na atmege8 i zamieściłem brakująca bibliotekę ale wyskakuje błąd:

    Code:
    Error: C:\cvavr2\inc\pgmspace.h(211), included from: ina90.h: incomplete type is not allowed


    a dotyczy to pliku (jakiejś biblioteki) który przekopiowałem z folderu WINAVR

    znalazłem linie której tyczy się ten błąd
    zamieszczam fragment tego pliku z ciekawa notatka może ktoś zechce pomoc


    Code:
    /**
    
       \ingroup avr_pgmspace
       \typedef prog_uint64_t

       Type of an "uint64_t" object located in flash ROM.

       \note This type is not available when the compiler
       option -mint8 is in effect.
    */
    typedef uint64_t PROGMEM prog_uint64_t;
    #else  /* !DOXYGEN */
    typedef void prog_void PROGMEM;
    typedef char prog_char PROGMEM;
    typedef unsigned char prog_uchar PROGMEM;

    typedef int8_t    prog_int8_t   PROGMEM;
    typedef uint8_t   prog_uint8_t  PROGMEM;
    typedef int16_t   prog_int16_t  PROGMEM;
    typedef uint16_t  prog_uint16_t PROGMEM;
    typedef int32_t   prog_int32_t  PROGMEM;
    typedef uint32_t  prog_uint32_t PROGMEM;
    #if !__USING_MINT8
    typedef int64_t   prog_int64_t  PROGMEM;
    typedef uint64_t  prog_uint64_t PROGMEM;
    #endif
    #endif /* defined(__DOXYGEN__) */

    /* Although in C, we can get away with just using __c, it does not work in
       C++. We need to use &__c[0] to avoid the compiler puking. Dave Hylands
       explaned it thusly,

         Let's suppose that we use PSTR("Test"). In this case, the type returned
         by __c is a prog_char[5] and not a prog_char *. While these are
         compatible, they aren't the same thing (especially in C++). The type
         returned by &__c[0] is a prog_char *, which explains why it works
         fine. */

    0
  Szukaj w 5mln produktów