AVR LED und Steuer Programm



  • Hallo Leute,

    eins vorweg, ich bin absoluter Einsteiger was C++ angeht, und plänkel aktuell noch in den Basics herum. Falls das Thema woanders hingehört bitte verschieben!

    Ich will mir ein kleines Programm für mein eigenes Projekt schreiben und möchte dabei erreichen, dass ich zunächst erst einmal LEDs über einen Schalter (aktuell an PINA0) anschalten und in einer Art Abfolge laufen lassen kann.

    Das Hauptproblem besteht darin, dass ich aktuell nicht weiß wie ich permanent den Schalter abfrage und meine LED-Abfolge damit starten lassen kann. Zudem weiß ich nicht wie ich die Abfolge unterbreche, falls der Schalter wieder auf "Aus" gestellt wird.

    Die LEDs funktionieren in der gewünschten Abfolge bereits ohne Schalter über die PWM Steuerung. Aber die Integration des Schalters und damit der Start oder Abbruch darüber machen mir Kopfzerbrechen.

    Hier mal mein bisheriges Programm:

    /*
     * PWM.c
     *
     * Created: 24.10.2015 17:56:40
     * Author : lkrie
     */ 
    
    #define F_CPU 970000UL
    #include <avr/io.h>
    #include <util/delay.h>
    //#include <conio.h>
    
    int wert = 3; //PWM Differenzwert - Verkürzt oder verlängert das PWM Signal
    //int wert2 = 200;
    int maxperf = 255; //maximale Leistung liegt bei 255
    int minperf= 0; //minimale Leistung liegt bei 0
    
    int main(void)
    {
    	DDRD = 0;
    	DDRB = 0xFF;
    	DDRA = 0x00;
    	PORTA = 0xff;
    	TCCR0A = (1<<WGM00)|(1<<COM0A1);
    	TCCR1A = (1<<WGM10)|(1<<COM1A1);
    	TCCR0B = (1 << CS01);
    	OCR0A = 0;
    	OCR0B = 0;
    
    	while(1)
    	{
                            //hier soll der Schalter rein, mitdem ich den Start der Abfolge initieren kann. 
    			for (OCR0A = minperf; OCR0A < maxperf; OCR0A = OCR0A + wert)
    			{
    			_delay_ms(10);
    			}
    			for (OCR0A = maxperf; OCR0A > minperf; OCR0A = OCR0A - wert)
    			{
    			_delay_ms(10);
    			}
    			for (OCR0A = minperf; OCR0A < maxperf; OCR0A = OCR0A +  wert)
    			{
    			_delay_ms(10);
    			}
    			for (OCR0A = maxperf; OCR0A > minperf; OCR0A = OCR0A - wert)
    			{
    			_delay_ms(10);
    			}
    			_delay_ms(600);
    				for (OCR0A = minperf; OCR0A < maxperf; OCR0A = OCR0A + wert)
    				{
    					_delay_ms(10);
    				}
    				for (OCR0A = maxperf; OCR0A > minperf; OCR0A = OCR0A - wert)
    				{
    					_delay_ms(10);
    				}
    				for (OCR0A = minperf; OCR0A < maxperf; OCR0A = OCR0A +  wert)
    				{
    					_delay_ms(10);
    				}
    				for (OCR0A = maxperf; OCR0A > minperf; OCR0A = OCR0A - wert)
    				{
    					_delay_ms(10);
    				}
    				_delay_ms(500);
    								for (OCR0A = minperf; OCR0A < 180; OCR0A = OCR0A + wert)
    								{
    									_delay_ms(12);
    								}
    								for (OCR0B = 0; OCR0B < 10; OCR0B = OCR0B + OCR0B)
    								{
    									_delay_ms(600);
    								}
    	}
    }
    


  • Das einfachste ist, du prüfst den Zustand von dem Eingabepin.
    Dazu musst du den Port abfragen und das Bit, das für den Pin steht maskieren (das geht mit dem bitweisen AND &).
    Wie das genau geht, solte auch in deinem Tutorial behandelt werden.

    So ein Taster prellt (er geht beim schalten mehrmals schnell an und aus).
    Da aber die Blinkerei gut 10 Sekunden dauert und du in der Zeit nicht reagieren kannst, spielt das eber eigentlich keine Rolle mehr.

    Dein Programm ist kein C++ sondern reines C, was aufgrund der begrenzten Resourcen auf so einem AVR auch ok ist.
    Zudem beschäftigt sich dieses Forum mehr mit Software (Standardkonforme Programmierung) als mit Hardwareprogrammierung.
    Daher bist du zumindest im falschen Unterforum gelandet.

    Du solltest mal bei https://www.mikrocontroller.net/ vorbei schauen.
    Da gibt es dann auch Interrupt gesteuerte Entprellroutinen oder auch Beispiele für eine Statemachine, die für die Aufgabe besser geeignet wäre.
    Auch die anderen Grundlagen für deine Versuche kannst du da bekommen.


Log in to reply