Forum: Compiler & IDEs Menü ohne Bremse morsen


von Peter S. (petx)


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);
}

von Karl H. (kbuchegg)


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.

von Peter S. (petx)


Lesenswert?

super,
danke Karl Heinz wieder was dazugelernt.

von Karl H. (kbuchegg)


Lesenswert?

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 ...

von Peter S. (petx)


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

von Peter S. (petx)


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?

von Peter S. (petx)


Lesenswert?

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.

von Jonas B. (jibi)


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

von Peter S. (petx)


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?

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
Noch kein Account? Hier anmelden.