Tasterabfrage erfolgt nicht

Gast #3926749
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
}
#3926777
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.
Gast #3926883
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.
#3926889
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.
Gast #3926896
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;
Gast #3927202
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...)

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