Forum: Mikrocontroller und Digitale Elektronik Atmel AVR 168 xplained Mini Code funkt nicht


von M4 L. (w_l)


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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


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.

von Karl M. (Gast)


Lesenswert?

Hallo,

Knut schrieb schon einiges.
Noch mal klarer: dies führt zu PortC als Eingang mit Pullup on.
1
DDRC = 0b00000000; PORTC = 0xFF;

von M4 L. (w_l)


Lesenswert?

Hallo

danke für die schnelle Hilfe.

Leider funkt das nicht. Muss ich Boardspezifisch etwas manipulieren,
z.B. wtchdog oder sowas...?

MfG

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


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.

von Stefan F. (Gast)


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.

von M4 L. (w_l)


Lesenswert?

Ich glaube du bist etwas banane... ;D

ließ dir den Edit von Knut mal durch...

Ich meinte Herrn Wünsch

von M4 L. (w_l)


Lesenswert?

Hallo Stafan,

Ja blinken, aber ca. 2 mal pro Sekunde.

MfG

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


Lesenswert?

M4 L. schrieb:
> Ich glaube du bist etwas banane... ;D

Das ist die beste Methode, keine Hilfe zu bekommen.

ciao.

von Stefan F. (Gast)


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.

von M4 L. (w_l)


Lesenswert?

Danke an alle, Station läuft :D

Wenn jemand den Code haben will einfach PN an mich!

von Stefan F. (Gast)


Lesenswert?

Was war der Knackpunkt?

von M4 L. (w_l)


Lesenswert?

Eigentlich eigene Blödheit :D

Negierungen, Portdeklaration, Portabfrage... :D

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.