Forum: Gesperrte Threads AVR Programm


von Hans Huber (Gast)


Lesenswert?

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
von 123 (Gast)


Lesenswert?


von Hans Huber (Gast)


Lesenswert?

Ja ich brauche bitte trotzdem Hilfe !

von 123 (Gast)


Lesenswert?

Ja aber du bekommst hier keine!

von Hans Huber (Gast)


Lesenswert?

Und wieso nicht bzw. wo bekomm ich Hilfe?

von Floh (Gast)


Lesenswert?

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.

von Hans Huber (Gast)


Lesenswert?

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?

von Floh (Gast)


Lesenswert?

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.

von Hans Huber (Gast)


Lesenswert?

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

von Floh (Gast)


Lesenswert?

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 ?

von AVerr (Gast)


Lesenswert?

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.

von Hans Huber (Gast)


Lesenswert?

Ich soll ja die erklären, was die einzelnen Zeilen machen

von Jannis C. (kabelwurm)


Lesenswert?

Hallo,
Nein in der Kommentierung schreibt man, warum man diese Zeile schreibt 
und nicht was sie macht.
Gruß Jannis

von Hans Huber (Gast)


Lesenswert?

Ja ist schon klar. Ich soll aber erklären was die Zeile macht

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.