Forum: Compiler & IDEs atMega32 zieht PA1 immer auf +


von Bernhard S. (snowy1509)


Lesenswert?

hallo! ich habe mir das Atmel Evaluations Board von Pollin zugelegt und 
hab jetzt aus dem Internet folgenden Code kopiert und rübergespielt.

Code:
1
    #include <avr/io.h>
2
    #include <util/delay.h>
3
4
    char _port1 = 0xFF;
5
    char _port2 = 0xFF;
6
7
     int main ()
8
    {
9
      DDRA |= 0xFF;
10
      PORTA = 0xFF;
11
      while (1)
12
      { 
13
                    //Vorwärts        
14
        for (int _ledPos=0;_ledPos < 7;_ledPos++)
15
                    {               
16
                      _port1 = (64 >> _ledPos);          
17
                      _port2 = (128 >> _ledPos);                          
18
                      PORTA = ~(_port1 | _port2);
19
                      _delay_ms (100);         
20
                    }
21
                    //Rückwärts
22
                    for (int _ledPos=7;_ledPos > 0; _ledPos--)
23
                    {
24
                      _port1 = (128 >> _ledPos);       
25
                      _port2 = (64 >> _ledPos);                             
26
                      PORTA = ~(_port1 | _port2);
27
                      _delay_ms (100);
28
                    }
29
      }
30
    }

Das ist so eine Art Knight-Rider-Lauflicht für 8 LED. Funktioniert 
eigentlich auch alles, aber mir ist aufgefallen, das sich die 2. LED nie 
ausschaltet. Habe nachgemessen und festgestellt, dass PA1 immer auf + 
bleibt und nie ausschaltet. Hab die Schaltung im ausgeschaltenen Zustand 
nachgemessen und festgestellt das keine Hardware Verbindung in der 
Schaltung zwischen PA1/LED2 und + vorliegt.

Könnte mir wer sagen wo der Fehler liegen kann?

Danke!
mfg
Snowy

von Helfer (Gast)


Lesenswert?

> Das ist so eine Art Knight-Rider-Lauflicht für 8 LED.
                                                 ^
>       for (int _ledPos = 0; _ledPos < 7; _ledPos++)
                                      ^^^
7 LEDs!

> Probleme mit PA1...

LEDs so (active low) angeschlossen?

Pin o----|<--###---o +

Sicher, dass es kein Problem mit PA0 ist?

>    char _port1 = 0xFF;
>    char _port2 = 0xFF;

 uint8_t _port1 = 0xFF;
 uint8_t _port2 = 0xFF;

von Helfer (Gast)


Lesenswert?

> _ledPos < 7

Sorry, passt, du schiebst ja 2 Bits.

von Bernhard S. (snowy1509)


Lesenswert?

sry, dürfe ein Problem mit meinem Kabel zum Addon-Board haben^^ habs 
grad noch mal durchgemessen und weiß jetzt, dass der Fehler da wo 
liegt...

Danke trotzdem, könnte mir vl noch wer erklären was bei folgendem Befehl 
passiert:
1
 
2
_port1 = (64 >> _ledPos);          
3
_port2 = (128 >> _ledPos);

Verschiebe ich da die Variable _ledPos um den Wert 64 bzw 128?

Danke!

Snowy

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bernhard Schneeweiß schrieb:

> _port1 = (64 >> _ledPos);
> _port2 = (128 >> _ledPos);
>
> Verschiebe ich da die Variable _ledPos um den Wert 64 bzw 128?

Nein, du verschiebst die Zahl 64 bzw. 128 um den Wert von _ledPos.

Bitte streich die führenden Unterstriche von Variablennamen.
Bis auf wenige Ausnahmen sind Bezeichner, die mit einem Unterstrich
beginnen, im C-Standard als "reserved" markiert, d. h. sie dürfen
nicht durch die Anwendung selbst belegt werden.

von Bernhard S. (snowy1509)


Lesenswert?

ah gut danke, jetzt verstehe ich das Programm ;)

Danke!

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.