Forum: Compiler & IDEs Tutorial Zeiger


von Martin (Gast)


Lesenswert?

hi,
ich habe eine frage zu dem Code:
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#ifndef F_CPU
4
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
5
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */
6
#endif
7
#include <util/delay.h>     /* bei alter avr-libc: #include <avr/delay.h> */      
8
 
9
/* Einfache Funktion zum Entprellen eines Tasters */
10
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
11
{
12
    if ( ! (*port & (1 << pin)) )
13
    {
14
        /* Pin wurde auf Masse gezogen, 100ms warten   */
15
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
16
        _delay_ms(50); 
17
        if ( *port & (1 << pin) )
18
        {
19
            /* Anwender Zeit zum Loslassen des Tasters geben */
20
            _delay_ms(50);
21
            _delay_ms(50); 
22
            return 1;
23
        }
24
    }
25
    return 0;
26
}
27
 
28
int main(void)
29
{
30
    DDRB &= ~( 1 << PB0 );                 /* PIN PB0 auf Eingang (Taster)            */
31
    PORTB |= ( 1 << PB0 );                 /* Pullup-Widerstand aktivieren            */
32
    ...
33
    if (debounce(&PINB, PB0))             /* Falls Taster an PIN PB0 gedrueckt..    */
34
        PORTD = PIND ^ ( 1 << PD7 );  /* ..LED an Port PD7 an-
35
                                   bzw. ausschalten */
36
    ...
37
}

wieso verwendet man hier Zeiger? Kann man den Port nicht auch direkt 
übergeben?

von Jörg X. (Gast)


Lesenswert?

> wieso verwendet man hier Zeiger?
Weil in der Funktion der Port gelesen werden soll, dazu muss die 
Funktion wissen, was sie lesen soll -- nämlich diesen Port (bzw. Die 
Stelle im Speicher, an der dieses Register liegt).

> Kann man den Port nicht auch direkt übergeben?
Wie sollte das denn gehen? Es geht nicht 'direkter' als mit einem 
Pointer.
Ein Pointer ist ja bloß eine Variable, in der ein Adresse gepeichert ist 
(davor muss man keine Angst haben ;) ).

hth. Jörg

von naja (Gast)


Lesenswert?

zeiger sind cool

delay schleifen nicht

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.