Forum: Mikrocontroller und Digitale Elektronik Tasterabfrage erfolgt nicht


von Simon (Gast)


Lesenswert?

Taster ist wie folgt angeschlossen. GND an den 1. Pin, PA7 an dem 2. 
Pin.
Jedoch blinkt eine LED abwechselnd im 100ms Takt.
1
/*
2
* luigi.c
3
*
4
* Created: 16.12.2014 13:48:07
5
*/
6
7
#define F_CPU 8000000UL
8
#define BUTTON !(PINA & (1<<7))
9
10
#include <avr/io.h>
11
#include <avr/delay.h>
12
13
int main(void)
14
{
15
  DDRA &= ~(1<<PINA7);
16
  PORTA |= (1<<PINA7);
17
18
  DDRB |= (1<<PORTB0) | (1<<PORTB1) | (1<<PORTB2);
19
20
    while(1)
21
  {
22
    static uint8_t value;
23
    
24
    if(BUTTON)
25
    {
26
      _delay_ms(100);
27
      PORTB ^= 1<<PINB2;
28
    }
29
  }
30
}

von Peter II (Gast)


Lesenswert?

> #define BUTTON !(PINA & (1<<7))

macht ja auch kein sinn. PINA ist eine Konstante die ändert sich kaum. 
Damit ist der Ausdruck insgesamt auch Konstant.

von Karl H. (kbuchegg)


Lesenswert?

Simon schrieb:
> Taster ist wie folgt angeschlossen. GND an den 1. Pin, PA7 an dem 2.
> Pin.

?
Wie schliesst du PA7 am 2. ten Pin an?

von Peter II (Gast)


Lesenswert?

Karl Heinz schrieb:
> Wie schliesst du PA7 am 2. ten Pin an?

er meint bestimmt vom Taster den 2.Pin

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> Karl Heinz schrieb:
>> Wie schliesst du PA7 am 2. ten Pin an?
>
> er meint bestimmt vom Taster den 2.Pin

ah. ok. So macht das natürlich Sinn

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
>> #define BUTTON !(PINA & (1<<7))
>
> macht ja auch kein sinn. PINA ist eine Konstante

?
PINA ist doch keine Konstante.

von Peter II (Gast)


Lesenswert?

Karl Heinz schrieb:
> PINA ist doch keine Konstante.

stimmt, habe ich mit PA1 verwechselt - also auch mein Kommentar 
ignorieren.

von Karl H. (kbuchegg)


Lesenswert?

Ich würde mir mal ein Voltmeter nehmen und die Spannung am Pin direkt am 
Prozessor nehmen.
Es soll ja auch so 'fiese' Taster geben, bei denen von den 4 Pins je 2 
miteinander verbunden sind. Schliesst man die 'um 90° verdreht' an, dann 
simuliert das mehr oder weniger einen Dauertastendruck.

Abgesehen davon, seh ich allerdings nichts, was eine Dauerbetätigung des 
Tasters erklären könnte.

von LostInMusic (Gast)


Lesenswert?

>PINA ist doch keine Konstante.

Wie bitte?

PINA = die Adresse des PINA-Registers im I/O-Bereich des Controllers.

Selbstverständlich ist das eine Konstante. Beim ATtiny24/44/84 hat sie
den Wert 0x19. Wer's nicht glaubt, möge sich davon mit "ldi r16, PINA" 
im Simulator überzeugen.

von Karl H. (kbuchegg)


Lesenswert?

LostInMusic schrieb:
>>PINA ist doch keine Konstante.
>
> Wie bitte?
>
> PINA = die Adresse des PINA-Registers im I/O-Bereich des Controllers.
>
> Selbstverständlich ist das eine Konstante.

Nein. Nicht in C.

&PINA ist eine Konstante, aber nicht PINA welches als
1
#define PINA *(volatile uint8_t*)(Adresse des Pin Registers)
per Makro definiert ist. Im PINA Makro ist die Dereferenzierung bereits 
in das Makro eingebaut, so dass es sich für einen C-Programmierer wie 
eine normale Variable verhält.

> Beim ATtiny24/44/84 hat sie den Wert 0x19. Wer's nicht glaubt,
> möge sich davon mit "ldi r16, PINA" im Simulator überzeugen.

Du musst schon auch die Programmiersprache berücksichtigen. Hier geht es 
um C und nicht um Assembler. Für einen C Programmierer verhalten sich 
DDRA, PORTA und PINA (genauso wie alle anderen Hardware-Register) wie 
ganz normale Variablen, die per Makro-Magic an die µC-Register gekoppelt 
sind.

von ?!? (Gast)


Lesenswert?

LostInMusic schrieb:
>>PINA ist doch keine Konstante.
>
> Wie bitte?
>
> PINA = die Adresse des PINA-Registers im I/O-Bereich des Controllers.
>
> Selbstverständlich ist das eine Konstante. Beim ATtiny24/44/84 hat sie
> den Wert 0x19. Wer's nicht glaubt, möge sich davon mit "ldi r16, PINA"
> im Simulator überzeugen.

Und im GCC-Tutorial steht totaler Unfug drin, oder? ;-))

Zitat:
1
Will man also die aktuellen Signalzustände von Port D abfragen
2
und in eine Variable namens bPortD abspeichern, schreibt man
3
folgende Befehlszeilen:
1
#include <avr/io.h>
2
#include <stdint.h>
3
...
4
uint8_t bPortD;
5
...
6
bPortD = PIND;

von LostInMusic (Gast)


Lesenswert?

>Du musst schon auch die Programmiersprache berücksichtigen.

Na gut, 1:0 für Dich. Was in Assembler eine Konstante ist, ist in C 
schon eine Variable. Das muss man erst mal verkraften :-)

>[...] verhalten sich DDRA, PORTA und PINA (genauso wie alle anderen
>Hardware-Register) wie ganz normale Variablen [...]

OK. Kann ja kein Mensch ahnen.

>Und im GCC-Tutorial steht totaler Unfug drin, oder? ;-)

Ohne es gelesen zu haben vermute ich mal: "Ja" (kleiner Scherz...)

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.