mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik if,led&taster????


Autor: Fuzzy Fuzzy (fuzzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute!
Ich lass mir von PC Daten an den Mikrocontroller senden. Dieses möchte 
ich ggf mit Tastendruck vergrößern oder verkleiner.Das Problem ist 
jetzt, dass das mit dem Aufaddieren bzw. Subtrahieren nicht klappt.Lass 
mir das, was der Mikrocontroller vom PC kriegt ausgeben, und da passiert 
nicht!!
Weiß jemand vielleicht, was hier falsch ist???

 if (PIND=0b00000100)      //pind.2==1
   {
      Pcdaten = Pcdaten + 90;
  }

   if (PIND=0b00001000)        //pind.3==1
   {
      Pcdaten = Pcdaten - 90;

}

Verwende einen ATmega16 mit dem Atmel Evaluationboard.

mfg fuzzy

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>if (PIND=0b00000100)      //pind.2==1


Falsch siehe AVR GCC tutorial, vielleicht meinst du eher so if (PIND == 
0b00000100)

Autor: Fuzzy Fuzzy (fuzzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DAs hab ich schon ausprobiert aber daran liegt´s nicht.

Kann das sein, dass das daran liegt, dass ich den PortD als Ausgang 
nutze? Das kann ich aber nicht ändern??????

  DDRA = 0x00;     //port A input
  DDRB = 0xFF;      // port B output
  DDRC = 0x00;    // port C input
  PINC=0x00;
  DDRD = 0xFF;

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst die Bits, die Du abfragen willst, schon ausmaskieren. Wie das 
geht, steht auch im Tutorial. Wenn Du abfragst
if(PIND == 0b00000100)
{
    //Code
}
wird der Inhalt des if-Blocks nur dann ausgeführt, wenn PIND tatsächlich 
exakt gleich 0b00000100 ist. Wenn irgendwelche anderen Pins noch genutzt 
werden, über deren Zustand Du nichts weißt, dann haut das halt nicht 
hin.

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>dass ich den PortD als Ausgang
>nutze? Das kann ich aber nicht ändern??????

PIN funktioniert dann trotzdem und liefert die AFAIR den Pegel am 
Ausgang zurück.

Wieso kannst du die Richtung nicht ändern?

Höchstwahrschein könnte man dir besser helfen, wenn man auch die 
Schaltung zu deinem Problem und vielleicht auch noch mehr deines Codes 
sehen würde.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BTW: Wie sind die Tasten angeschlossen? Low-Side (übliche Variante, da 
interne Pull-Ups nutzbar) oder High-Side (unüblich)? Und: wenn Du die 
Taster zyklisch abfragst (sprich: wenn Deine if-Abfrage in einer 
Schleife steht), dann zählt Dir der µC u.U. so schnell hoch, so schnell 
kannste gar nicht gucken...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PINC=0x00;
Das ist übrigens völlig wirkungslos. Die PINx-Register sind beim Mega16 
allesamt read-only!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, wenn Du Taster abfragen willst, die tatsächlich High-Side (also 
gegen +5V) angeschlossen sind und Du den Port so initialisiert hast wie 
oben steht, dann haste Dir voraussichtlich schon beim ersten Tastendruck 
den betreffenden Portpin zerbrutzelt... Wundere Dich dann also nicht, 
wenn da in Zukunft gar nichts mehr funktioniert.

Beim DDRD musst Du natürlich die Pins, die Du als Eingänge nutzen 
willst, auch als solche konfigurieren, sonst sind Fehlfunktionen und 
Kurzschlüsse "vorprogrammiert" (im wahrsten Sinne des Wortes!).

Autor: Fuzzy Fuzzy (fuzzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier das ganze Programm:
Könnte sein, dass das mit der Geschwindigkeit zwischen Drücken und 
Schleifendurchlauf nicht klappt. Aber wie mach ich denn das???

#include<avr/io.h>
#include<inttypes.h>
#include <avr/pgmspace.h>

int main (void)
{

  MCUCSR = (1<<JTD);
  MCUCSR = (1<<JTD);
  DDRA = 0x00;     //port A input
  DDRB = 0xFF;      // port B output
  DDRC = 0x00;    // port C input
  //PORTC= 0x00;
  PINC=0x00;
  DDRD = 0xFF;

  int x = 0;
  unsigned char Bsend;
  int B,C,g,Pcdaten;
  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
  ADMUX = 0;
  ADMUX = (1<<REFS1) | (1<<REFS0);
  // Select pin ADC0 using MUX
  // Activate ADC with Prescaler 128 -->16Mhz/128 = 125kHz

  //Start conversion
    ADCSRA |= (1<<ADSC);
  // wait until converstion completed
   while (ADCSRA & (1<<ADSC) )

  for (;;) {
  ADCSRA |= (1<<ADSC);
  while (ADCSRA & (1<<ADSC) )
    // get converted value
 //   x = ADCW;
//  x=x-240;          //Gesamtbereich von 1024 ( 4x(0bis255)) 
Subtraktion
                //damit Mittelstellung für Fuzzifizierung 110 ist

  x=Pcdaten;
   Bsend = x & 0b00001111;
   PORTB = Bsend;


  Bsend = x & 0b11110000;
  Bsend=Bsend>>4;
  Bsend = Bsend + 128;
  PORTB = Bsend;


  Pcdaten = PINC;



   if (PIND==0b00000100)      //pind.2==1
   {
      Pcdaten = Pcdaten + 90;
  }

   if (PIND==0b00001000)        //pind.3==1
   {
      Pcdaten = Pcdaten - 90;
  }


  C = 600;

    B = C - Pcdaten;

    g = 0;

// Anschalten der LED
  //PORTD &= ~(1<<PD5);
  PORTD =0b00100000;

   while (g < Pcdaten)
  {

       g = g + 1;
  }
 // Ausschalten der LED

//PORTD=0;
   //PORTD |= (1<<PD5);
 PORTD = 0b00000000;
   g = 0;

  while (g < B)
  {

       g = g + 1;
  }

  }
  ADCSRA &= ~(1<<ADEN);

}

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte bitte bitte arbeite zuerst mal das Tutorial durch! Da sind so 
viele Anfängerfehler drin (inkl. derjenigen, die ich oben schon en 
détail beschrieben habe), die man alle vermeiden kann, wenn man nicht 
die Hau-Ruck-Methode anwendet, sondern sich erst mal mit den Grundlagen 
(und zwar sowohl der Hard- als auch der Software) befasst. Auch die 
Auswertung von Tastern gehört dazu.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Könnte sein, dass das mit der Geschwindigkeit zwischen Drücken und
> Schleifendurchlauf nicht klappt.

Du gehst in die Codesammlung
und suchst nach dem Entprell-Thread von Peter Danegger.
Die enthält eine Tasten-Einleseroutine, die so ziemlich
alle Stückeln spielt die du brauchst.

* Einzeltastendruck erkennen
* Erkennen ob die Taste länger gedrückt wurde
* Entprellen der Tasten

Damit ist es dann ein Klacks einen Zahlenwert mit
einem Tastendruck zu erhöhen/erniedrigen. Und wenn
man länger auf der Taste draufbleibt, dann beginnt
der Zahlenwert durch den Autorepeat in annehmbaren
Schritten größer / kleiner zu werden.

Kann man nur empfehlen das Teil.

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.