- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Problem Atmega32 LED blinklicht

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    42
    Beiträge
    131

    Problem Atmega32 LED blinklicht

    Anzeige

    Powerstation Test
    Hallo zusammen

    Ich habe eigentlich nur ein kleines Problem, dass mich aber bereits mehrere Stunden in Anspruch genommen hat.

    Schaltung:

    Es sind zwei LED an PortB0 und PortB2 angeschlossen über einen 1kOhm Widerstand gegen Masse.

    Hardware: Atmega32 4MHz Quarz, progammed mittels avrdude

    Software:

    #include "io.h"
    #include "iom32.h"

    void wait () {

    int i;
    for (i = 0; i <20000; i++) {
    int j;
    for(j = 0; j <20000; j++){

    }

    }
    }



    int main (void)
    {

    //DDRB = (1<<DDB2);
    DDRB = (1<<DDB0) | (1<<DDB2);


    while (1) /* Note [6] */

    wait();
    PORTB = 1;
    wait();
    PORTB = 5;
    wait();

    return (0);
    }

    Die wait-Funktion verzögert ungefähr eine Sekunde. Wahrscheinlich sogar etwas mehr.

    Nun zum Problem: Es funzt gar nicht. Nur dass LED an PortB0 dauernd leuchtet. Was ist falsch? Selbt wen der AVR nicht den externen Quart nehmen würde, sollte dennoch ein blinken stattfinden.

    Danke für eure Hilfe

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    38
    Beiträge
    306
    wenn ich das richtig sehe musst du beim PORTB =5 nicht 5 sondern 4 hinschreiben weil 5 wäre ja 101 und du willst ja eigentlich 001 haben wenn ich das richtig verstehe! So leuchtet die LED an PORTB0 andauernt mit!
    Wenn etwas klemmt, wende Gewalt an.

    Wenn es kaputt geht,
    hätte es sowieso erneuert werden müssen.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    38
    Beiträge
    306

    Re: Problem Atmega32 LED blinklicht

    Zitat Zitat von semicolon
    Hallo zusammen

    int main (void)
    {

    //DDRB = (1<<DDB2);
    DDRB = (1<<DDB0) | (1<<DDB2);


    while (1) /* Note [6] */

    wait();
    PORTB = 1;
    wait();
    PORTB = 5;
    wait();

    return (0);
    }
    Wenn ich richtig bin ist das Zeichen beim DDRB | bedeutet das nicht oder?
    Müsste da nicht ein & hin? Oder && ! Das weis ich jetzt nicht genau!
    Wenn etwas klemmt, wende Gewalt an.

    Wenn es kaputt geht,
    hätte es sowieso erneuert werden müssen.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2006
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    321
    Ja, das bedeutet oder.
    Will man ein Bit auf 1 setzen, so macht man ein oder. Um es auf 0 zu setzen, muss man es mit und behandeln. 1 oder irgendwas gibt immer 1, 0 und irgendwas gibt immer 0.

    Btw, code-Tags wären cool

    Code:
    #include "io.h" 
    #include "iom32.h" 
    
    void wait () 
    { 
    	int i; 
    	for (i = 0; i <20000; i++) 
    	{ 
    		int j; 
    		for(j = 0; j <20000; j++)
    		{ 
    		} 
    
    	} 
    } 
    
    
    
    int main (void) 
    { 
    
    	//DDRB = (1<<DDB2); 
    	DDRB = (1<<DDB0) | (1<<DDB2); 
    
    
    	while (1) /* Note [6] */ 
    
    	wait(); 
    	PORTB = 1; 
    	wait(); 
    	PORTB = 5; 
    	wait(); 
    
    	return (0); 
    }

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    4.255
    Zu Erinnerung mal die korrekte Syntax für das Setzen von Bits in den Registern:

    Bit setzen:
    PORTB |= (1<<PB4);
    (ODER [|] mit der Bitmaske rechts und dem alten Zustand)

    Bit löschen:
    PORTB &= ~(1<<PB4);
    (UND [&] mit der INVERTIERTEN [~] Bitmaske)

    Bit toggeln:
    PORTB ^= (1<<PB4);
    (EXODER [^] mit der Bitmaske)

    PS: für die Verzögerung bietet sich auch folgendes an:
    Code:
    #include <avr/delay.h>
    void warte(uint16_t loop)  //loop: wartezeit in ms 
    {
    	uint16_t i;
    	for(i=0;i<loop;i++) _delay_ms(1);
    }

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2006
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    321
    Moment, hab ich da gerade gesehen
    Code:
       while (1) /* Note [6] */ 
    
       wait();
    ?
    macht das nicht endlos wait?

    Ich denke es sollte wohl eher eine { hinter das wait und dann später nochmal.

    Also praktisch so:


    Code:
    #include "io.h" 
    #include "iom32.h" 
    
    void wait () 
    { 
    	int i; 
    	for (i = 0; i <20000; i++) 
    	{ 
    		int j; 
    		for(j = 0; j <20000; j++)
    		{ 
    		} 
    
    	} 
    } 
    
    
    
    int main (void) 
    { 
    
    	//DDRB = (1<<DDB2); 
    	DDRB = (1<<DDB0) | (1<<DDB2); 
    
    
    	while (1) /* Note [6] */ 
    	{
    		wait(); 
    		PORTB = 1; 
    		wait(); 
    		PORTB = 5; 
    	}
    
    	return (0); 
    }

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    4.255
    Genau! Der While-Schleife fehlen die Klammern!!!
    So ergibt sich für den Compiler eine leere While-Schleife, deren Bedingung immer wahr ist, daher beliebt der AVR für immer in dieser Zeile hängen...

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    38
    Beiträge
    306
    ne aber muss while nicht auch mit geschwiften klammern ein gerückt sein in etwa so:

    int main (void)
    {

    //DDRB = (1<<DDB2);
    DDRB = (1<<DDB0) | (1<<DDB2);


    while (1) /* Note [6] */

    {

    wait();
    PORTB = 1;
    wait();
    PORTB = 5;
    wait();

    }

    return (0);
    }
    Wenn etwas klemmt, wende Gewalt an.

    Wenn es kaputt geht,
    hätte es sowieso erneuert werden müssen.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2006
    Ort
    Stuttgart
    Alter
    44
    Beiträge
    321

    Re: Problem Atmega32 LED blinklicht

    Zitat Zitat von semicolon
    /* Note [6] */
    Nur Spass... Hat bestimmt jeder schonmal sowas gebaut

    Ich zumindest bin das erste Mal fast verzweifelt, als ich nach einem while() was gelöscht hatte und aber den ; nicht mitgelöscht habe und dann nie was tat.

    EDIT:
    Das letzte wait() habe ich in meinem Stück Code übrigens auch weggelassen, da ja sonst das wait() ausgeführt wird, dann die Schleife von neuem anfängt, wo dann gleich wieder ein wait() steht. Falls das so geplant war, dann wieder einfügen

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    42
    Beiträge
    131

    Hab leider die hübschen tollen {} vergessen

    Danke für eure Hilfe.

    Habe vor lauter Bäume den Wald nicht mehr gesehen.

    Tja, was weggelassene {} so alles auswirken können?!

    Danke nochmals

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen