Forum: Mikrocontroller und Digitale Elektronik DDRA-DDRD verhalten sich komisch


von ICH (Gast)


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

von Rolf (Gast)


Lesenswert?

ICH schrieb:
> DDRD  = 0x00;  // PortD als Ausgang definiert
> DDRB  = 0xff;  // PortB als Eingang definiert
Was? Wie bitte?

von ICH (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

Hast du auch den richtigen Controller im Simulator eingestellt?

MfG Spess

von ICH (Gast)


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.

von dummschwaetzer (Gast)


Lesenswert?

probiere mal
DDRB ^= PIND;

von Oliver J. (skriptkiddy)


Lesenswert?

ICH schrieb:
> Gibt es eine elegantere Lösung als
> 7 if-Schleifen?
1
uint8_t mask;
2
uint8_t i;
3
while(42)
4
{
5
  mask=1;
6
  for (i=0; i<8; i++)
7
  {
8
    if (PIND & mask)
9
    {
10
      DDRB  ^=  mask;  //PBX Toggle
11
    }
12
    mask = mask << 1;  // mask 1x linksschift 
13
  }

http://www.if-schleife.de/

von dummschwaetzer (Gast)


Lesenswert?

wieso schaltest du eigentlich DDRB und nicht PORTB

von ICH (Gast)


Lesenswert?

dummschwaetzer schrieb:
> wieso schaltest du eigentlich DDRB und nicht PORTB

Du meinst:
1
if (PIND & ( 1 << PD0))
2
    {
3
      PORTD  ^= ( 1 << PB0 );  //PB0 Toggle
4
    }

Keine ahnung warum ... :/

von ICH (Gast)


Lesenswert?

Natürlich meine ich

if (PIND & ( 1 << PD0))
    {
      PORTB  ^= ( 1 << PB0 );  //PB0 Toggle
    }

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.