Schalter Attiny13

Gast #3163330
Lesenswert?

Hallo,

ich habe hier zwar schon einige Beiträge gefunden zum Thema, aber keine 
konnten mir weiterhelfen.

Ich bringe mir gerade selbst die Grundlagen in Sachen yC bei, aber komme 
selbst mit AVC Tutorial nicht weiter. Attiny 13 // Programmiersprache C

Ich will einen einfachen Schalter bauen. Wenn an einem Port 5 Volt 
anliegen oder nicht, soll ein anderer PIN geschaltet werden...

Hier das Programm:

void main ()
{

  DDRB  &= ~(1<<PB3);    // PB3 auf Eingang
  PORTB |= (1<<PB3);    // PullUp aktivieren
  DDRB  |= (1 << PB4);    // PB4 auf Ausgang

   while(1)
      {
if  (PORTB = (1<<PB3))  // Bedingung, dass an PB3 5 Volt anliegt
   {
   }
else
   {
PORTB |= (1<<PB4);//Wenn keine 5 Volt an PB3, dann PB4 auf high schalten
   }

      }
}

Danke im Voraus
Gast #3163346
Lesenswert?

> if (PORTB = (1<<PB3))  // Bedingung, dass an PB3 5 Volt anliegt

if  ( (PINB & (1 << PB3)) == (1 << PB3) ) ...

- auf das doppelte Gleichheitszeichen achten!
- PINB (Eingänge), statt PORTB (Ausgänge) verwenden

oder

if  ( PINB & (1 << PB3) ) ...

- ist wahr, wenn der Portpin PB3 High ist

- ist unwahr, wenn der Portpin PB3 Low ist
#3163368
Lesenswert?

Und bitte:

zeig immer ausnahmslos dein vollständiges Programm!

(Und ein wenig Arbeit an deiner Codeformatierung würde auch nicht 
schaden. Es dürfte kein Zufall sein, dass immer die mit dem 
scheuslichsten und unübersichtlichsten Code diejenigen sind, bei denen 
nichts funktioniert. Fang nicht irgendwann damit an, nicht nachher, 
nicht in 2 Wochen, nicht wenn die Programme umfangreicher werden sondern 
JETZT! Konsistente Einrückung ist kein Selbstzweck sondern eine Hilfe 
für den Programmierer.)
Gast #3163376
Lesenswert?

Ja so funktioniert das jetzt, wenn PB3 auf Masse gezogen wir schaltet 
PB4....ich versuche jetzt mal das ganze herum zu drehen, also das PB4 
schaltet, wenn PB3 5 volt anliegt und wenn PB3 auf Masse geht PB4 auf 
low gesetzt wird
Persönliche Seite #3163387
Lesenswert?

Bastler schrieb:
> ich versuche jetzt mal

Nicht versuchen, Tu es!

Wobei ich denke, dass dir nicht klar ist was du da tust. Dein PB3 hat 
einen Pull-Up, daher wird dein Taster oder Schalter immer auf Masse 
ziehen müssen bei Betätigung. Es sei denn, du deaktivierst den Pull-Up 
und schaltest einen Pull-Down extern dran.

Und noch ein Tipp zum setzen und löschen von Bits:

http://www.mikrocontroller.net/articles/Bitmanipulation
Gast #3163452
Lesenswert?

Ich glaub jetzt hab ich das mit dem Pull Ups verstanden.

So läuft das ganze jetzt auf ein High Signal mit Pull Down Widerstand

void main ()
{

   DDRB  &= ~(1<<PB3);    // PB3 auf Eingang
   DDRB  |= (1 << PB4);    // PB4 auf Ausgang

    while(1)
   {
     if  ( (PINB & (1 << PB3)) == (1 << PB3) )

      {
       PORTB |= (1<<PB4);
      }
     else
      {

            }

  }
}

Aber verstehe ich das richtig,

PORT benutze ich immer bei Ausgängen,
PIN immer bei Eingängen

Vielen Dank Steve F. !!!!!
#3163500
Lesenswert?

Bastler schrieb:
> void main ()
>
> {

>    DDRB  &= ~(1<<PB3);    // PB3 auf Eingang
>
>    DDRB  |= (1 << PB4);    // PB4 auf Ausgang
>
>     while(1)
>
>    {
>      if  ( (PINB & (1 << PB3)) == (1 << PB3) )
>
>       {
>
>        PORTB |= (1<<PB4);
>
>       }
>
>      else
>
>       {
>
>
>
>             }
>
>
> }

Karl Heinz Buchegger schrieb:
> Und ein wenig Arbeit an deiner Codeformatierung würde auch nicht
> schaden.
Auch wenn es funktioniert, solltest du dir das zu Herzen nehmen.
1
int main (void)
2
{
3
   DDRB  &= ~(1 << PB3);    // PB3 auf Eingang
4
   DDRB  |= (1 << PB4);    // PB4 auf Ausgang
5

6
   while(1)
7
   {
8
     if(PINB & (1 << PB3))
9
     {
10
       PORTB |= (1 << PB4);
11
     }
12
     else
13
     {
14
       PORTB &= ~(1 << PB4);
15
     }
16
  }
17
}

So muss das aussehen. Da erkennt man auf einen Blick, was wie 
zusammengehört. Deins sieht aus wie hingeschissen.
Die Leerzeichen vor und nach den Operatoren sind natürlich 
Geschmackssache. Aber wenn, dann auch konsequent.

mfg.

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