if,led&taster????

OP #473122
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
OP #473142
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;
Gast #473148
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.
Gast #473149
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.
Gast #473156
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...
Gast #473182
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!).
OP #473187
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);

}
Gast #473196
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.
#473197
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren