Leichte Grundlagen-Fragen an AVR-C Programmierer

OP #2631872
Lesenswert?

Hallo !
ich bin ein newbie in C-Programmierung, und möchte euch ein Paar fragen 
stellen, die ihr mit leichtigkeit Beantworten könnt.

1.Frage : Warum leuchtet die LED die ich am PORTD7 angeschlossen habe 
nicht, wenn ich den Taster an PINB0 drücke ?
Quellcode:
#define F_CPU 4000000UL
#include <avr/io.h>

int main(void)
{
  DDRD = (1<<7);
  DDRB = (0<<PB0);
  PORTB = (1<<PB0);

  while(1);
  {
    if(bit_is_clear(PINB,PB0))
    {
      PORTD = (1<<7);
    }
    else
    {
      PORTD = (0<<7);
          }
  }
  return(0);
}

2.Frage :
Im PDF des "AVR-GCC-Tutorial_-_www_mikrocontroller_net.pdf" steht auf 
seite 21 im Quelltext:

"inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) "

was ist diese Funktion "inline" und was heißt "volatile" ?

außerdem :
typedef union {
        uint16_t i16;
          struct {
                  uint8_t i8l;
                  uint8_t i8h;
                 };
               } convert16to8;
und was heißt "typdef union" ?

und:

uint8_t key_pressed(const volatile uint8_t *inputreg, uint8_t inputbit)
{
static uint8_t last_state = 0;

was heißt "const volatile" und was heißt "static uint8_t"

wenn ihr noch ( andere ) tutorials und gute links parat habt, ich Wäre 
dankbar, wenn ihr sie hier posten würdet.

Gruß ,
Jakov
#2631896
Lesenswert?

Jakov K. schrieb:
> soweit ich es verstanden habe:
> es "verschiebt" die null 7 mal nach "links" , d.h, an pinx7 ?!
>
> wenn du schon so fragst , dann wird es wohl falsch sein :D
> wie ist es denn richtig  ?

Also, in deinem Code tut es was du willst. Aber es zeigt du hast keine 
Ahnung. Es rotiert die Binärzahl 00000000 um 7 stellen nach links. Also 
steht am Ende wieder 0000000. Ergo, kannst auch weglassen und direkt 
PORTD=0 schreiben.
(1<<7) macht natürlich wieder sinn, aber eher (1<<PB7), dann wird sofort 
klar du tun willst.

Grundsätzlich ist dein Programm richtig, also liegts an der Hardware.
#2631954
Lesenswert?

Der Fehler im ersten Quelltext ist klein, aber wirksam:
Es muss
1
while(1)
 heißen, nicht
1
while(1);
Letzteres heißt nämlich in Worten "solange 1 gleich 1 ist, führe 
folgende Anweisung aus: ';' ". Das, was nach dem Strichpunkt kommt, wird 
nie ausgeführt, weil der Mikrocontroller in einer Endlosschleife die 
leere Anweisung ; ausführt.
Lässt du den Strichpunkt weg, ist die erste Anweisung nach dem while 
dein Teil in {}, also das, worauf sich das while eigentlich beziehen 
soll.

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