char in Atmega8 verändert sich

Gast #2726365
Lesenswert?

Hallo zusammen

Mein Problem ist wie folgt:
Ich speichere zuerst den Zustand des PINB0 in eine Variable "before"
und wenn PINB0 nun nicht mehr gleich "before" ist sollte der Ausgang 
PORTB0 auf 1 gehen. Dies passiert leider nicht.


#include <avr/io.h>
#include <stdint.h>
#define TAKT 1000000
#define bit0 0

char before = PIND0;
void main(void){
  DDRB = 0xff;


  while(1){

    if(PIND0 != before){
      PORTB = (1<<bit0);
    }



  }
}
(Firma: Basta) #2726381
Lesenswert?

Lerne C, Freund des Mikrocontrollers.
1
#include <avr/io.h>
2
#include <stdint.h>
3

4
#define TAKT 1000000
5

6
char before;
7

8
void main(void){
9
  DDRB = 0xff;
10
  DDRD = 0x00;
11

12
  before = PIND & 0x01;
13
  while(1) {
14
    if((PIND & 0x01) != before)
15
      PORTB = (1<<0);
16
  }
17
}
Gast #2726391
Lesenswert?

Kan asta schrieb:
> Lerne C, Freund des Mikrocontrollers.
> #include <avr/io.h>
> #include <stdint.h>
>
> #define TAKT 1000000
>
> char before;
>
> void main(void){
>   DDRB = 0xff;
>   DDRD = 0x00;
>
>   before = PIND & 0x01;
>   while(1) {
>     if((PIND & 0x01) != before)
>       PORTB = (1<<0);
>   }
> }

dann doch aber bitte auch die defines verwenden
1
#include <avr/io.h>
2
#include <stdint.h>
3

4
#define TAKT 1000000
5

6
char before;
7

8
void main(void){
9
  DDRB = 0xff;
10
  DDRD = 0x00;
11

12
  before = PIND & (1<<PIND0);
13
  while(1) {
14
    if((PIND & (1<<PIND0)) != before)
15
      PORTB = (1<<PINB0);
16
  }
17
}
#2726414
Lesenswert?

Jep.
Meiner Meinung nach war die Einführung von PIND0, PB0, PB2 und wie sie 
alle heissen keine gute Idee.
Man hätte ein einziges BIT0, BIT1, ... oder meinetwegen auch BIT_0 
(wegen der Lesbarkeit) machen sollten und gut wärs gewesen.

   if( PIND & (1<<BIT_0) )       // ist Bit 0 am PIND gesetzt

ist IMHO genausogut lesbar (wenn nicht sogar besser) und es würde diese 
Verwechslungen nicht geben bzw. die Anpass'fehler' würden gleich gar 
nicht gemacht werden

  if( PIND & (1<<PD0) )
  if( PIND & (1<<PB0) )
  if( PIND & (1<<PIND0) )
  id( PIND & (1<<PINB0) )

ist alles dasselbe, weil alle Makros PD0, PB0, PIND0, PINB0 (und 
natürlich auch alle anderen) auf dieselbe 0 expandieren.

Ein bischen relativiert sich das ganze, weil du ein einem realen 
Programm die Portnamen bzw. Bitnummern nicht direkt in den Code 
reinschreiben sollst, sondern dir dafür Makros machst.
1
#include <avr/io.h>
2
#include <stdint.h>
3

4
#define LED_PORT   PORTB
5
#define LED_DDR    DDRB
6
#deinfe ERROR_LED  PB0
7

8
uint8_t before;
9

10
void main(void){
11
  LED_DDR |= ( 1 << ERROR_LED );
12
  DDRD    = 0x00;
13

14
  before = PIND & (1<<PIND0);
15
  while(1) {
16
    if((PIND & (1<<PIND0)) != before)
17
      LED_PORT &= ( 1 << ERROR_LED );
18
  }
19
}

(und natürlich für PIND bzw. das was an diesem Pin hängt, dasselbe. Dann 
halt irgendwas mit einer Taste, einem KEY)

Das kommt dann auch der Programmdokumentation zu Gute. Denn bei
      LED_PORT &= ( 1 << ERROR_LED );
brauch ich dann eben keinen Kommentar mehr, der mir sagt, dass hier die 
'Fehler' Led eingeschaltet wird. Das steht dann schon im Quelltext 
selber. Und das ist allemal besser, als ein Kommentar der im schlimmsten 
Fall falsch ist.

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