- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 30

Thema: LED dimmen (Hilfe bei Valentinstagsgeschenk)

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    Anzeige

    Praxistest und DIY Projekte
    Also meine Herz-Grundplatte ist soweit fertig .
    Die Schaltung hab ich aufm Steckbrett aufgebaut.
    Die PWM mit dem tiny will mir einfach nicht gelingen. Mit meinem mega8515 funktionierts, allerdings mit dem Timer1. Funktioniert denn PWM mit Timer0 überhaupt?
    Muss vielleicht in den Fuse-Bits noch was umgestellt werden?

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    das hab ich mittels poti und ADC auf nem ATMega8 bei 8MHz getestet .... bis auf ein paar übergangsflackereien (vermutlich vom poti und beim updaten des OCR register) funktioniert es eigentlich ganz gut, und man könnte theoretisch für jeden port ne neue Duty Variable und StatusVariable einbauen ... zu not kann man auch PIN statt der statusvariable abfragen, aber mir rennt die zeit davon das noch zu testen ...
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/timer.h>
    #include <avr/signal.h>
    #include <avr/sleep.h>
    
    #define ON 1
    #define OFF 0
    #define ULONG_MAX 199
    
    volatile unsigned char OFVal;
    unsigned char LED1Duty;
    unsigned char LED1Stat;
    
    
    
    
    SIGNAL(SIG_OUTPUT_COMPARE2)
    {
    	if (OFVal++ == 200) OFVal = 0;
    	LED1Duty = (ADC*10)/(1024/10)-1;
    	if (LED1Stat == OFF && (ULONG_MAX-LED1Duty) == OFVal)
    	{
    		PORTB |= BV(PB1);
    		LED1Stat = ON;
    	}
    	if (LED1Stat == ON && ULONG_MAX-(ULONG_MAX-LED1Duty) == OFVal) 
    	{
    		PORTB &= ~BV(PB1);
    		LED1Stat = OFF;
    	}
    }
    
    int main(void)
    {
    	cli();
    	OFVal = 0;
    	DDRB = BV(PB1)|BV(PB2)|BV(PB3)|BV(PB4);
    	TIMSK = BV(OCIE2)|BV(TOIE2); //TOIE2 musste ich mit einschalten hat sonst nciht fuinktioniert (komisch ....)
    	TCNT2 = 0;
    	OCR2 = 100; //damit kannste die auflösung einstellen 100% sind wegen der ADC formel notwendig
    	TCCR2 = BV(WGM21)|BV(CS20); //CTC modus, prescaler 1
    	LED1Duty = 1;
    	LED1Stat = OFF;
    	ADCSRA = BV(ADFR) | BV(ADPS2) | BV(ADPS1); // ADC einstellungen
    	ADMUX = BV(REFS0);
    	ADCSRA |= BV(ADEN);
    	ADCSRA |= BV(ADSC);
    	sei();
    	while(1) ;
    }
    da bleiben auch noch ausreichend takte für die while schleife übrig, zur not kannst den prescaler auch noch hochschrauben, dann haste allerdings nen flackernden effekt wenn du es schnell hinundher bewegst

    hoffe ich konnte helfen

    MfG

    Ceos

    PS den duty berechne ich im interrupt, ADC 0-1024 mit der formel gibt das 0-100 (0-100%) wenn du ne andere auflösung verwendest brauchst du hier ein duty zwischen 0 - OCR (achtung, OCR bedeutet LED aus, OCR-1 allerdings maximum)

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    Vielen Dank für deine mühe aber in (ich nehme an) cc hab ich noch gar keinen plan. Hab bis jetzt meine ersten "gehversuche" nur in basic gemacht. Das schien mir für den Anfang etwas einfacher zu sein.

    Gruß Malte

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.03.2006
    Ort
    WOB
    Beiträge
    630
    Das mit dem Timer könnte natürlich ein Problem sein, aber sollte ja gehen. Guck doch mal bitte ins Datenblatt des Tiny, da steht doch genau drin welcher Timer wie PWM macht/kann.
    Gruß Thomas \/

    Alles über AVR, PIC und CAN
    blog.cc-robotics.de

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    link mir mal das datenblatt und beschreib mal was das herz machen soll, vll. kann ich dir dabei helfen (dir ne HEX schustern und erklären wenn du magst), du hast mich da nämlich auf ne idee gebracht und damit könnte ich gleich mal "üben" ^_^

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    20.01.2008
    Beiträge
    66
    Also ich habe drei farben. Drücke ich nun Taster 1 soll z.B. rot angehen und hell und dunkel faden. Das wars eigentlich schon. Die Farben grün und blau kann man dann (mit noch jeweils einem Taster )nach lust und laune einschalten oder auch nicht. Das sollte selbst ich gebacken kriegen aber wie gesagt, ich bekomme die PWM nicht zum laufen.
    Ich mach das Herzchen jetzt soweit fertig da es ja morgen schon soweit ist . Hab es erstmal nur so gemacht das ich die drei farben einfach an und aus machen kann. Ich will es aber später noch nachträglich drauf flashen.

    Wäre echt super wenn du mir noch helfen könntest.
    Hier ist der link für den tiny13 http://www.atmel.com/dyn/products/pr...+&part_id=3175

    PS.: Bin fast verzweifelt weil ich einen Tag nicht ins forum gekommen bin. War das nur bei mir so?

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.03.2006
    Ort
    WOB
    Beiträge
    630
    ging mir auch so.

    guck mal ob das hilft
    https://www.roboternetz.de/phpBB2/vi...=351775#351775

    Zum Herz: du wirst sehen sie freut sich ob leuchtend oder fadend, hauptsache es kommt von dir
    Gruß Thomas \/

    Alles über AVR, PIC und CAN
    blog.cc-robotics.de

  8. #18
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    nein ich bin gestern auch net mehr reingekommen sorry, leider muss ich für morgen noch was proggen tut mir unheimlich leid

  9. #19
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    50
    Beiträge
    377
    Zitat Zitat von Malte0815
    Ich habe nun zunächst versucht ohne taster eine led anzusteuern. Ich bekomme 2 Fehlermeldungen: Out of SRAM space (Line 10);
    Hallo Malte0815!

    Der ATtiny13 ist ein sche... Ding. :-( Er hat so wenig SRAM, dass man kaum etwas Vernünftiges damit machen kann. Software-PWM ist damit machbar, aber um Speicherplatz zu sparen würde ich auf jeden Fall Hardware-PWM anstreben.

    Dann musst du die Werte für den HW-Stack, den SW-Stack und den Framesize anpassen. Ich habe ein Programm im ATtiny13 laufen und dieses läuft bei mir wenn ich folgende Werte dafür verwende:

    Code:
    $regfile = "attiny13.dat"
    $crystal = 9600000
    $hwstack = 32
    $swstack = 5
    $framesize = 20
    Leider ist das immer von Programm zu Programm verschieden. Am Besten, du testest das Programm in Bascom und schaust dir im Testprogramm den Karteikartenreiter "uP" an. Es sollte kein Häckchen bei "Frame Overflow" oder "Stack Overflow" auftauchen. Dann sind die Werte OK.

    Dazu musst du dein Programm im Simulator laufen lassen und mit "Pause" unterbrechen. Erst dann findest du dort im Karteikartenreiter "uP" sinnvolle Ausgaben.

    Interessant zu diesem Thema sind auch diese Links:
    - http://avrhelp.mcselec.com/index.html?memory_usage.htm
    - https://www.roboternetz.de/wissen/in.../Bascom_Inside
    - http://avrhelp.mcselec.com/index.html?stcheck.htm

    Damit dürfte dein Programm laufen. Aber da dein Programm sowiso noch so klein ist, müsste es auch ohne die Anpassung der Stackgrößen arbeiten. Wichtig wird das erst, wenn du noch ein paar mehr Variablen verwendest und evt. sogar in Unterroutinen springst.

    Das hier funktioniert zumindest im Simulator:
    Code:
    $regfile = "ATtiny13.dat"
    $crystal = 4000000
    '$hwstack = 32
    '$swstack = 5
    '$framesize = 20
    
    Config Timer0 = Pwm , Compare A Pwm = Clear Down , Prescale = 8
    
    Config Portb.2 = Output
    
    Dim A As Byte
    
    
    Do
       For A = 0 To 255 Step 1
          Pwm0a = A
          Waitms 10
       Next
    
       For A = 255 To 0 Step -1
          Pwm0a = A
          Waitms 10
       Next
    Loop
    End
    Vielleicht kannst du damit etwas anfangen. Ich habe es aber nicht real getestet.

    mfg
    Gerold
    :-)


    PS: Ist nicht PORTB.0 der PWM-Ausgang?

    PS2: Vielleicht kannst du den Prescale des Timers noch nach oben drehen. Experimentier mal ein bischen mit den verschiedenen Werten. Mir kommt 8 ziemlich wenig vor.

    .

  10. #20
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    @phyton zu dem prescale 8 kommt hinzu, das der interrupt nur alle 256counts ausgelöst wird, also 8*256 freie zyklen fürs programm, find cih eigentlich ausreichend

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress