Zuerst solltest Du die Variable TD in einen String umwandeln
unsigned char uc_string[6]; //Stringvariable anlegen.
......
itoa(TC,uc_string);
Dann wird dieser String per USART gesendet.
Wie das geht ist von Compiler zu Compiler und der Art des Versendens abhängig.
Beispiel:
print(uc_string); //Senden - CR = Carriage Return und LF Line Feed anfügen
printf("\r\n");
sprint(uc_string); //Senden - CR und LF anfügen
sprintf("\r\n");
for(i=0;i<strlen(uc_string);i++)
{
putchar(uc_string[i]) //Senden
}
putchar('\r'); //CR und LF anfügen
putchar('\n);
Guck aber in deiner Library für die serielle Schnittstelle nach, wie das bei Dir gehandelt wird, welche Syntax verwendet wird und welche Befehle auf diese umgeroutet werden.
Anbei noch ein kurzes Codeschnipsel, das für Deinen Anwendungsfall nicht optimal ist, aber gut zeigt wie das Ganze funktioniert.
In diesem Beispiel wird bei einer steigenden Flanke am ICP Pin der alte Wert des Timers ausgelesen und das Sensing auf fallende Flanke umgestellt.
Fällt die Flanke dann wird der zweite Teil der Routine angesprochen,der aktuelle Wert ermittelt und der vorher ermittelte alte Wert abgezogen.
Dann wird das Sensing wieder auf steigende Flanke für den nächsten Impuls umgestellt.
Es wird also die High Time des Impulses ermittelt.
Das Ganze gehört zu einer Servoimpulsauswertung, bei der eigentlich nur die High Impulslänge wichtig ist.
Für deine anwendung kannst Du die beiden Codeteile in deinen beiden Tastenabfrage unterbringen.
Code:
// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
if((TCCR1B&0b01000000)>0) //Interrupt wurde durch steigende Flanke ausgelöst
{
ui_oldrise=ICR1; //Messwert der steigenden Flanke ablegen
TCCR1B&=0b10111111; //Interupt Sensing auf fallende Flanke umstellen
}
else //Interrupt wurde durch fallende Flanke ausgelöst
{
ui_pulsebuffer=ICR1-ui_oldrise; //Pulslänge berechnen
TCCR1B|=0b01000000; //Interrupt Sensing auf steigende Flanke Umstellen
}
}
Ich würde die Tastenabfragen in Deiner Anwendung über Interrupts abwickeln.
Wenn Du z.B. ein Display an deinem System hast, verbringt der Controller oft sehr lange Zeiten in den Displayroutinen.
Während dieser Zeiten werden die Taster nicht abgefragt und somit die Auslösezeit nicht exakt ermittelt.
Machst Du die Tastenabfrage im z.B. INT 0 wird die Displayroutine unterbrochen und diese Tastenabfrage sofort ausgeführt.
Die Zeiten werden dadurch nicht 100% genau, aber wesentlich genauer, als bei Deinem Verfahren, das man übrigens POLLING nennt.
Noch was solltest Du beachten - Tasten prellen.
Das bedeutet eine Taste schließt und offnet bei Betätigung mehrmals, bevor der Kontakt letztlich offen bzw. geschlossen ist.
Bei Deinem 2 Tasten System ist das eigentlich kein Problem, trotzdem sollte Dein Code damit zuecht kommen.
Lesezeichen