Hallo, Ich habe mir eure Vorschläge zu Herzen genommen und habe mich mit dem AVR - Tutorial beschäftigt. Ich möchte eine Abfrage mit einem Taster machen. Wenn der Taster gedrückt (Low - Activ), dann führe eine Aktion aus.Im Folgenden ein Auszug aus meinem Quelltext: while (Belichtungsdauer <= 99.00) { if (Taster (&PINB, PB7)) { //Aktion ... hier wird die Variable 'Belichtungsdauer //hochgezählt } } //---------------------------------------------------------------------- --------------------- //Taster - Funktion: Entprellen des Tasters inline uint8_t Taster(volatile uint8_t *port, uint8_t pin) { if ( ! (*port & (1 << pin)) ) { while (Zaehler <= 1); if ( *port & (1 << pin) ) { while (Zaehler <= 1); return 1; } } return 0; } //---------------------------------------------------------------------- --------------------- Zur Erklärung ... Es handelt sich um die Funktion wie sie im tutorial beschrieben ist. Ich habe lediglich die "_delay..." durch eine Timergesteuerte Funktion ersetzt ... auch 100ms .. Und habe die Funktion in 'Taster' umbenannt.. Bekomme nun Fehlermeldungen ... zB. "conflicting Types for 'taster' aber weiß net wieso? Mfg Timo
Timo wrote: > Hallo, > Ich habe mir eure Vorschläge zu Herzen genommen und habe mich mit dem > AVR - Tutorial beschäftigt. > Ich möchte eine Abfrage mit einem Taster machen. Wenn der Taster > gedrückt (Low - Activ), dann führe eine Aktion aus.Im Folgenden ein > Auszug aus meinem Quelltext: > > while (Belichtungsdauer <= 99.00) > { > if (Taster (&PINB, PB7)) { > //Aktion ... hier wird die Variable 'Belichtungsdauer > //hochgezählt > > } > } > > //---------------------------------------------------------------------- --------------------- > //Taster - Funktion: Entprellen des Tasters > > inline uint8_t Taster(volatile uint8_t *port, uint8_t pin) > { > if ( ! (*port & (1 << pin)) ) > { > while (Zaehler <= 1); > if ( *port & (1 << pin) ) { > while (Zaehler <= 1); > return 1; > } > } > return 0; > } > > //---------------------------------------------------------------------- --------------------- > > > Zur Erklärung ... > Es handelt sich um die Funktion wie sie im tutorial beschrieben ist. Ich > habe lediglich die "_delay..." durch eine Timergesteuerte Funktion > ersetzt ... auch 100ms .. > Und habe die Funktion in 'Taster' umbenannt.. > > Bekomme nun Fehlermeldungen ... zB. "conflicting Types for 'taster' > aber weiß net wieso? > C Regel: Der Compiler arbeitet deinen Quelltext von oben nach unten durch und zwar nur einmal. Jetzt stösst er bei der Bearbeitung von main() auf folgendes if (Taster (&PINB, PB7)) Nachdem der Compiler nóch nie irgendwas von einer Funktion 'Taster' gehört hat (die ist im Quelltext weiter unten), gelten Standardannahmen was Argumenttypen bzw. Returnwerte betrifft. Die benutzt der Compiler auch und kann so den Aufruf übersetzen. Der Compiler geht aber weiter im Text. Und irgendwann erblickt er dann die Funktion Taster in ihrer vollen Schönheit: inline uint8_t Taster(volatile uint8_t *port, uint8_t pin) und jetzt vergleicht der Compiler die Datentypen der Argumente und des Return Wertes mit denen die er beim Aufruf angenommen hat, annehmen musste, weil es keinen Protoypen für Taster gab. Und siehe da: Die beiden sind nicht identisch. Bzw. sie sind so dass sie nicht kompatibel sind. Also spuckt der Compiler ein " conflicting Types for 'taster' " aus. Abhilfe: Schreib einen Prototypen füd die Funktion Taster an den Programmanfang.
Danke Jan... Also nochmal für Alle ... Habe vergesser dem Programm mitzuteilen, dass es die Funktion "Taster" gibt, sprich ich musste
1 | inline uint8_t Taster(volatile uint8_t *port, uint8_t pin); |
vor die Hauptfunktion schreiben ... Danke es läuft
Timo wrote: > inline uint8_t Taster(volatile uint8_t *port, uint8_t pin) > { > if ( ! (*port & (1 << pin)) ) > { > while (Zaehler <= 1); > if ( *port & (1 << pin) ) { > while (Zaehler <= 1); > return 1; > } > } > return 0; > } > > //---------------------------------------------------------------------- --------------------- > > > Zur Erklärung ... > Es handelt sich um die Funktion wie sie im tutorial beschrieben ist. Ich > habe lediglich die "_delay..." durch eine Timergesteuerte Funktion > ersetzt ... auch 100ms .. da hier nirgends ersichtlich ist, wann die Zeit gestartet wird (sprich wann Zaehler auf 0 gesetzt wird), misst deine 'timergesteuerte Funktion' alles Mögliche, nur keine 100 ms Wenn man eine Zeitdauer messen will, muss man Startzeit und Endzeit festlegen. Siehs mal so: Wenn du eine Stunde abwarten willst, dann hilft es dir nichts wenn du zu einer Sanduhr geht, die schon läuft. Du musst die Sanduhr schon selbst starten und warten bis sie abgelaufen ist.
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.