AVR Atmega644 Anfängerfrage

Gast #4336466
Lesenswert?

Was genau läuft hier nicht? Zur Erklärung:
Auf PC1 liegt ein Button. Der Button sollte für die Zeit die er gerückt 
ist eine LED zum blinken bringen. Das Blinken ohne Button funktioniert 
scheinbar einwandfrei ausschließlich das auslesen nicht.

1
DDRA |= (1 << PA0);
2
DDRC &= ~(1 << PC1);
3
PORTC &= ~(1 << PC1);
4
while(1)
5
{
6
  if((PINC & (1 << PC1))){
7
    PORTA |= (1 << PA0);
8
    //tracking();
9
    _delay_ms(250);
10
    PORTA &= ~(1 << PA0);
11
    _delay_ms(250);
12
  }
13
}
Gast #4336500
Lesenswert?

Das ding ist der ATmega läuft über das Uninetzwerk und ich verbinde mich 
per Remotedesktop mit einem PC an dem der ATmega angeschlossen ist. Eine 
Kamera zeigt mir dann die Anschlüsse etc. Allerdings sollte es am 
Anschluss nicht liegen da Assistenten das Ding angeschlossen haben und 
ich denke die haben genug Fachwissen um das zu schaffen ^^.


Deshalb muss es am Code liegen... aber der scheint soweit richtig oder 
nicht?
#4336559
Lesenswert?

Felix schrieb:


> Deshalb muss es am Code liegen... aber der scheint soweit richtig oder
> nicht?

Nicht unbedingt.

Meistens werden Taster so angeschlossen, dass sie im nicht gedrückten 
Zustand eine 1 am Portpin liefern und wenn der Taster gedrückt wird eine 
0.
Der Grund dafür ist ganz einfach der, dass man dann ein externes Bauteil 
einspart - einen ansonsten notwendigen Pulldown Widerstand.
So aber kann man den im AVR eingebauten Pullup Widerstand benutzen.

Nur

Dazu müsste der auch eingeschaltet werden ...
1
PORTC &= ~(1 << PC1);
... was er jetzt aber nicht ist, und die Abfrage ....
1
  if((PINC & (1 << PC1))){
... würde dann genau anders herum lautet (weil ein gedrückter Taster 
dann ja eine 0 liefert).

Daher die Frage wie er tatsächlich angeschlossen ist. Hat dein Assistent 
die übliche Anbindung vorgenommen oder hat er sich eine Extrawurst 
gebraten?

Passieren kann allerdings nicht viel, wenn wir einfach mal annehmen dass 
dein Assisten den Taster so an den AVR angeschlossen hat, wie das die 
ganze restliche Welt auch macht und wir einfach mal auf Verdacht das 
Programm ändern
1
DDRA |= (1 << PA0);
2
DDRC &= ~(1 << PC1);
3
PORTC |= (1 << PC1);  // Pullup ein
4

5
while(1)
6
{
7
  if( ! (PINC & (1 << PC1))){     // Taster gedrückt - Bit nicht gesetzt
8
    PORTA |= (1 << PA0);
9
    //tracking();
10
    _delay_ms(250);
11
    PORTA &= ~(1 << PA0);
12
    _delay_ms(250);
13
  }
14
}

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