Hallo,
habe dank eurer Hilfe einen Timer des tiny85 für pwm, einen für pd
Entprellung verwendet. Nun würde ich gerne kurze Menüauswahl morsen ohne
aber alles mit den Warteschleifen auszubremsen. Versucht habe ich
folgendes im main, ist aber sicher der falsche Weg, bei Menü 4 ....-
würde das alles ausbremsen.
if( get_key_short( 1<<KEY1 ))
{ menu= menu+1;
if (menu>4) menu=0;
}
if(menu==1)
{
...setze duty 1 etc
PORTB |= 1 << LEDx;
delay_ms1(1000);
PORTB &= ~(1 << LEDx);
delay_ms1(1000);
}
Peter E. schrieb: > Hallo, > habe dank eurer Hilfe einen Timer des tiny85 für pwm, einen für pd > Entprellung verwendet. Auf welche Zeit ist der Entprelltimer eingestellt. Den kann man sicher nicht mitbenutzen um damit eine 'Eieruhr' zu realisieren. Nach dem Muster
1 | volatile uint16_t downTimer; |
2 | |
3 | ISR( ... ) |
4 | {
|
5 | if( downTimer > 0 ) |
6 | downTimer--; |
7 | |
8 | ....
|
9 | restlicher Entprellcode |
10 | }
|
11 | |
12 | |
13 | int main() |
14 | {
|
15 | ....
|
16 | |
17 | |
18 | while( 1 ) { |
19 | |
20 | ....
|
21 | if( irgendwas ) { |
22 | Led einschalten; |
23 | cli(); |
24 | downTimer = 500; // nur Beispielsweise. Die Zahl richtet sich |
25 | // dann danach, wie oft die ISR aufgerufen wird
|
26 | sei(); |
27 | }
|
28 | |
29 | if( downTimer == 0 ) |
30 | Led ausschalten |
31 | |
32 | }
|
33 | }
|
Also: eine Variable fungiert als Zähler, die in der Timer ISR in regelmässigen Zeitabständen runtergezählt wird. Durch Zuweisen einer Zahl 'startet' dieses runterzählen und wenn die Variable bei 0 anbgelangt ist, dann ist die durch die Zahl eingestellte Zeit verstrichen. Wie bei einer Sanduhr, die man zum Eierkochen benutzt. Ausgehend davon, kannst du dann deine Blinker realisieren. PS: was mit einer Variablen geht, geht auch mit 10. Dann hat man 10 Eieruhren, du unabhängig voneinander runterzählen.
Karl Heinz Buchegger schrieb: > Auf welche Zeit ist der Entprelltimer eingestellt. > Den kann man sicher nicht mitbenutzen um damit eine 'Eieruhr' zu > realisieren. Autsch. Das 'nicht' sollte eigentlich ein 'noch' sein! Den kann man sicher noch mitbenutzen um ...
meinst du den ? TCNT1 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-6 + 0.5); musste damit etwas rumschrauben bis das Tastenfeeling passte im Moment hab ich F_CPU 10000000 eingestellt. hab aber einen neuen erstellt und bin begeistert, keine Warteschleifen Bremse mehr. Danke
hätte da noch eine Frage, get_key_long und get_key_rpt aus PD's c-Luxusfunktion funktionieren beide truamhaft, beisen sich logischerweise wenn sie am selben Taster laufen (hab noch nicht probiert die REPEAT_START extrem hoch zu setzen), aber wie würde es mit einem Doppelcklick ausschauen, wäre das ohne riesen Aufwand zu realisieren? Vielleicht in der ISR mit einem Zähler ( key_press |= key_state & i;) nochmal abfragen?
ok, habs hinbekommen
if( get_key_short( 1<<KEY1 )) // kurzer Tastendruck
{
if(dcTimer>0) //doppelclick
{
mach irgenwas
}
else //singelclick
{
dcTimer=100;
} //ende singleclick
}
weis zwar nicht obs vernünftiger ginge, aber es funktioniert.
>musste damit etwas rumschrauben bis das Tastenfeeling passte >im Moment hab ich F_CPU 10000000 eingestellt. F_CPU ist nicht frei wählbar, sondern sollte deine eigentliche Quarzfreuquenz wiederspiegeln. Einige libs (delay.h usw.) kommen sonst ausm Takt. Also was hasten fürn Quarz? Gruß Jonas
hab im Moment keinen Quarz angeschlossen, sondern den internen in Verwendung. War der Meinung im Studio > Toolchain > Symbols (allconfigs) das "F_CPU=10000000UL" würde die Frequenz bestimmen, habe aber gerade unter Device Programming > Fuses unter SUT_CKSEL den Eintrag "INTRCOSC_8MHZ_6CK_14CK_64MS" gefunden. Muss ich jetzt mein Symbol und das C-file auf die 8MHz anpassen um richtig zu liegen?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.