DDRA-DDRD verhalten sich komisch

Gast #2399436
Lesenswert?

Hallo zusammen, ich habe ein kleines Problem beim definieren der ein und 
Ausgänge meines Attiny2313.

Mein Code lautet zu Zeit:

#include <avr/io.h>

int main(void)
{
    DDRD  = 0x00;  // PortD als Ausgang definiert
    PORTD  = 0xff;  // PortD Pull-up Widerstände eingeschaltet
    DDRB  = 0xff;  // PortB als Eingang definiert

while(1)
    {

    }
  return 0;
}

Da AVR Studio 5 mein STK500 nicht erkennt und ich grade auch probleme 
habe es unter AVR Studio4 zum laufen zu kriegen (keine ahnung warum, hat 
unter der version 4 sonst immer funktioniert) wollte ich mal die Debug 
Simulatorfunktion vom Studio 5 ausprobieren.

Ich würde jetzt erwarten, dass die im quelltext als kommentar stehenden 
ereignisse eintreten.
Tatsächlich wird mir aber in der Simulation angezeigt, dass
DDRD den Value 0x00 hat Gesetzte Bits alle 0
PORTD den Value 0x7f und es werden 7 Bits auf 1 gesetzt (soweit ist das 
ja noch richtig)
DDRB hat einen Value von 0x00 (obwohl der doch 0xff sein sollte und die 
gesetzten Bits sollten auch alle 1 sein) sind aber 0?!
Bitte verbessert mich wenn ich falsch liege oder die simulation falsch 
deute...

Grüße
ICH
Gast #2399445
Lesenswert?

UPS, ich hab die Beschriftung für eingang und ausgang verwechselt
Sollte so aussehen.
  //  DDRD  = 0x00;  // PortD als Eingang
  //  PORTD  = 0xff;  // PortD Pull-up Widerstände eingeschaltet
  //  DDRB  = 0xff;  // PortB als Ausgang
Gast #2400494
Lesenswert?

Nachdem ich das ganze jetzt ein wenig bearbeitet und nochmal simuliert 
habe scheinen jetzt alle Register richtig gesetzt zu werden.
Jetzt sollen bei einem tastendruck die zugehörige LED leuchten (bzw 
ausgehen)
Ich habe mir das ganze so gedacht
1
#include <avr/io.h>
2

3
unsigned char i;
4

5
int main(void)
6
{    
7
    Selbe Funktion wie unten!
8
    DDRD  = 0x00;  // PortD als Eingang
9
    PORTD  = 0xff;  // PortD Pull-up Widerstände eingeschaltet
10
    DDRB  = 0xff;  // PortB als Ausgang
11
while(1)
12
    {  
13
    if (PIND & ( 1 << PD0))
14
    {
15
      DDRB  ^= ( 1 << PB0 );  //PB0 Toggle
16
    }
17
    if (PIND & ( 1 << PD1))
18
    {
19
      DDRB  ^= ( 1 << PB1 );  //PB1 Toggle
20
    }
21
    if (PIND & ( 1 << PD2))
22
    {
23
      DDRB  ^= ( 1 << PB2 );  //PB2 Toggle
24
    }          
25
    if (PIND & ( 1 << PD3))
26
    {
27
      DDRB  ^= ( 1 << PB3 );  //PB3 Toggle
28
    }
29
    if (PIND & ( 1 << PD4))
30
    {
31
      DDRB  ^= ( 1 << PB4 );  //PB4 Toggle
32
    }
33
    if (PIND & ( 1 << PD5))
34
    {
35
      DDRB  ^= ( 1 << PB5 );  //PB5 Toggle
36
    }
37
    if (PIND & ( 1 << PD6))
38
    {
39
      DDRB  ^= ( 1 << PB6 );  //PB6 Toggle
40
    }
41
    }
42
  return 0;
43
}

Könnte das funktionieren (mal abgesehen vom prellen der taster)?
Für den Fall, dass es funktioniert... Gibt es eine elegantere Lösung als 
7 if-Schleifen?
Vielen Dank für die Hilfe.

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