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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.