-         

Ergebnis 1 bis 9 von 9

Thema: AVR programmieren in C - Einsteigerfragen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    26
    Beiträge
    460

    AVR programmieren in C - Einsteigerfragen

    Anzeige

    Hallo!
    Ich habe vor 2 Tagen begonnen, mikrocontoller zu programmieren, und habe auch schon ein paar Programme geschrieben, die dann auch funktioniert haben (Led an, ports als ein- oder ausgang festlegen, blinklichter, ...)
    Das war aber alles nur mit ausgängen, jetzt will ich auch mal eingänge probieren. Dazu habe ich dann folgendes programm geschrieben:

    Code:
    #include <avr/io.h>
    #include <stdint.h>
    
    #define F_CPU 3686400UL
    #include <util/delay.h>
    
    
    int main (void)
    
    {	DDRB=0x00;				// Port B  als Eingang
    	PORTB=0xff;				// Pull-ups auf Port B ein
    	DDRC=0xff;				// Port C als Ausgang
    	PORTC=0x00;				// Alle Pins auf Port C auf low
    	
    	uint8_t taster;
    
    	while (1) 
    	{	taster=PINB;		// Zustände von Port B in Variable taster speichern
    
    		while (taster)		// Wenn taster gedrückt
    		{	PORTC=0xff;		// Port C (wo LED angeschlossen) ein
    			taster=PINB;	// Abfragen ob taster gedrückt
    		}
    			
    		
    		while(taster==0)	// Wenn Taster nicht gedrückt
    		{	PORTC=0x00;		// Led aus
    			taster=PINB;	// Abfragen ob taster gedrückt
    		}
    	
    	}
    	return 0;
    }
    Die led hängt auf port c, der taster auf port b.
    Die Led sollte leuchten, wenn ich den taster drücke.

    wenn ich es auf dn AVR brenne, leuchtet die led einfach nur, egal ob ich drücke oder nicht.

    Könnt ihr mir sagen was ich falsch mache?
    Und kennt ihr ein tutorial, bei dem das programmieren anhand von beispielen erklärt wird, oder nur irgendeine homepage, wo es den quellcode von so einfachen programmen gibt?
    Beim tutorial von microcontroller.net finde ich gibt es zu wenige (vollständige) beispiele.

    Grüße,
    Christoph

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.02.2005
    Alter
    29
    Beiträge
    830
    du machst alle pull ups an => PORTB geht auf 255, daraus folgt das teil springt in die erste schleife und bleibt dort, bis du den taster drückst. jetzt wartet die schleife so lange (while) bis das PORTB auf null geht, das kann er aber nicht, da 254 das höchste der gefühle ist.
    beim zweiten hast du den gleichen fehler, da kann taster auch nie null werden.
    Neun von zehn Stimmen in meinen Kopf sagen ich bin nicht verrückt. Die andere summt die Melodie von Tetris...

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    26
    Beiträge
    460
    Danke für die schnelle Antwort!
    Ich habe das jetzt umgschrieben:

    Code:
    #include <avr/io.h>
    #include <stdint.h>
    
    #define F_CPU 3686400UL
    #include <util/delay.h>
    
    
    int main (void)
    
    {	DDRB=0x00;				// Port B  als Eingang
    	PORTB=0xff;				// Pull-ups auf Port B ein
    	DDRC=0xff;				// Port C als Ausgang
    	PORTC=0x00;				// Alle Pins auf Port C auf low
    
    	while (1) 
    	{	while (bit_is_set(PINB, 3))		
    		{	PORTC&=~(1<<PC5);		
    		}
    			
    		while (bit_is_set(PINB, 3))	
    		{	PORTC|=(1<<PC5);		
    		}
    	
    	}
    	return 0;
    }

    Die Led hängt jetzt an C5 und der Taster an B2
    Jetzt leuchtet die Led immer, außer wenn ich auf den Taster drücke, auch wenn ich bit_is_set und bit_is_clear vertausche.

    Woran liegt das?

    Grüße,
    Christoph

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    lass doch while hier weg, besser ist eine if Abfrage z.B.
    Code:
    if (PORTB & (1<<PB2))
       PORTC &=~(1<<PC5);
    else
       PORTC |=(1<<PC5);
    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    26
    Beiträge
    460
    ok, ich habe das jetzt auf folgendes umgeändert:

    Code:
    #include <avr/io.h>
    #include <stdint.h>
    
    #define F_CPU 3686400UL
    #include <util/delay.h>
    
    
    int main (void)
    
    {	DDRB=0x00;				// Port B  als Eingang
    	PORTB=0xff;				// Pull-ups auf Port B ein
    	DDRC=0xff;				// Port C als Ausgang
    	PORTC=0x00;				// Alle Pins auf Port C auf low
    
    	while (1) 
    	{	if(PINB & (1<<1))
    		{	PORTC|=(1<<PC5);
    			
    		}
    		else 
    		{	
    			PORTC&=~(1<<5);
    		}	
    		
    	}
    	return 0;
    }
    es funktioniert immer noch nicht, ich bin wohl einfach zu dumm...
    Die led auf c5 leuchtet jetzt immer, egal ob ich den taster drücke oder nicht.
    Hat das wieder etwas mit den pullups zu tun?

    Grüße,
    Christoph

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    26
    Beiträge
    460
    OK, ich bin schon weiter, ich habe in der IF abfrage PORTB statt PINB verwendet.

    Die led leuchtet aber trotzdem immer, außer wenn ich auf den Taster drücke. Ich will aber, dass sie nur leuchtet, wenn man den taster drückt. Wenn ich die beiden if abfragen vertausche, den inhalt aber gleich lasse, sollte es doch umgekehrt sein? is es aber nicht. Was mache ich falsch???

    EDIT: Jetzt habe ich es geschafft. ich weiß zwar nicht was falsch war, aber auf einmal gehts....

    Grüße
    Christoph

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    2 Möglichkeiten ?:
    Code:
     while (1) 
       {   if (!(PINB & (1<<1))) 
          {   PORTC|=(1<<PC5); 
              
          } 
          else 
          {    
             PORTC&=~(1<<5); 
          }    
           
       }
    oder
    Code:
     while (1) 
       {   if(PINB & (1<<1)) 
          {   
             PORTC&=~(1<<5);  
          } 
          else 
          {  
               PORTC|=(1<<PC5);  
                }    
           
       }
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    26
    Beiträge
    460
    Danke, ich habs jetzt geschafft!
    Welche funktion kann ich verwenden, wenn ich ein paar sekkunden warten will? Das geht ja mit _delay_ms() nicht.

    Grüße,
    Christoph

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    www.roboternetz.de/wissen/index.php/C-Tutorial
    http://www.mikrocontroller.net/artic...R-GCC-Tutorial
    Schau dir mal diese Tutorials an, die Kapitel mit den Timer, diese sind für Wartezeiten besser geeignet. Wenn deine Programme einmal etwas komplexer werden wirst du mit delay nicht glücklich, in dieser Zeit macht dein Kontroller nämlich nichts ausser warten, du kannst keine Eingänge pollen, nichts ausgeben usw.
    Hubert

Berechtigungen

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