Menü ohne Bremse morsen

OP #2918638
Lesenswert?

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);
}
#2918688
Lesenswert?

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.
OP #2918702
Lesenswert?

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
OP #2918703
Lesenswert?

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?
#2920382
Lesenswert?

>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
OP #2921554
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren