mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik pwm ansteuern mittles taster


Autor: vianney (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vianney schrieb:

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

    while(1)
    {

//
// Wenn du innerhalb der Schleife den OCR1B jedesmal erneut auf
// 340 setzt, dann wird es wohl nichts werden mit: Bei jedem Tastendruck
// zum OCR1B 10 dazu oder weg
//
      OCR1B = 340;
      ButtonControl();

      if(S1)
      {
        OCR1B = OCR1B+10;
        S1 = false;
      }

      if(S2)
      {
        OCR1B = OCR1B-10;
        S2 = false;
      }

//
// Ah ja.
// der return innerhalb der while-Schleife
// Tja. Das wird dann wohl nichts, mit einer Endlosschleife
// denn der Schleifenrumpf wird nur einmal durchlaufen, und danach
// gehts aus main raus.
// Ist dir das denn gar nicht aufgefallen, dass nach dem return 2 Stück
// schliessende } in deinem Code auftauchen und damit das return innerhalb
// irgendeiner Kontrollstruktur sein muss.
// Ach ne, ich vergass: Du hast ja auf konsistente Einrückungen gepfiffen
//
      return 0;
    }
 }

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void ButtonControl()
{
  char SavePORTC = PORTC;
  char SaveDDRC  = DDRC;

  PORTC |= (1<<PC0) | (1<<PC1) ;
  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.

Autor: vianney (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank hab den fehler gesehen
grüß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.