Forum: Mikrocontroller und Digitale Elektronik Probleme mit Atiny13


von goeran S. (pustewind)


Lesenswert?

Hallo Mikrocontrollerfreunde,

bin absoluter Neuling was Foren anbelangt!

Ich setze einen Atiny13 für eine Anfahr- & Bremssteuerung bei meiner 
Modellbahn ein (was auch soweit super funktioniert).
Meine Schaltung ist wie folgt aufgebaut:
PB0 – PB2 als Eingang (Signale kommen von einem Atmega 16 – funktioniert 
auch problemlos.
PB3 & PB4 als Ausgang
An PB3 habe ich ein Relais und PB4 geht über das Relais zum Bahngleis.

Programmiert habe ich das Ganze in „AVR C“
Hier mal ein Auszug...

1
int main(void)
2
{
3
4
    DDRB   =  ( 1<<PB3 )|( 1<<PB4 );                    //als Ausgang
5
    DDRB  &= ~( 1<<PB0 )|( 1<<PB1 )|( 1 << PB2 );       //als Eingang
6
    PORTB |=  ( 1<<PB0 )|( 1<<PB1 )|( 1 << PB2 );       //PullUps aktivieren
7
    PORTB &= ~( 1<<PB3 )|( 1<<PB4 );                    //alle Ausgänge auf AUS
8
9
10
 while(1)
11
  { 
12
   if ( (( PINB & 0x01 ) == 0x01) && (fahrt == 0) )   //wenn am Eingang 001 anliegt...
13
     {
14
      PORTB |= ( 1<<PB3);                             //...setze PB3 (Relais zieht an)   
15
     }
16
    
17
    
18
   if ( (( PINB & 0x02 ) == 0x02) && (fahrt == 0) )   //wenn am Eingang 010 anliegt
19
     {
20
      PORTB &= ~( 1<<PB3);                            //...lösche PB3 (Relais fällt ab) 
21
     }                 
22
23
   if ( (( PINB & 0x03 ) == 0x03) && (fahrt == 1) )   //wenn am Eingang 011 anliegt und der Zug fährt (1) dann...
24
     {
25
      bremsen();                                      //...gehe zur function "bremsen"        
26
     }
27
         
28
     
29
   if ( (( PINB & 0x04 ) == 0x04) && (fahrt == 0) )   //wenn am Eingang 100 anliegt und der zug nicht fährt (0) dann... 
30
     {
31
      anfahren();                                    //... gehe zur function "anfahren"
32
      fahren();                                      //... dann weiter zur function "fahren"
33
     }
34
    
35
36
   if (( PINB & 0x05 ) == 0x05 )                      //wenn am Eingang 101 anliegt dann...
37
     {
38
      _delay_us(25);                                  //warte ganz kurz und tue nix 
39
     }
40
 }
41
return(0)
42
}


So und hier mein eigentliches Problem:

Die erste, zweite und vierte  if-Anweisung werden problemlos 
durchlaufen.
Bei der letzten sollte er eigentlich (noch) nix machen dem ist aber 
nicht so.

Er schaltet das Relais an PB3 und geht dann zur Funktion "anfahren()" -

Warum ist das so ? Wo liegt der Fehler ?

Ich hoffe ich konnte mich halbwegs verständlich ausdrücken.

MFG
goeran

von Spess53 (Gast)


Lesenswert?

Hi

Weil

  if ( (( PINB & 0x04 ) == 0x04) && (fahrt == 0) )

auch bei 101 wahr ist.

mfG Spess

von Spess53 (Gast)


Lesenswert?

Hi

Nachtrag:

Und hier

   if ( (( PINB & 0x01 ) == 0x01) && (fahrt == 0) )

natürlich auch.

MfG Spess

von goeran S. (pustewind)


Lesenswert?

Hi,

danke für die schnelle Antwort :-)

Wie müsste dann die if-Anweisung aussehen damit es funktioniert ?
Ich war der Meinung das bei:

if ( (( PINB & 0x01 ) == 0x01) ) nur eine Aktion ausgeführt wird wenn an 
pin B0 ein Signal anliegt

und bei:
if ( (( PINB & 0x05 ) == 0x05) ) nur eine Aktion ausgeführt wird wenn an 
pin B0 und an pin B2 ein Signal anliegt.

001 ist doch anders als 101

MfG

Goeran

von Spess53 (Gast)


Lesenswert?

Hi

>Wie müsste dann die if-Anweisung aussehen damit es funktioniert ?
>Ich war der Meinung das bei:

>if ( (( PINB & 0x01 ) == 0x01) ) nur eine Aktion ausgeführt wird wenn an
>pin B0 ein Signal anliegt

Da du mit PINB & 0x01 alle Bit außer Bit0 löscht wird die Bedingung bei 
allen Zuständen wahr bei denen Bit0 gesetzt ist, egal was in den anderen 
Bits steht. Ändere

PINB & 0x01  in  PINB & 0x07

um. Bei den anderen Abfragen auch. Damit werden alle drei Bits 
berücksichtigt.

MfG Spess

von goeran S. (pustewind)


Lesenswert?

Hi,

kann ich nicht ganz nachvollziehen - sorry

wenn PINB & 0x01 --> 001 Bit0 gesetzt
wenn PINB & 0x07 --> 111 Bit0-2 gesetzt

logisch wäre dann für mich folgende if-Anweisung:

if ( (( PINB & 0x06 ) == 0x01) ) geht aber nicht.


am Ende möchte ich 7 verschiedene "Codes" (ohne 0x00) vom tiny13 
verarbeiten lassen. Ist dies überhaupt möglich ?

MfG

goeran

von MWS (Gast)


Lesenswert?

goeran S. schrieb:
> logisch wäre dann für mich folgende if-Anweisung:
>
> if ( (( PINB & 0x06 ) == 0x01) ) geht aber nicht.

warum wird wohl :

if b00000110 == b00000001

nicht gehen ?

von Spess53 (Gast)


Lesenswert?

Hi

>logisch wäre dann für mich folgende if-Anweisung:

>if ( (( PINB & 0x06 ) == 0x01) ) geht aber nicht.

Ich glaube, dir ist die Wirkungsweise de &-Operators nicht ganz klar.

 7 (111) & 6 (110) = 6 (110)
 6 (110) & 6 (110) = 6 (110)
 5 (101) & 6 (110) = 4 (100)
 4 (100) & 6 (110) = 4 (100)
 3 (011) & 6 (110) = 2 (010)
 2 (010) & 6 (110) = 2 (010)
 1 (001) & 6 (110) = 0 (000)

MfG Spess

von Thomas E. (thomase)


Lesenswert?

goeran S. schrieb:
> am Ende möchte ich 7 verschiedene "Codes" (ohne 0x00) vom tiny13
> verarbeiten lassen. Ist dies überhaupt möglich ?
Das stösst natürlich an die Grenzen der Informatik.

Du hast 3 Bits, die dich interessieren: PB0, 1 und 2. Also die unteren 3 
Bits. Die musst du ausmaskieren und auswerten:
1
switch(PINB & 0x07)
2
{
3
  case 0:
4
  //Mach was
5
  break;
6
7
  case 1:
8
  //Mach was
9
  break;
10
...
11
  case 7:
12
  //Mach was
13
  break;
14
}

Vorher liest du die entsprechenden Kapitel in deinem C-Buch. Das sind 
Basics. Die brauchst du jeden Tag.

mfg.

von goeran S. (pustewind)


Lesenswert?

Hi,

danke an alle für die Antworten !
Ja - genau das war es - ich habe es nicht so ganz verstanden :-(
Dank Eurer Hilfe funktioniert es aber jetzt perfekt :-)

Mfg

Goeran

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.