-         

Ergebnis 1 bis 4 von 4

Thema: ATMEGA32 avr-g++ kann keine Ausgänge setzen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.03.2007
    Beiträge
    51

    ATMEGA32 avr-g++ kann keine Ausgänge setzen

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hi Leute

    Ich hab ein Problem:
    Wenn i versuche zwei Ausgänge nacheinander zu setzen, wird immer nur der erste gesetzt. Beim zweiten Versuch kann ich dann keine Ausgänge mehr auf high (oder low bei active-low) setzen.

    Hier mein Code:
    Code:
    #include <avr/io.h>
    #include <stdio.h>
    #include <util/delay.h>
    
    int main()
    {
    	DDRC |= 0xFF;
    	PINC |= (1<<0); //Wird gesetzt
    	waitms(1000);
    	PINC |= (1<<1); //Wird nicht mehr gesetzt
    	waitms(1000);
    	PINC |= (1<<0); //wird auch nicht gesetzt
    	waitms(1000);
    	PINC |= (1<<1); //und das auch nicht
    
    }
    Ich hoffe ihr könnt mir Helfen!
    Brauch das für ein Miniprojekt in der Schule

    MFG

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551

    Re: ATMEGA32 avr-g++ kann keine Ausgänge setzen

    Zitat Zitat von TDK
    ... Wenn i versuche zwei Ausgänge nacheinander zu setzen, wird immer nur der erste gesetzt ...
    PINC ist für die Statusabfrage des Portpins. Wenn Du einen bestimmten Pin setzen willst, musst Du PORTC schreiben. Übrigens werden bei Dir die LEDs nacheinander, eine nach der anderen gesetzt - das ist Dir schon klar ! ? Zum Schluss sind alle an.

    Die Befehle können so lauten:
    Code:
    //  PORTC |=  (1<<PC4);           // Port PC4 PC4 einschalten
    //  PORTC &= ~(1<<PC4);           // Port PC4 ausschalten
    //  PORTC ^=  (1<<PC4);           // Port PC4 toggeln
    Ciao sagt der JoeamBerg

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    31.03.2007
    Beiträge
    51
    Ach, ich habe vergessen das mit PINC zu ändern
    Hab vorher PORTC drin gehabt, hat aber auch nicht funktioniert.
    In einem Tut im net hab ich folgende Befehle gefunden:
    Code:
    PORTC |= (0<<0) //Pin0 von PORTC auf high setzen (active-low)
    PORTC |= (1<<0) ////Pin0 von PORTC auf low setzen
    den Befehl
    Code:
    PORTC &= ~(1<<PC4);
    hab ich noch nie gesehen; wer ich ausprobieren, danke für deine Hilfe

    MFG
    TDK

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    öhm naja du solltest dir vielleicht die bitoperationen nocheinmal genau ansehen
    Code:
    PORTC |= (1<<0);
    // ausführlich
    PORTC = PORTC | (00000001 << 0);
    PORTC = xxxxxxxx | 00000001; //sinngemäß
    PORTC = xxxxxxx1;
    // wenn du jetzt aber 
    PORTC |= (0<<0); //schreibst, passiert NICHTS denn
    
    PORTC = PORTC | (00000000 << 0);
    PORTC = xxxxxxxx | 00000000; 
    // 0 ODER 1 ergibt 1 und 1 ODER 1 ergibt 1 ... ausschliesslich 0 ODER 0 ergibt auch 0
    
    // was du brauchst ist das logische UND
    // 1 UND 1 ergibt 1 ... 1 UND 0 ergibt 0 und 0 UND 0 ergibt 0
    
    //nun musst du nur darauf achten, dass ALLE anderen bits 1 sind bis auf das/die bit(s) welche(s) du löschen möchtest 
    
    PORTC = xxxxxxxx & 01111111; //sinngemäß
    PORTC = xxxxxxxx & ~(10000000); //mit negierung
    // das ~ zeichen kehrt alle bits einmal um
    
    //in kurzform wäre dass dann 
    PORTC &= ~(1<<1);
    
    // die schreibweise mit PCn (PC4 im code oben)  ist ein makro der atmel lib, PC4 heisst nichts anderes als PIN 4 an PORT C, aufgelöst steht in dem makro also nur eine 4
    
    (1<<PC4) == (1<<4)

Berechtigungen

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