Forum: Mikrocontroller und Digitale Elektronik Schalter Attiny13


von Bastler (Gast)


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

von Peter II (Gast)


Lesenswert?

> if  (PORTB = (1<<PB3))

hier sollte der compier eine Warnung werfen die du beachten solltest.

von Peter Z. (hangloose)


Lesenswert?

Eingang --> PINB nicht PORTB

von Stefan F. (kpy3ep) Benutzerseite


Lesenswert?

Bastler schrieb:
> Ich bringe mir gerade selbst die Grundlagen in Sachen yC bei, aber komme
> selbst mit AVC Tutorial nicht weiter.

Dann machst du etwas falsch.

Bastler schrieb:
> Danke im Voraus

Wofür? Irgendwie fehlt die Fragen zu deinem Thema.

von Peter Z. (hangloose)


Lesenswert?

(PINB & (1<<3))

von Davis (Gast)


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

von Bastler (Gast)


Lesenswert?

Danke für die schnelle Antworten


if(PINB & (1<<3))
{
}
else
{
PORTB |= (1<<PB4);
}

das läuft aber auch nicht

von Stefan F. (kpy3ep) Benutzerseite


Lesenswert?

Bastler schrieb:
> das läuft aber auch nicht

Dir ist schon klar, dass du damit einen Low-Aktiv Eingang hast? Also 
musst du den PB3 auf Masse ziehen, damit PB4 gesetzt wird. Eventuell 
solltest du dir auch noch gedanken machen, wie du den PB4 wieder 
zurücksetzten möchtest.

von Karl H. (kbuchegg)


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

von Bastler (Gast)


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

von Stefan F. (kpy3ep) Benutzerseite


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

von Bastler (Gast)


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

von Stefan F. (kpy3ep) Benutzerseite


Lesenswert?

Das sind Register. Gut beschrieben ist das hier:

http://www.embedds.com/controlling-avr-io-ports-with-avr-gcc/

Der PB4 wird aber immer noch nicht zurückgesetzt.

von Bastler (Gast)


Lesenswert?

Nee, daran bin ich ja jetzt am arbeiten ;-)....wie baue ich mir einen 
Taster der nacheinander verschieden Programmteile ablaufen lässt.

von Thomas E. (thomase)


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.

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.