Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Ports auf High - Für Leds
AsuroPhilip
11.03.2011, 18:40
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:
#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 :p
Hallo Philip,
der Mikrocontroller deines ASURO (ein ATmega8) 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 (http://www.rn-wissen.de/index.php/Pwm))
Übrigens wird genau das gleiche Prinzip angewandt, um die Fahrtgeschwindigkeit des ASURO zu steuern.
mfG
Markus
AsuroPhilip
11.03.2011, 19:10
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
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.
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:
DDRC |= (1<<PC0);
PORTC |= (1<<PC0);
Knipst PC0 an, macht aber PC1 NICHT aus.
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
Hi Philip, der Code ist soweit richtig, wie gesagt, die erste LED wird nicht ausgeschalten, das erreichst du, wenn du
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
AsuroPhilip
12.03.2011, 18:55
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
AsuroPhilip
12.03.2011, 20:03
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
AsuroPhilip
12.03.2011, 20:45
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?
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):
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:
Msleep(ReadPC4()*10+200);
Eine Verzögerung zwischen 200 und 2750 ms.
Gruß
ASUR0
AsuroPhilip
12.03.2011, 23:32
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?
Hast du die AsuroLib? Dadrin gibt es eine Funktion, um Zahlen an HT zu übertragen.
Man kann z.B. mit
Msleep(ReadPC4()+10);
eine Verzögerung zwischen 10 und 265 ms erhalten.
Gruß ASUR0
AsuroPhilip
13.03.2011, 14:21
Man kann z.B. mit
Msleep(ReadPC4()+10);
eine Verzögerung zwischen 10 und 265 ms erhalten.
Wie rechnest du das denn?
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.