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
Druckbare Version
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
Super wenns läuft.Zitat:
Weisst du wie genau meine Zeitmessung hier ist...
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.
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
Ich versuch das mal mit einem Codeschnipsel für Codevision AVR.
Wie das dann bei AVR GCC auszusehen hat musst Du selber testen.
Bis auf die Stringausgabe wurde das Programm durch den Compiler erzeugt.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');
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.