Atmel AVR 168 xplained Mini Code funkt nicht

OP #4529177
Lesenswert?
• ▲
▼
Hallo liebe Gemeinschaft,

Ich habe hier einen Atmel AVR Xplained mini 168.

Damit sollen Klemmstellen auf durchgang geprüft werden!

Nun kann man die Klemmstellen als "Taster" sehen und das eine Ende an 
Port C verlöten und das andere Ende an GND.

So, jetzt habe ich Port C als Ausgang deklariert und frage mit If ab ob 
durchgang vorhanden ist. Wenn ja, dann LED an:

int main(void)
{

    DDRC = 0b00000000;
    PORTC = 0xFF;
    DDRD = 0b10111111;
    PORTD = 0x00;



    while(1)
    {

  if (!(PORTC & (0b00000001)))
       {
  PORTD |= (1 << PORTD5);
        }


        }
}

Aber da tut sich nichts!
Warum? Muss ich da noch was beachten, irgendwelche Register setzen bzw. 
nicht setzen...?

Danke schonmal
(Firma: TravelRec.) Persönliche Seite #4529213
Lesenswert?
• ▲
▼
Zum Ersten: Wenn Du einen Port als Ausgang definierst, kannst Du nichts 
daran lesen.
Zum Zweiten: Wenn Du einen Portpin lesen willst, brauchst Du das 
PIN-Register, nicht das PORT-Register.
Zum Dritten: Wenn Du draußen Taster nach GND hast, musst Du Pullups an 
die Taster anschließen oder die internen Pullups einschalten, was Du 
wiederum mit einer 1 im PORT-Register und mit einer 0 im DDR-Register 
für das betreffende Bit einstellst.

Edit: Ich sehe gerade, Erstens und Drittens trifft auf PortC zu, dann 
musst Du nur noch Punkt 2 beachten.
Moderator Persönliche Seite #4529497
Lesenswert?
• ▲
▼
Knut B. schrieb:
> Zum Ersten: Wenn Du einen Port als Ausgang definierst, kannst Du nichts
> daran lesen.

Lesen kann man schon, aber erstens über PINx, und zweitens wäre es
nicht die feine englische Art, einen auf Ausgang gesetzten Port
einfach kurzzuschließen. ;-)

M4 L. schrieb:
> z.B. wtchdog oder sowas...?

Nein.

„funken“ können diese Boards übrigens auch nicht, und wenn du hier
Hilfe bekommen möchtest, dann solltest du schon etwas mehr als „geht
nich“ als Fehlerbeschreibung liefern.
Gast #4529543
Lesenswert?
• ▲
▼
Lasse erstmal eine LED blinken.
1
#include <util/delay.h>
2
#include <avr/io.h>
3

4
int main(void)
5
{
6
    DDRD |= (1<<PD5);
7
    while (1)
8
    {
9
        PORTD |= (1<<PD5);
10
        _delay_ms(1000);
11
        PORTD &= ~(1<<PD5);
12
        _delay_ms(1000);
13
    }
14
}
Blinkt sie korrekt im Sekundentakt?

> Muss ich Boardspezifisch etwas manipulieren,
> z.B. wtchdog oder sowas...?

Beantworte erstmal, ob die LED korrekt blinkt, dann sehen wir weiter.
Gast #4529592
Lesenswert?
• ▲
▼
> Ja blinken, aber ca. 2 mal pro Sekunde.

Dann hast du schon ein problem mit falscher Taktrate. irgendwo in deinem 
Projekt wird F_CPU auf einen falschen Wert gesetzt. Korrigiere das, dann 
sehen wir weiter. Die Taktrate ist zwar Momentan nicht dein primäres 
Problem, aber alle delay's und serielle Kommunikation werden so nicht 
funktionieren. Das kommt ja sicher noch früher oder später dazu.

Wenn die Led korrekt blinkt (also 1s an, 1s aus, 1s an, 1s aus usw.), 
dann versuche als Nächstes das:
1
#include <util/delay.h>
2
#include <avr/io.h>
3

4
int main(void)
5
{
6
    // Led Ausgang aktivieren
7
    DDRD |= (1<<PD5);
8
   
9
    // Taster Eingang mit Pull-Up
10
    DDRC &= (1<<PC1);
11
    PORTC |= (1<<PC1);
12
   
13
    while (1)
14
    {
15
        if (PINC & (1<<PC1))
16
        {
17
            PORTD |= (1<<PD5);
18
        }
19
        else
20
        {
21
            PORTD &= ~(1<<PD5);
22
        }
23
    }
24
}

Am Ausgang PD5 müsste dan das gleiche Signal heraus kommen, wie in PC1 
rein geht.

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