Hi! Kann mir bitte jemand bei meinem AVR Programm helfen? Ich muss ein Programm schreiben, dass ein Lauflicht mit unterschiedlichen Lauflichtgeschwindigkeiten realisiert. Die Eingabe der Geschwindigkeit erfolgt über die vier Tasten des HAPSIM. Bin für jede Hilfe dankbar
:
Verschoben durch User
Hans Huber schrieb: > Und wieso nicht bzw. wo bekomm ich Hilfe? Du kannst hier gern Detailfragen stellen über ein bestimmtes Problem, da wird dir sicher geholfen. Aber mit dem Auftritt "Ich hab eine Aufgabe, keinen Bock es selbst zu probieren, bitte machts mir" stößt du hier nur auf Ablehnung. Also, selbst probieren (-> programmieren), bei Fragen gern hier.
OK hab verstanden. Also eine Frage hab ich. Mit dem Befehl: if( PIND & (1<<PD0) wird überprüft ob das Bit auf PORTD 0 gesetzt ist oder?
Hans Huber schrieb: > Mit dem Befehl: if( PIND & (1<<PD0) dröseln wirs doch auf: PIND = 8-bit Eingangswort (1<<PD0) = Binärwert 00000001 das ganze verundet ergibt je nach Zustand des PIND0 PinD0 = low -> PIND & (1<<PD0) = 00000000binär PinD0 = high -> PIND & (1<<PD0) = 00000001binär mit der Abfrage if( PIND & (1<<PD0)) prüfst du also, ob das Bit PD0 im Register PIND gesetzt ist.
OK danke. Hab jetzt mal den einen Code programmiert. Stimmen die Kommentare? #include <avr/io.h> //Deklaration #include <util/delay.h> // int zeit; //Geschwindigkeitsvariable int main(void) //Hauptfunktion { DDRB=0xFF; //Data Direction Register des PORTB; PORTB ist der Ausgang PORTB=0x00; //Setze alle Bits auf PORTB auf 0 PORTD |= ((1<<PD0) | (1<<PD1) | (1<<PD2)); //Pullup für PD0, PD1 oder PD2 aktivieren, //PIN0,PIN1 oder PIN2 wird auf "High" gesetzt DDRD &= ~((1<<PD0) | (1<<PD1) | (1<<PD2)); //PD0, PD1 oder PD2 als Eingang festlegen; //PIN1,PIN2 und PIN3 wird auf "Low" gesetzt while (1) { PORTB = (PORTB << 1); //PORTB nach links geshiftet //entspricht PORTB = (PORTB << 1) if( PORTB == 0) { PORTB=0x01; //PORTB auf 1 Setzen, damit 1.Led leuchtet } pollButtons(); //Aufruf der Methode pollButtons _delay_ms(zeit); //Warten mit der bestimmten Zeit } } void pollButtons(void) { if( zeit == 0 ){ //Gleich zu Beginn wird die Zeit auf 200ms gesetzt zeit = 200; } if( PIND & (1<<PD0) ) { //wird geprüft, ob das Bit PD0 im Register PIND gesetzt ist. zeit = 200; } if( PIND & (1<<PD1) ) { //wird geprüft, ob das Bit PD1 im Register PIND gesetzt ist. zeit = 140; } if( PIND & (1<<PD2) ) { //wird geprüft, ob das Bit PD2 im Register PIND gesetzt ist. zeit = 80; } if( PIND & (1<<PD3) ) { //wird geprüft, ob das Bit PD3 im Register PIND gesetzt ist. zeit = 20; } }
Sehe grad noch 2 gröbere Fehler: 1. Hans Huber schrieb: > _delay_ms(zeit); //Warten mit der bestimmten Zeit delay_ms sollte nicht mit variablen aufgerufen werden, wenn du eine variable Zeit beötigst, mach es so: for(int temp = zeit; temp; temp--) _delay_ms(1); 2. PIND3 hat noch keinen Pullup -> floatender Eingang auf Taster ?
Ein wenig konstruktive Kritik: Deine Kommentare sind ein super Beispiel, wie man nicht kommentieren sollte, z.B. Hans Huber schrieb: > if( PIND & (1<<PD0) ) { //wird geprüft, ob das Bit PD0 im Register > PIND gesetzt ist. genau das kann man doch schon vorne lesen. Aber was bedeutet das ? Das Kommentar wäre so z.B. eindeutiger:
1 | if( PIND & (1<<PD0) ) { // Taster für 1. Geschwindigkeit ( xx Hz ) wurde gedrückt |
Am besten liest du dir mal alle Kommentare durch und fragst dich, ob sie nicht genau das selbe aussagen, wie der Code davor, z.B. bei den includes. Kommentare dienen Ergänzungen, also warum man den Code an der Stelle so geschrieben hat. Hans Huber schrieb: > pollButtons(); //Aufruf der Methode pollButtons Ach echt ? Hätte ich nicht gedacht. Auch hier kannst du dir die Frage stellen, warum du diese Methode aufrufst. "Abfragen der Taster" wäre schonmal schöner als den Code wirklich eins-zu-eins auszuschreiben.
Hallo, Nein in der Kommentierung schreibt man, warum man diese Zeile schreibt und nicht was sie macht. Gruß Jannis