-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Asuro Ports auf High - Für Leds

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251

    Asuro Ports auf High - Für Leds

    Anzeige

    Hallo

    habe an PC0 und an PC1 eine Led dran.
    Und wollte das zuerst das die Led an PC0 an geht und nach 500 Millisekunden die Led an PC1 aber so das die Led an PC0 etwas dunkler leuchtet, ist das möglich?

    Wenn ich es so mache:
    Code:
    #include "asuro.h"
    
    int main(void) {
    
       while (1) {
    	   
           DDRC |= (1<<PC0);
          PORTC |= (1<<PC0);
    
    	  Msleep(500);
    
           DDRC |= (1<<PC1) | (1<<PC0);
          PORTC |= (1<<PC1);
    
    	  Msleep(500);
    
     }
       return 0;
    
    }
    leuchtet immer nur die Led an PC0!

    mfg
    Philip
    Geändert von AsuroPhilip (11.03.2011 um 18:53 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Hallo Philip,

    der Mikrocontroller deines ASURO (ein ATmega kann seine Ausgangspins, wie sehr viele andere µCs übrigens auch, nur bestimmte Zustände an seinen Ausgangspins schalten. Bei den ATmegas sind das: Ausgang high/low und Eingang mit/ohne Pullup.

    Um die Helligkeit einer LED verändern zu können ("dimmen") bedient man sich daher eines Tricks: Man schaltet sie sehr schnell hintereinander ein/aus. Wenn man ausreichend schnell ist (einige hundert Hertz sollten schon reichen), erkennt das menschliche Auge dieses flackern nicht mehr. Je länger die LED aus ist, desto dunkler erscheint sie. (Das nennt man auch PWM)
    Übrigens wird genau das gleiche Prinzip angewandt, um die Fahrtgeschwindigkeit des ASURO zu steuern.

    mfG
    Markus

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Hi Markus

    Danke erstmal für deine schnelle Antwort.
    Wie mache ich das den mit der Led und schadet das der nicht(An Aus An Aus)?
    Wieso geht denn nach 500 Millis. die andere led nicht an?

    mfg
    Philip

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von AsuroPhilip Beitrag anzeigen
    Wie mache ich das den mit der Led und schadet das der nicht(An Aus An Aus)?
    Nein, LEDs altern nicht durch Ein-/Ausschaltvorgänge.

    Zitat Zitat von AsuroPhilip Beitrag anzeigen
    Wieso geht denn nach 500 Millis. die andere led nicht an?
    Dein Code ist ... komisch, außerdem wäre es empfehlenswert, über die entsprechenden Makros/Funktionen auf die beiden BackLEDs zuzugreifen, was gewisse Fehler ausschließt und den Code außerdem auch ohne ASURO-Schaltplan lesbar macht.

    Ich will mich aber dennoch daran versuchen:
    Code:
    DDRC |= (1<<PC0);
    PORTC |= (1<<PC0);
    Knipst PC0 an, macht aber PC1 NICHT aus.

    Code:
    DDRC |= (1<<PC1) | (1<<PC0);
    PORTC |= (1<<PC1);
    Knipst PC1 an, macht aber PC0 NICHT aus.

    Ich kann aber nicht nachvollziehen, warum bei dir nur PC0 an geht.
    AAAABER: Da du deinen ASURO nicht vernünftig initialisiert hast, ist vieles möglich. Wie oben geschrieben, verwende die Funktionen aus der ASURO-Bibliothek (entsprechend der Dokumentation), allen voran Init().

    mfG
    Markus

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    28.03.2010
    Ort
    nahe München
    Beiträge
    45
    Hi Philip, der Code ist soweit richtig, wie gesagt, die erste LED wird nicht ausgeschalten, das erreichst du, wenn du
    Code:
     
    DDRC |= (1<<PC1) | (1<<PC0);
    PORTC &= ~(1<<PC0); //Schaltet erste LED aus
    PORTC |= (1<<PC1);
    schreibst.
    Wie schon markusj gesagt hat liegt dein Problem bei Msleep(). Da du den ASURO nicht initialisiert hast, ist der Timer nicht gesetzt, der die Zeitsteuerung übernimmt. Die Schleife von Msleep(), die auf diesen Timer wartet, endet in der Endlossschleife, da er gar nicht an ist. d.h. bei Msleep(500) bleibt dein Programm stecken, die Zweite LED geht nicht an. Ein Init() löst also die Probleme.
    Gruß
    ASUR0

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Okay, hat geklappt DANKE!

    Nun zu nächsten "vorhaben" :
    Ist es möglich mit einem 2,5k Poti die Zeit von Mseep zu ändern?
    Habe noch 4 ADC ports frei unter anderen auch PC4 (ADC4) für die Auswertung der Tasten.
    Dann am besten noch das es von 1ms bis max. 200ms geht, möglich?


    mfG
    Philip
    Geändert von AsuroPhilip (12.03.2011 um 19:38 Uhr)

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Okay habe ein poti angeschlossen(PC5) und habe mir mit dem DoctorAsuro programm die spannung auslesen lassen, wenn ich das poti drehe geht die Volt zahl höher bzw. tiefer bis 0V und 5V.
    Also brauche nur noch Software hilfe ;->

    mfG
    Philip

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Also wenn Volt < 1 ist soll er die Zeit von Msleep ändern und wenn Volt < 2 ist wieder ändern usw. oder geht das auch stufenlos?
    Geändert von AsuroPhilip (12.03.2011 um 20:51 Uhr)

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    28.03.2010
    Ort
    nahe München
    Beiträge
    45
    Hi Philip,
    du willst also den PC4 auslesen. Dazu muss man AVCC an VCC anschließen (über widerstand/Spule) und an AREF über einen Kondensator an Masse anschließen (vgl. Asuro-Schaltplan).
    Der Code dazu: (aus AsuroLib, angepasst):

    Code:
     
    unsigned int ReadPC4()
    { 
    ADMUX = (1 << REFS0) | (_BV(MUX2)); // Referenz mit externer Kapazitaet und Mux auf PC4
    ADCSRA |= (1 << ADSC); // Starte AD-Wandlung
    while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten
    ;
    ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen
    return ADC; // Ergebnis als 16-Bit-Wert
    }
    Beim PC4 liefert die Funktion einen Wert zwischen 0 und 255.
    Das kann man dann zur Zeitsteuerung nutzen:

    Code:
     
    Msleep(ReadPC4()*10+200);
    Eine Verzögerung zwischen 200 und 2750 ms.

    Gruß
    ASUR0

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Hi danke für deine antwort hat mir seeeeeeehr weitergeholfen!!
    Geht denn auch eine Verzögerung zwischen 10 und 200 ?

    Habe ein 2,5K Poti an PC4:
    Mitte an PC4
    Potianfang an gnd
    Potiende an vcc

    PS: Kann ich mir zur Kontrolle den msleep wert im hyperterminal anzeigen lassen?
    Geändert von AsuroPhilip (12.03.2011 um 23:44 Uhr)

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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