char in Atmega8 verändert sich

Gast #2726365
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)
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
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
}
Gast
Kan asta schrieb:
> Peter II schrieb:
>> fals ATMEL mal auf die Idee kommt die pins anders zu nummerieren.
>
> Sehr, sehr unwahrscheinlich.

und bei den TimerRegistern nimmt du doch bestimmt auch die DEFINES oder 
nicht? Warum also hier nicht?
(Firma: Basta)
Peter II schrieb:
> Warum also hier nicht?

WENN Atmel entscheidet, eine neue Revision des Atmega8 herauszubringen, 
wo die Bits des PINX-Registers durcheinandergewürfelt sind, dann hast du 
Recht, dann sollte man diese Defines benutzen.

Ich kenne keinen Avr-Chip, bei dem die Pinnummerierung sich nicht mit 
den Bitpositionen deckt.
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.