-         

Ergebnis 1 bis 10 von 10

Thema: Hilfe beim Anfang mit GCC

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    30.01.2008
    Beiträge
    89

    Hilfe beim Anfang mit GCC

    Anzeige

    Ich habe angefangen einen Mega32 mit AVR Studio (mit GCC), AVRISP mkII und Pollinboard zu programmieren.

    Jetzt möchte ich erstmal eine LED blinken lassen.
    Die LED geht an, kurze Zeit später wieder aus und dann passiert nix mehr.

    So sieht mein Programm aus:
    Code:
    #include <avr/io.h>
    #ifndef F_CPU
    #define F_CPU 16000000UL
    #endif
    #include <util/delay.h>
    
    int main (void) {
    
    	DDRD = 0x00;
    	DDRD = (1 << DDD5) | (1 << DDD6) | (1 << DDD7);
    	PORTD |= (1<<DDD2) | (1 << DDD3) | (1 << DDD4);
    
    	PORTD |= (1<<PD5);
    	_delay_ms(16);
    
    
    	PORTD &= (1<<PD5);
    	_delay_ms(16);
    
    
    	return 0;
    }
    Wo ist der fehler?
    Sollte es nicht durch das return zurückspringen?
    Oder muss ich dafür eine Schleife und einen Timer nehmen?

    LG
    Teri

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Hi Teri,
    das Programm wird bei dem return 0 beendet. Zu dieser Anweisung darf es quasi nie kommen, also baut man immer eine while-Schleife in die main ein.

    Um
    Code:
    PORTD |= (1<<PD5);
       _delay_ms(16);
    
    
       PORTD &= (1<<PD5);
       _delay_ms(16);
    Machst du einfach eine while-Schleife, die immer wahr ist.

    Also
    Code:
    while(1)
    {
        ... tue etwas
    }
    Viele Grüße
    CsT

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    30.01.2008
    Beiträge
    89
    Danke.
    Jetzt sieh es so aus und die LED blinkt:
    Code:
    int main (void) {
    
    	DDRD = 0x00;
    	DDRD = (1 << DDD5) | (1 << DDD6) | (1 << DDD7);
    	PORTD |= (1<<DDD2) | (1 << DDD3) | (1 << DDD4);
    
    	while(1)
    	{
    		PORTD |= (1<<PD5);
    		_delay_ms(16);
    		
    		PORTD &= ~(1<<PD5);
    		_delay_ms(16);
    	}
    
    	return 0;
    }
    Aber ich werde bestimmt noch mehr Probleme und fragen haben.

    LG
    Teri

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    30.01.2008
    Beiträge
    89
    Jetzt möchte ich LED1 mit Taster1 einschalten und mit Taster 2 ausschalten.
    Die Taster sind mit Pulldowns an die Pins angeschlossen
    (parallel zu den Pulldowns(33K) liegen Kondensatoren(0,33µF) (zur Entprellung)).

    Code:
    #include <avr/io.h>
    
    int main (void) {
    
    	DDRD = 0x00; 	 								/*PortD 0-7 -> Eingang*/
    	DDRD = (1 << DDD5) | (1 << DDD6) | (1 << DDD7); /* PortD 5-7 -> Ausgang*/
    
    	while(1)
    	{
    		if ( PIND & (1<<PIND2) ) { 		/*Taster1*/
    			PORTD |= (1<<PD5);			/*LED1 einschalten*/
    		}
    		if ( PIND & (1<<PIND3) ) {			/*Taster2*/
    			PORTD &= ~(1<<PD5);		/*LED2 ausschalten*/
    		}
    
    	}
    
    }
    Wo habe ich denn jetzt wieder den Fehler?
    Ich habe mich nach dem AVR-GCC-Tutorial bei mikrocontroller.net gerichtet.

    LG
    Teri

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.190
    Hast du das im Simulator probiert?
    Bei mir funktioniert es.
    Alle Jumper am Board gesetzt?
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Im Programm sehe ich eigentlich auch keinen Fehler, ich kann mir aber gut vorstellen, dass der Taster trotz Kondensator noch prellt ..

    Grüße
    Tobi

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Hallo,
    nimm die Pullups, die im Controler schon integriert sind. Den Taster zwischen AVR und Masse.
    Versuch mal:

    Ein-/Ausgänge definieren(wie du willst)
    Pullup z.B. bei portd, pin0 aktivieren
    outp (0x01,PORTD); // Pull-Up auf Port D, Pin 0 aktivieren

    Auslesen:
    /* Pin 0 von Port D abfragen, eine logische 0 heisst 'Taster gedrückt'.
    ACHTUNG: Es muss Register PIND abgefragt werden, nicht PORTD */
    if (bit_is_clear (PIND, PIND0)) {
    tu was.........
    }

    In C nimmt man normalerweise statt "while(1)" bevorzugt "for (;"

    mfg

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    also der smiley sollte eigentlich noch ein ; sein und dahinter ")"

    mfg

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    30.01.2008
    Beiträge
    89
    Jumper sind alle gesetzt.
    Habe es jetzt nochmal genau so geflasht und es geht ohne Probleme.

    Prellen würde glaube ich auch nur Probleme machen, wenn man was zählen möchte oder die LED mit einem Taster ein- und wieder ausschalten möchte.

    LG
    Teri

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.05.2006
    Beiträge
    144

    Re: Hilfe beim Anfang mit GCC

    Zitat Zitat von Teri
    DDRD = 0x00;
    DDRD = (1 << DDD5) | (1 << DDD6) | (1 << DDD7);
    die erste zeile könntest du dir sparen.
    denn in der zweiten zeile steckt die erste drinnen.

    außer du machst es so

    Zitat Zitat von Teri
    DDRD = 0x00;
    DDRD |= (1 << DDD5) | (1 << DDD6) | (1 << DDD7);
    mfg
    low
    meine aktuellen Projekte
    Sternenhimmel
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31439
    BuBoter - Roboter mit Antikolision
    http://www.roboternetz.de/phpBB2/viewtopic.php?t=31632

Berechtigungen

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