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


von Fuzzy F. (fuzzy)


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

von Dirk (Gast)


Lesenswert?

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


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

von Fuzzy F. (fuzzy)


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;

von johnny.m (Gast)


Lesenswert?

Du musst die Bits, die Du abfragen willst, schon ausmaskieren. Wie das 
geht, steht auch im Tutorial. Wenn Du abfragst
1
if(PIND == 0b00000100)
2
{
3
    //Code
4
}
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.

von fieser, klugscheissender Rahul (Gast)


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.

von johnny.m (Gast)


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

von johnny.m (Gast)


Lesenswert?

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

von johnny.m (Gast)


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

von Fuzzy F. (fuzzy)


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

}

von johnny.m (Gast)


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.

von Karl heinz B. (kbucheg)


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.

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.