Forum: Mikrocontroller und Digitale Elektronik char in Atmega8 verändert sich


von MR. Cheese (Gast)


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);
    }



  }
}

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Wie ist PIND0 definiert?

von Peter II (Gast)


Lesenswert?

was erwarteste du eigentlich was in PIND0 drin steht?

Ich behaupte einfach mal da steht immer eine 0 drin.

von MR.Cheese (Gast)


Lesenswert?

An PIND0 ist ein Schalter

von Kan a. (Firma: Basta) (kanasta)


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
}

von Michael H. (michael_h45)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

MR.Cheese schrieb:
> An PIND0 ist ein Schalter

Das mag schon sein.
Aber PIND0 ist nichts anderes als eine 'freundlichere' Schreibweise für 
0.


Es hilft nichts. Auch du wirst, so wie alle anderen, die Grundlagen 
lernen müssen. Mit raten kommt man eben nicht weit

AVR-GCC-Tutorial

von Peter II (Gast)


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
}

von MR. Cheese (Gast)


Lesenswert?

Vielen dank für die Prompte Antwort
Ich dachte ich könnte PIND0 schreiben anstatt PIND & 0x01;
Gruzz

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Peter II schrieb:
> dann doch aber bitte auch die defines verwenden

Ich mag diese Defines nicht. Wieso soll ich PIND0 statt 0 schreiben?
Außerdem verwirrt es die Anfänger, siehe TO.

von Peter II (Gast)


Lesenswert?

Kan asta schrieb:
> Ich mag diese Defines nicht. Wieso soll ich PIND0 statt 0 schreiben?

fals ATMEL mal auf die Idee kommt die pins anders zu nummerieren.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Peter II schrieb:
> fals ATMEL mal auf die Idee kommt die pins anders zu nummerieren.

Sehr, sehr unwahrscheinlich.

von Peter II (Gast)


Lesenswert?

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?

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

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.

von Karl H. (kbuchegg)


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.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ein bischen relativiert sich das ganze, weil du ein einem realen
> Programm die Portnbamen bzw. Bitnummern nicht direkt in den Code
> reinschreiben sollst, sondern dir dafür Makros machst.

Sobald das Programm mehr als 17 Zeilen hat, mache ich das auch so ;)

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.