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); } } }
was erwarteste du eigentlich was in PIND0 drin steht? Ich behaupte einfach mal da steht immer eine 0 drin.
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 | }
|
MR. Cheese schrieb: > char before = PIND0; PIND0 ist ein #define auf 0. Da steht also
1 | char before = 0; |
Klar ändert sich das nicht. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Vordefinierte_Bitnummern_f.C3.BCr_I.2FO-Register http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_den_.C2.B5C.29
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
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 | }
|
Vielen dank für die Prompte Antwort Ich dachte ich könnte PIND0 schreiben anstatt PIND & 0x01; Gruzz
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.
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.
Peter II schrieb: > fals ATMEL mal auf die Idee kommt die pins anders zu nummerieren. Sehr, sehr unwahrscheinlich.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.