-
        

Ergebnis 1 bis 9 von 9

Thema: Einfache Frage... ode besser Starthilfe 2

  1. #1

    Einfache Frage... ode besser Starthilfe 2

    Anzeige

    Ich habe grad folgendes kleines Programm geschrieben:
    PS: Ich benutze Myavr-Board.

    Code:
    //Testprogramm zum testen der LEDs und Schalter
    //Der Schalter hängt an PortD Pin 2, die LEDs hängen an PortC
    #include <avr/io.h>
    #include <inttypes.h>
    #ifndef F_CPU
    #define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */
    #endif
    #include <avr/delay.h>      /* definiert _delay_ms() ab avr-libc Version 1.2.0 */
    
    int main(void)
    {
    
     DDRC = 0xFF; // PortC Ausgänge
     DDRD = 0x00; // PortD Eingänge
     PORTD = 0xFF; //Pullups PortD aktiviert
    
     //Bit 2 an PORTD auswerten
     if ( ! PIND & 0x04) //Wenn PortD Bit2 0 hat
           {
           PORTC=0xFF; //Schalter gedrückt 
           }
        else
           {
           PORTC=0x00; //Schalter nicht gedrückt
           } 
            
    return 0;
    }
    Ich kann drücken wie ich will, da leuchtet nichts... ?

    PS: Habe gerade mal an pin D.2 gemessen, passt alles. Unbetätigt liegen +5V an, betätige ich den Taster liegen 0V an.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    51
    Beiträge
    247
    Hallo

    Fehlt hier nicht eine Klammer

    Code:
    if ( ! PIND & 0x04) //Wenn PortD Bit2 0 hat

    sollte doch so sein

    Code:
    if ( ! (PIND & 0x04)) //Wenn PortD Bit2 0 hat
    Gruß
    Dieter

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi Moonwalker,
    ich denk mal dein Problem ist wenn du drückst ist dein Programm schon abgelaufen! Du müsstest theoretisch den Taster gedrückt halten während du resetest! Oder du baust deinen Abfrage und Ausgabe Block in ne Endlosschleife ein! Also statt:
    Code:
    int main(void) 
    { 
    
     DDRC = 0xFF; // PortC Ausgänge 
     DDRD = 0x00; // PortD Eingänge 
     PORTD = 0xFF; //Pullups PortD aktiviert 
    
     //Bit 2 an PORTD auswerten 
     if ( ! PIND & 0x04) //Wenn PortD Bit2 0 hat 
           { 
           PORTC=0xFF; //Schalter gedrückt 
           } 
        else 
           { 
           PORTC=0x00; //Schalter nicht gedrückt 
           } 
            
    return 0; 
    }
    so
    Code:
    int main(void) 
    { 
    
     DDRC = 0xFF; // PortC Ausgänge 
     DDRD = 0x00; // PortD Eingänge 
     PORTD = 0xFF; //Pullups PortD aktiviert 
    
     //Bit 2 an PORTD auswerten 
     for(;;)
     {
      if ( ! PIND & 0x04) //Wenn PortD Bit2 0 hat 
           { 
           PORTC=0xFF; //Schalter gedrückt 
           } 
        else 
           { 
           PORTC=0x00; //Schalter nicht gedrückt 
           } 
     }        
    return 0; 
    }
    wenn du die Endlosschleife hast wird der Taster die ganze Zeit abgefragt und nicht nur einmal ganz am Anfang!
    Gruß Michi

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    51
    Beiträge
    247
    Achso

    Es fehlt auch noch eine Endlosschleife, sonst ist das Programm so schnell zu Ende, das du keine Zeit hast, zu drücken

    Code:
     //Testprogramm zum testen der LEDs und Schalter
    //Der Schalter hängt an PortD Pin 2, die LEDs hängen an PortC
    #include <avr/io.h>
    #include <inttypes.h>
    #ifndef F_CPU
    #define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */
    #endif
    #include <avr/delay.h>      /* definiert _delay_ms() ab avr-libc Version 1.2.0 */
    
    int main(void)
    {
    
     DDRC = 0xFF; // PortC Ausgänge
     DDRD = 0x00; // PortD Eingänge
     PORTD = 0xFF; //Pullups PortD aktiviert
    
    while(1) {
    
    
     //Bit 2 an PORTD auswerten
     if ( ! (PIND & 0x04)) //Wenn PortD Bit2 0 hat
           {
           PORTC=0xFF; //Schalter gedrückt
           }
        else
           {
           PORTC=0x00; //Schalter nicht gedrückt
           }
     
      }
    
          
    return 0;
    }

  5. #5
    Stimmt Das ging wohl alles etwas schnell zu ende Danke für die schnellen Antworten, ihr habt mir sehr geholfen.

    PS: Vielleicht hätt ich den Taster schon beim Programmieren drücken sollen *lach*

    Eine kurze Frage: Es funktioniert jetzt, aber für was steht die 1 hinter deiner While-Endlos-Schleife:

    while (1) ??!!.. wenn ich die 1 weg lasse bringt der compiler nen Fehler.
    wäre auch gegangen while () , oder?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi Moonwalker,
    du kannst auch als Endlosschleife die while einsetzen!
    while(1) bedeutet das der Schleifen Inhalt ausgeführt wird sobald die bedingung in der Klammer wahr ist und da 1 gleich wahr ist wird der Inhalt endlos ausgeführt weil sich die Bedingung nicht verändert!
    Gruß Michi

  7. #7
    Als nächstes werde ich mal versuchen einen Analog-Eingang vom Poti direkt an eine LED weiterzugeben. Falls es schwierigkeiten gibt werde ich sie gleich hier posten. Vielleicht entsteht hier ja ein kleines Tutorial das anderen Anfängern genau so weiter hilf wie mir.

    Greetings Moonwalker..

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2004
    Ort
    In der Nähe von Esslingen am Neckar
    Beiträge
    706
    Hi Moonwalker,
    ach du meinst das Poti über den ADC einlesen und die LED per PWM entsprechend dimmen?
    Gruß Michi

  9. #9
    Ja genau das meine ich. 0-5V über den ADC einlesen und das ganze genau so wieder ausgeben. Aber heute wird da nicht so viel laufen, war ein langer abend gestern. Was mich auch noch interessieren würde: Die LED schaltet ein wenn z.B. 2,5V am Eingang X anliegen. Also bei 127 wenn der IC usw. genau
    sind.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •