Forum: Mikrocontroller und Digitale Elektronik frage zu at mega 32


von Stefan B. (stefan83)


Lesenswert?

hallo ich bin ein absuluter neuling was win avr betrifft hab vorher nur 
ein bisschen c und step 7 geschrieben
ich habe eine platine mit einem at mega 32 und will eine taster 
schaltung programieren mit der ich leds ein und ausschalten kann möchte 
aber mit nur einem taster ein und danch wieder aus schalten können .
ich habe vorher ein taster programiert in dem ich 2 taster hatte das war 
ja kein prob aber mit einem ???????

mein programm hab ich einfach mit if geschrieben also zb
if (PINA == 0x04)
PORTB = 0xff;
funktioniert wunderbar aber halt nur das einschalten das ausschalten 
bekomm ich nicht hin kann ich irgendwie einen merker creieren oder was 
ähnliches um meinen zustand zu speichern oder wie mach ich das am 
besten?

von Matthias L. (Gast)


Lesenswert?

1
if (PINA == 0x04)
2
{  
3
  PORTB = 0xff;
4
}
5
else
6
{
7
  PORTB = 0x00;
8
}

von Stefan B. (stefan83)


Lesenswert?

danke erst ma für die antwort welche mir leider nicht weiter hilft da 
ich eine taster schaltung (beim drücken bekomm ich ne 1 und beim 
loslassen wieder ne null ;) ) also keine mit schalter programieren 
möchte
die zeilen von mir schreib ich hier noch ma komplett hin also die while 
schleife :
while (1)
{
   if((PINB & 0x04) == 0x04)
   PORTC = 0xff;

weiter komm ich nicht da ich nicht weiss wie ich den zustand speichern 
kann um ihn danach abfragen zu können also wenn die leds an sind und 
dann der PINB 0x04 brkommt müssen die leds ausgehen
nur wie mach ich das ??

von Matthias L. (Gast)


Lesenswert?

Also du willst das:
1x drücken -> an,
nochmal drücken aus?

dann probiere das:
1
while (1)
2
{
3
   if(    ( (PINB & PB2) == PB2 )
4
       && (  merker      == 0   )  )
5
   { 
6
     merker = 1;
7
     PORTC ^= 0xFF;
8
   }
9
   else
10
   {
11
     merker = 0;
12
   }
13
}

Hier ist aber der Taster noch nicht entprellt....

von Stefan B. (stefan83)


Lesenswert?

cool das sieht ma ordentlich aus aber was bedeutet der taster is noch 
nicht entprellt?

von Muckel (Gast)


Lesenswert?

Wenn der Taster gedrückt wird gibt er mehrere sehr schnell 
hintereinander folgende impulse ab. Wegen mechanischen Schwingungen und 
Funken am Kontakt.
Das bedeutet, du drückst einmal den Taster dein Programm bekommt aber 
die Information, dass der Tasta etwa 5 mal sehr schnell hintereinander 
gedrückt wurde.

Das lässt sich glaube ich mit einem Kondensator lösen oder in deinem 
Fall einfacher mit einer Zeiterzögerung, sobald ein Tastendruck 
angekommen ist.

#include <util/delay.h>
while (1)
{
   if(    ( (PINB & PB2) == PB2 )
       && (  merker      == 0   )  )
   {
     merker = 1;
     PORTC ^= 0xFF;
     _delay_ms(100);
   }
   else
   {
     merker = 0;
   }
}

Versuche es so, wenn nun ein Tastendruck gekommen ist wartet er 0,1 sek.
bis das Programm weiter läuft.

von Stefan E. (sternst)


Lesenswert?

Der Code wird so nicht funktionieren. Weder die Ports, noch die 
merker-Logik stimmen.
Du kannst es z.B. so machen:
1
while (1)
2
{
3
  if (PINA & (1<<PA2)) {
4
    if (merker == 0) {
5
      PORTB ^= 0xff;
6
      merker = 1;
7
      _delay_ms(100);
8
    }
9
  }
10
  else {
11
    merker = 0;
12
  }
13
}

von Stefan B. (stefan83)


Lesenswert?

ah so naja ich denke aber ma das die kondesatoren auf der platine 
vorhanden sind da ich sie in der technicker schule gelötet habe (nach 
vorgegebenen plänen) bin ich mir allerdings nicht sicher da ich keinen 
schaltplan sondern nur ne löt anweisung dazu besitze werds ja dann 
merken

gibt es eigendlich ein zu empfehlendes tutorial oder ähnliches wie beim 
c wo man einfache programme schreiben kann und dann ausprobieren kann ??

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.