Forum: Mikrocontroller und Digitale Elektronik pwm ansteuern mittles taster


von vianney (Gast)


Lesenswert?

hallo,
ich wende mich noch an alle an, und hoff könnt ihr mir noch helfen. ich 
will an atemga88 mittel taster die pulsbreite meiner pwm ansteuer d.h 
durch z.b drück des taster s1 die puslbreite schmaller ist bwz. s2 
umgekehrt; diepulsbreite sollte sich zwischen 4ms und 20ms verändern . 
ich habe das ganze mit dem timer1, um meine frequenz gleich zu halten 
hab ich den top-wert an icr1 gemacht. jetzt weiss ich sollt einfach den 
ocr1b in der whileschleife durch die passende befehle um mittel taster 
zu steuern,anspielen lassen. aber das funktioniert nicht, und ich 
verstehe net wo der fehler sein könnte.
so sieht das code aus.
// Funktion Tastenentprellen
// ----------------------------------
inline uint8_t debounce(volatile  uint8_t *port, uint8_t pin)
{
  if(!(*port & (1<<pin)))
  {
    _delay_ms(100);
    if((*port &(1<<pin)))
    {
      _delay_ms(100);
      return (true);
    }
  }
  return 0;
}

int main (void)
  //Hauptprogramm
{
    DDRB |= (1 << PB2);
    TCCR1A |= (1<<COM1B0)|(1<<COM1B1) ;
    TCCR1B |= (1<<WGM13)|(1<<CS10)|(1<<CS12);
    ICR1 = 450;

    while(1)
    {
     OCR1B=340;
    ButtonControl();
   if(S1)
    { OCR1B=OCR1B+10;
      S1=false;
    }
  if(S2)
    {OCR1B=OCR1B-10;
     S2=false;
    }
    return 0;
 }
}

void ButtonControl()
{
  char SavePORTC = PORTC;
  char SaveDDRC  = DDRC;

  PORTC |= (1<<PC0) | (1<<PC1) ;
  DDRC &= ~((1<<DDC0) | (1<<DDC1));

  if (debounce(&PINC, PC0))  //Taste S1
  {S1=true;
  }
  if (debounce(&PINC, PC1))   //Taste S2
  {S2=true;
  }

  PORTC = SavePORTC;
  DDRC = SaveDDRC;        // Laden des alten Portzustandes
}

danke

von Dave (Gast)


Lesenswert?

in der funktion:
inline uint8_t debounce(volatile  uint8_t *port, uint8_t pin)

--> if(!(*port & (1<<pin)))

ersetzen durch:

while(!(*port & (1<<pin)))

Freundliche Grüsse
Dave

von Karl H. (kbuchegg)


Lesenswert?

Dave schrieb:
> in der funktion:
> inline uint8_t debounce(volatile  uint8_t *port, uint8_t pin)
>
> --> if(!(*port & (1<<pin)))
>
> ersetzen durch:
>
> while(!(*port & (1<<pin)))

In dem Fall nicht.
debounce liefert false, wenn zur Zeit keine Taste gedrückt ist.
AUch wenn ich mit dieser debounce Funktion nicht glücklich bin, ist sie 
schon so in Ordnung, wie sie im Original ist.

von Karl H. (kbuchegg)


Lesenswert?

vianney schrieb:

Einrückungen!
1
int main (void)
2
  //Hauptprogramm
3
{
4
    DDRB |= (1 << PB2);
5
    TCCR1A |= (1<<COM1B0)|(1<<COM1B1) ;
6
    TCCR1B |= (1<<WGM13)|(1<<CS10)|(1<<CS12);
7
    ICR1 = 450;
8
9
    while(1)
10
    {
11
12
//
13
// Wenn du innerhalb der Schleife den OCR1B jedesmal erneut auf
14
// 340 setzt, dann wird es wohl nichts werden mit: Bei jedem Tastendruck
15
// zum OCR1B 10 dazu oder weg
16
//
17
      OCR1B = 340;
18
      ButtonControl();
19
20
      if(S1)
21
      {
22
        OCR1B = OCR1B+10;
23
        S1 = false;
24
      }
25
26
      if(S2)
27
      {
28
        OCR1B = OCR1B-10;
29
        S2 = false;
30
      }
31
32
//
33
// Ah ja.
34
// der return innerhalb der while-Schleife
35
// Tja. Das wird dann wohl nichts, mit einer Endlosschleife
36
// denn der Schleifenrumpf wird nur einmal durchlaufen, und danach
37
// gehts aus main raus.
38
// Ist dir das denn gar nicht aufgefallen, dass nach dem return 2 Stück
39
// schliessende } in deinem Code auftauchen und damit das return innerhalb
40
// irgendeiner Kontrollstruktur sein muss.
41
// Ach ne, ich vergass: Du hast ja auf konsistente Einrückungen gepfiffen
42
//
43
      return 0;
44
    }
45
 }

Fazit: Deine beiden Fehler hätte man ganz leicht sehen können, wenn man 
sich an Codeformatierungen hält.

von Karl H. (kbuchegg)


Lesenswert?

1
void ButtonControl()
2
{
3
  char SavePORTC = PORTC;
4
  char SaveDDRC  = DDRC;
5
6
  PORTC |= (1<<PC0) | (1<<PC1) ;
7
  DDRC &= ~((1<<DDC0) | (1<<DDC1));

Lass das DDR Register und das Port Register in Ruhe!
Diese Einstellung macht man einmal am Programmanfang und dann lässt man 
sie in Ruhe.

von vianney (Gast)


Lesenswert?

vielen dank hab den fehler gesehen
grüß

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.