-         

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 34

Thema: Tiny 2313, tipps und kontrolle gesucht

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84

    Tiny 2313, tipps und kontrolle gesucht

    Anzeige

    hi

    ich bin ziemlich neu in der microcontroller programmierung...
    habe vorher aber schon mit c++ gearbeitet

    so, ich versuche einen atmel tiny 2313 zu programmieren und habe auch einen code geschrieben, der sich fehlerfrei compilieren lässt

    allerdings denke ich, dass der nicht so läuft wie er soll und wollte das ein erfahrener User nochmal drüberschaut, ob die befehle stimmen und er macht was er soll, damit ich den nicht umsonst einlöte(habe es immer daneben geschrieben)

    Ausserdem hoffe ich vielleicht ein paar verbesserungsvörschläge und tipps zu bekommen

    Danke

    Code:
    #include <avr/io.h>          
     
    int main () {            
     
       DDRB  = 0x00;   // B Eingänge          
       PINB = 0x00;     //jeden Eingang benutzen        
       
       DDRD  = 0xFF;   // D Ausgänge          
       PORTD = 0x11;	//Standard: D0,D4 gesetzt
       
       DDRD  = 0xFF;   // A Ausgänge          
       PORTD = 0x00;
     
       while(1) 
       {                
    	
    		if ((!PINB1 & (1<<PINB1)) || ( !PINB2 & (1<<PINB2)) ) // Wenn B1 oder B2 == 0 dann
    		{
    			PORTD = 0x00;         // Alle B Ports auf 0
    		}
     
    		if ( PINB4 & (1<<PINB4) ) // Wenn B1 == 1 dann
    		{
    			PORTD = 0x17;			//D0,D1,D2,D4 gesetzt
    		}
    
    		if ( PINB3 & (1<<PINB3) ) // Wenn B1 == 1 dann
    		{
    			PORTD = 0x19;			//D0,D1,D4 gesetzt
    		}
    		
    		if ((!PINB0 & (1<<PINB0)) ) // Wenn B0 == 0 dann
    		{
    			PORTD = 0x11;				//Standard: D0,D4 gesetzt
    		}
       
    		if((bit_is_set (PORTD,4)))		//2LEDs abwechselnd blinken
    										//Wenn PortD4 gesetzt
    		{
    			PORTA &= ~(1 << 4);		//PortD4 auf 0 setzen
    			PORTD |= (1 << 5);			//PortD5 auf 1 setzen
    		}
    		else
    		{
    			PORTA &= ~(1 << 5);		//PortD5 auf 0 setzen
    			PORTD |= (1 << 4);			//PortD4 auf 1 setzen
    		}
    
       }                
       return 0;               
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378

    Re: Tiny 2313, tipps und kontrolle gesucht

    Code:
    #include <avr/io.h>          
     
    int main () {            
     
       DDRB  = 0x00;   // B Eingänge          
       PINB = 0x00;     //jeden Eingang benutzen    PIN ist ein ausgaberegister!!! nie was reinschreiben!    
       
       DDRD  = 0xFF;   // D Ausgänge    sieht ok aus      
       PORTD = 0x11;	//Standard: D0,D4 gesetzt das auch
       
       DDRD  = 0xFF;   // A Ausgänge   erm das register für port A ist DDRA       
       PORTD = 0x00; // dasselbe in grün nicht PORTD sondern PORTA
     
       while(1) 
       {                
    	
    		if ((!PINB1 & (1<<PINB1)) || ( !PINB2 & (1<<PINB2)) ) // Wenn B1 oder B2 == 0 dann ... 
    // iwie falsch (!(PINB & (1<<PB1)) || !(PINB & (1<<PB2)))
    		{
    			PORTD = 0x00;         // Alle B Ports auf 0 PORTB statt PORTD
    		}
     
    		if ( PINB4 & (1<<PINB4) ) // Wenn B1 == 1 dann ... siehe oben
    		{
    			PORTD = 0x17;			//D0,D1,D2,D4 gesetzt 
    		}
    
    		if ( PINB3 & (1<<PINB3) ) // Wenn B1 == 1 dann
    		{
    			PORTD = 0x19;			//D0,D1,D4 gesetzt
    		}
    		
    		if ((!PINB0 & (1<<PINB0)) ) // Wenn B0 == 0 dann
    		{
    			PORTD = 0x11;				//Standard: D0,D4 gesetzt
    		}
       
    		if((bit_is_set (PORTD,4)))		//2LEDs abwechselnd blinken
    										//Wenn PortD4 gesetzt
    		{
    			PORTA &= ~(1 << 4);		//PortD4 auf 0 setzen PD4 statt nur 4
    			PORTD |= (1 << 5);			//PortD5 auf 1 setzen
    		}
    		else
    		{
    			PORTA &= ~(1 << 5);		//PortD5 auf 0 setzen PD5 statt nur 5
    			PORTD |= (1 << 4);			//PortD4 auf 1 setzen
    		}
    
       }                
       return 0;               
    }

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    erstmal großes danke für die gute hilfe
    =D>

    allerdings habe ich nicht alles verstanden

    ich habe es mal versucht zu berichtigen...

    Code:
    #include <avr/io.h>         
     
    int main () {           
     
       DDRB  = 0x00;   // B Eingänge          
       
       DDRD  = 0xFF;   // D Ausgänge 
       PORTD = 0x11;   //Standard: D0,D4 gesetzt
       
       DDRA  = 0xFF;   // A Ausgänge      
       PORTA = 0x00; 
     
       while(1)
       {               
       
          if (!(PINB & (1<<PB1)) || !(PINB & (1<<PB2))) // Wenn B1 oder B2 == 0 dann ...
          {
             PORTD = 0x00;         // Alle D Ports auf 0
          }
     
          if ( PINB & (1<<PINB4) ) // Wenn B4 == 1 dann
          {
             PORTD = 0x17;         //D0,D1,D2,D4 gesetzt
          }
    
          if ( PINB & (1<<PINB3) ) // Wenn B3 == 1 dann
          {
             PORTD = 0x19;         //D0,D1,D4 gesetzt
          }
          
          if (!(PINB & (1<<PINB0)) ) // Wenn B0 == 0 dann
          {
             PORTD = 0x11;            //Standard: D0,D4 gesetzt
          }
       
          if((bit_is_set (PORTD,4)))      //2LEDs abwechselnd blinken
                                  //Wenn PortD4 gesetzt
          {
             PORTD &= ~(1 << PD4);      //PortD4 auf 0 setzen PD4 statt nur 4
             PORTD |= (1 << PD5);         //PortD5 auf 1 setzen
          }
          else
          {
             PORTD &= ~(1 << PD5);      //PortD5 auf 0 setzen PD5 statt nur 5
             PORTD |= (1 << PD4);         //PortD4 auf 1 setzen
          }
    
       }               
       return 0;               
    }

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    Code:
     
          if ( PINB & (1<<PINB4) ) // Wenn B4 == 1 dann ... PINB4 durch PB4 ersetzen
          {
             PORTD = 0x17;         //D0,D1,D2,D4 gesetzt
          }
    
          if ( PINB & (1<<PINB3) ) // Wenn B3 == 1 dann ... siehe oben
          {
             PORTD = 0x19;         //D0,D1,D4 gesetzt
          }
          
          if (!(PINB & (1<<PINB0)) ) // Wenn B0 == 0 dann ...
          {
             PORTD = 0x11;            //Standard: D0,D4 gesetzt
          }
    ansonsten siehts gut aus ... was verstehste denn nicht ?

    die pins an sich sind mit P(Port)(Nummer) kodiert ... 1<<Pxn verschiebt eine einzelne 1 an die gewünscht position N im register X .... du musst den errrechneten wert natürlich dem PORTx zuweisen damit es wirkt bei PINx ist es genau andersherum due erzeugst die maske mit 1<<Pxn und als ergebnis bekommst du 0 wenn das bit 0 ist oder irgendwas > 0 wenn das bit gesetzt ist.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    aha, genau das war die stelle an der ich mir nicht sicher war, dann habe ich das auch verstanden
    so, werde meinen ic mal durchmessen und schauen, ob es funktioniert

    danke nochmal für deine hilfe

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    ich bin auch nur ein "erfahrener" anfänger ... aus fehlern wird man klug und gewinnt "erfahrung" ^^

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    so ich habe mein programm nochmal ein bisschen verändert
    allerdings läuft es nicht richtig

    ich möchte, dass ich erst den taster an PBO drücken muss damit die ports von 0 auf 1 gesetzt werden (start taster)

    die LED an PD4 läuft allerdings sofort und fast kontinuierlich

    Code:
    #include <avr/io.h>
    #include <util/delay.h> 
    #include <stdint.h>       
     
    int main () {   
    
       uint8_t start=1;
     
       DDRB  = 0x00;   // B Eingänge          
       
       DDRD  = 0xFF;   // D Ausgänge 
       PORTD = 0x00;   //Standard: D0,D4 gesetzt 0x11
       
       DDRA  = 0xFF;   // A Ausgänge      
       PORTA = 0x00; 
     
       while(1)
       {               
       
          if (!(PINB & (1<<PB1)) /*|| !(PINB & (1<<PB2))*/) // Wenn B1 oder B2 == 0 dann ...
          {
             PORTD = 0x00;         		// Alle D Ports auf 0
    		 start=1;
          }
     
          if ( PINB & (1<<PB4) ) 	// Wenn B4 == 1 dann
          {
             PORTD = 0x17;         		//D0,D1,D2,D4 gesetzt
          }
    
          if ( PINB & (1<<PB3) ) 	// Wenn B3 == 1 dann
          {
             PORTD = 0x19;         		//D0,D1,D4 gesetzt
          }
          
          if (!(PINB & (1<<PB0)) ) 	// Wenn B0 == 0 dann
          {
             PORTD = 0x11;            	//Standard: D0,D4 gesetzt
    		 start=0;
          }
       
          if(start==0)
    	  {
    	  
    	  if((bit_is_set (PORTD,4)))   //2LEDs abwechselnd blinken		//Wenn PortD4 gesetzt
    		  {
    			 PORTD &= ~(1 << PD4);     //PortD4 auf 0 setzen PD4 statt nur 4
    			 PORTD |= (1 << PD5);		//PortD5 auf 1 setzen
    			_delay_ms(40);  
    		  
    		  }
    		  else
    		  {
    			 PORTD &= ~(1 << PD5);     //PortD5 auf 0 setzen PD5 statt nur 5
    			 PORTD |= (1 << PD4);
    			_delay_ms(40); 
    			   
    		  }
    		
    	  }		
       }               
       return 0;               
    }
    2 Frage: ich habe eine eingangsspannung von 4,5 V

    müsste ich nciht an allen Ausgängen des ICs 4,5V haben? ich habe allerdings verschiedene ausgangsspannungen von 1 bis 4V...

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von steveLB
    Registriert seit
    24.10.2005
    Beiträge
    481
    in
    if (!(PINB & (1<<PB0)) ) // Wenn B0 == 0 dann
    {
    PORTD = 0x11; //Standard: D0,D4 gesetzt
    start=0;
    }
    fragst doch ob b0 gleich null ist , muesstest du da nciht fragen ob er gleich 1 ist ? denn nur wenn du b0 drueckst sollen sich die ports aendern, also eher
    if (PINB & (1<<PB0) ) // Wenn B0 == 1 dann
    {
    PORTD = 0x11; //Standard: D0,D4 gesetzt
    start=0;

    oder irr ich mich ?
    gruss
    [X] <-- Nail here for new Monitor

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    23
    Beiträge
    656
    Hallo Ineedhelp,

    wenn du erst angefangen hast Microcontroller zu programmieren empfehle ich dir nicht mit so vielen Bitschiebeoperationen zu arbeiten. Da kann man sich nämlich leicht mal vertippen. Stattdessen kann man diese Operationen auch durch Makros ersetzen.
    Ich habe mir mal selber, weil ich nicht gerne mit diesen umständlichen Operationen arbeite, eine Haeder-Datei mit allen Makros, die die Bitoperationen ersetzen geschrieben.

    Ich habe noch zusätzlich true, false und bool definiert, weil mein AVR-GCC Compiler diese Schlüsselwörter nicht kennt.

    mfg _R2D2
    Angehängte Dateien Angehängte Dateien
    • Dateityp: h def.h (771 Bytes, 2x aufgerufen)

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    14.03.2008
    Ort
    Oldenburg
    Beiträge
    84
    @_R2D2

    Danke für den Tipp und die header, dass kann ich auch wohl machen...


    @steveLB

    ich bin mir nicht sicher, ich habe einen öffner (taster) auf B0, B1 und B2

    das heißt ich habe an den Pins die ganze Zeit Spannung anliegen und erst wenn ich taste, liegt keine Spannung (0) mehr und er soll schalten und das ausführen

    ich hatte nur noch 2 schließer und 3 öffner liegen, daher musste ich beides verwenden

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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