- 3D-Druck Einstieg und Tipps         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 24 von 24

Thema: Sei() Cli() Atmega 16 Timer starten/stoppen

  1. #21
    Benutzer Stammmitglied
    Registriert seit
    20.03.2010
    Beiträge
    50
    Anzeige

    E-Bike
    Ich kann Zeit stoppen Hab sei(); vergessen
    Und jetzt wird sie mir angezeigt....meeeeega cool Vielen vielen Dank fuer deine Hilfe!!!!!!
    Weisst du wie genau meine Zeitmessung hier ist...

    Viele Gruesse Jimmy

  2. #22
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Weisst du wie genau meine Zeitmessung hier ist...
    Super wenns läuft.
    Wie genau das Ganze ist lässt sich so einfach gar nicht beantworten.
    Ich würd den Code mal mit dem Simulator von AVR Studio austesten und dabei mit der Stoppuhr die Zeit für einen Schleifendurchlauf der Hauptschleife messen.
    Das wär schon mal ein Anhaltspunkt.
    Da ja im Hauptprogramm verschiedene Programmteile und Funktionsaufrufe durchlaufen werden können ändert sich dies Zeit natürlich.

  3. #23
    Benutzer Stammmitglied
    Registriert seit
    20.03.2010
    Beiträge
    50
    Mhhh...die Zeit is ziemlich genau messbar..kommt bis auf eine Sekunde eigentlich immer der gleiche Wert raus...und das hängt auch davon ab wie genau ich beide Taster zeitgleich drücke...also fuer meine Anwendung reicht die Genauigkeit auf jeden Fall!! Jetzt wird erstmal gestoppt was das Zeug hält Ich werd mal schaun ob ch irgendwie was über diese Interruptausgabe da find...hast du da vielleicht nen Anhaltspunkt bzw. nen guten Link? Danke nochmal fuer deine Hilfe...hast mir sehr geholfen !!!

    Gruss Jimmy

  4. #24
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Ich versuch das mal mit einem Codeschnipsel für Codevision AVR.
    Wie das dann bei AVR GCC auszusehen hat musst Du selber testen.

    Code:
    //Paremeter definitionen
    #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 Puffer einrichten = Maximale Zeichenanzahl
    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 64
    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
    
    //Sende Interrupt Routine
    // 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;
       };
    }
    
    //Neudefinition des putchar Befehles
    #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
    
    ...
    
    //Initialisierung des USART
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: Off
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 38400
    UCSRA=0x00;
    UCSRB=0x48;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x0C;
    
    ...
    
    //Ausgabe des Strings uc_textbuffer mittels eines Schleifenbefehls
    //Die Zeichen werden im Puffer abgelegt und durch die Interruptroutine
    //selbstständig versendet
    for(uc_i=0;uc_i<strlen(uc_textbuffer);uc_i++)
            {
            putchar(uc_textbuffer[uc_i]);
            }
        putchar('\r');
        putchar('\n');
    Bis auf die Stringausgabe wurde das Programm durch den Compiler erzeugt.
    Der USART Sendepuffer geht natürlich auf Kosten des RAM Speichers, da der Bereich ja ständig freigehalten werden muß.
    Man sollte ihn also nur so groß wählen wie man ihn zur Ausgabe der gewünschten Zeichen wirklich braucht.

Seite 3 von 3 ErsteErste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen