-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: [SOLVED] Erste schritte mit AVR GCC

  1. #1
    Tux12Fun
    Gast

    [SOLVED] Erste schritte mit AVR GCC

    Anzeige

    Hallo,

    ich versuche mich gerade mit AVR GCC jedoch funktioniert das nicht so
    einfach wie ich mir das vorgestellt habe. Im Moment habe ich folgenden
    Quellcode zusammenkopiert *zugeb*. Richtiges C und C++ kann ich Programmieren, jedoch macht mir die Portlogik doch noch erhebliche
    Schwierigkeiten.

    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    
    int main(void){
       DDRB = 0xff;
       PORTB = 0x04;
       while (1){
    	PORTB |= (1<<PB4) | (1<<PB5);  //4 und 5 high auf B
    	_delay_ms(5000);
    	PORTB &= ( (1<<PB4) | (1<<PB5)); //4 und 5 auf low B
    	_delay_ms(5000);
       }
       return 0;
    }
    Ich wollte eigentlich nur Port B4 und B5 blinken lassen.
    Jedoch habe ich mit dem Digimulti immer 5V auf dem Pin.

    Das Programmierboard arbeitet einwandfrei, da ich es früher für schon
    mit Basic Programmiert habe.

    PS gibts sowas wie PORTB1 = 1 / 0 auch ? Die "Levelshifts" finde ich nähmlich (zumindestens jetzt) noch sehr kompliziert.

    Danke schon im Voraus für eure Hilfe.

    Vielleicht kann mir ja jemand ein paar mini Beispiele zukommen lassn. So nach dem Motto mal Pin ein und ausschalten und abfragen würde schon für den Anfang mal reichen.

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    183
    Hi

    ich glaub ~ vergessen.

    probier mal PORTB &= ~( (1<<PB4) | (1<<PB5)); //4 und 5 auf low B

    lg

  3. #3
    Tux12Fun
    Gast
    Kann es sein, dass an der High zeile auch was nicht stimmt, denn nun ist der Pin immer auf 0V

  4. #4
    Tux12Fun
    Gast
    Kommando zurück danke es funktionier nur scheint es 50 sek zu dauern und nicht wie ich dachte 5 sek.
    Kann es sein, dass ich noch etwas für meine Quarz angben muss ?
    Oder wie bringe ich dem AT Mega32 bei das dieser zu nutzen ist ?

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    183
    das müsste gehen.

    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    
    int main(void){
       DDRB = 0xff;
       PORTB = 0x04;
       while (1)
      {
               PORTB |= (1<<PB4) | (1<<PB5);  //4 und 5 high auf B
              _delay_ms(5000);
    
              PORTB &= ~( (1<<PB4) | (1<<PB5)); //4 und 5 auf low B
              _delay_ms(5000);
       }
       return 0;
    }

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    183
    Datenblatt Fusebits oder im Wiki

  7. #7
    Du musst die Fuse-Bit so setzen, dass er das Quarz anspricht. Definier noch F_CPU.
    Hier mal nen Programm von mir, dass ungefähr das selbe macht.
    Code:
    /* Testschaltung
    Version: 0.1
    Datum: 07.01.2009
    Autor: Finn 'Kani' Schürmann
    Target: AtMega 8515
    Lizenz: Keine
    */
    
    #include <avr/io.h>
    #include <util/delay.h>
    #define F_CPU 16000000UL //16MHZ
    
    int main(void)
    {
    	
    	
    	DDRA = 0xFF; //PORTA auf Ausgang stellen
    	PORTA = 0xFF; //Sicher gehen das zum Start alle Bits "aus" sind.
    	DDRB = 0x00;  //PORTB als Eingang zur Vorbeugung von Kurzschlüssen
     	DDRC = 0x00;  //PORTC als Eingang zur Vorbeugung von Kurzschlüssen
     	DDRD = 0x00;  //PORTD als Eingang zur Vorbeugung von Kurzschlüssen
    
    		while( 1 )
    		{
    			PORTA |= (1 << PA1); // Bit PA1 wird gesetzt
    			PORTA &= ~(1 << PA0); // Bit PA0 wird gelöscht 
    
    				_delay_ms(1000);
    
    			PORTA |= (1 << PA0); // Bit PA0 wird gesetzt 
    			PORTA &= ~(1 << PA1); // Bit PA1 wird gelöscht
    
    				_delay_ms(1000);
    		}	
    }
    Hab mal irgendwo gelesen, dass man die delay funktion nur bis 1000 benutzen sollte.

  8. #8
    Tux12Fun
    Gast
    mit delay_ms(5000) scheint das ganze bei 50 sek zu liegen dachte immer 1000ms = 1 sek

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Hi,

    Zitat Zitat von Tux12Fun
    ... Kann es sein, dass ich noch etwas für meine Quarz angben muss ? ...
    Üblicherweise wird Controller und Quarztakt im Code etwa so beschrieben:
    Code:
    #include <avr/interrupt.h>
    . . . . . .
    #define MCU = AVR_ATmega168
    #define F_CPU  20000000         // Quarz 20 Mhz-CPU
    Und der Quarz muss "aktiviert" werden. Ein fabrikfrischer Controller (wenn Du den hast) läuft auf internem Quarz - und dann gibts da noch den Takt-Dividierer (CKDIV - aber zum Glück gibts Fuse-Calkulators *ggggg*.
    Ciao sagt der JoeamBerg

  10. #10
    Tux12Fun
    Gast
    Also die F_CPU
    und MCP habe ich gesetzt wie oben beschrieben nur auf
    AVR_ATmega32
    und F_CPU auf 16000000
    geändert.

    Könnte mir jemand evtl noch bei den Fuse Bits helfen.
    So ganz blicke ich durch den Calc nicht durch.

    an meinem AT-Mega hängt ein 16 MHZ Quarz mit 2x 22pf

    Schaltplan sieht so aus
    AT------Quarz-----22pf----|Masse
    AT------Quarz-----22pf----|Masse

    Im Ponnyprog ist
    Bootsz1
    Bootsz0
    SUT0
    CKSEL3
    CKSEL2
    CKSEL1
    aktiv

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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