Fehler: Operand types are not compatible in CodeVisionAVR

Tutorials.at
Verfügbare Informationen zu "Fehler: Operand types are not compatible in CodeVisionAVR"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: Moritz - DrPhil_Guth - Metamorph - Xin - dani93 - wirthi - Dirty Oerty
  • Forum: Tutorials.at
  • Forenbeschreibung: Programmierforum
  • aus dem Unterforum: C / C++
  • Antworten: 27
  • Forum gestartet am: Mittwoch 19.04.2006
  • Sprache: deutsch
  • Link zum Originaltopic: Fehler: Operand types are not compatible in CodeVisionAVR
  • Letzte Antwort: vor 15 Jahren, 11 Monaten, 4 Tagen, 13 Stunden, 18 Minuten
  • Alle Beiträge und Antworten zu "Fehler: Operand types are not compatible in CodeVisionAVR"

    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Moritz - 26.05.2008, 17:47

    Fehler: Operand types are not compatible in CodeVisionAVR
    Ich benutze Codevisionavr und
    bei folgendem Programmstück kommt es zu einem Fehler:

    Code:
    (active=&a) ? set(1) :(active=&b) ? set(2): (active=&c) ? set(3):PORTC.1=1;

    dabei ist set als korrekte Funktion initialisiert, active ein pointer und a, b und c Variablen. Der Zugriff PORTC.1=1 ist ebenfalls korrekt;

    Fehlermeldung:

    Versuch1.c(289): operand types are not compatible 'const void' and 'sfr of unknown size'

    Worin liegt hier der Fehler??

    Wahrscheinlich ein ganz simpler, aber ich bin C-Anfänger...



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    DrPhil_Guth - 26.05.2008, 20:02

    Re: Fehler: Operand types are not compatible in CodeVisionA
    Moritz hat folgendes geschrieben: Ich benutze Codevisionavr und
    bei folgendem Programmstück kommt es zu einem Fehler:

    Code:
    (active=&a) ? set(1) :(active=&b) ? set(2): (active=&c) ? set(3):PORTC.1=1;

    dabei ist set als korrekte Funktion initialisiert, active ein pointer und a, b und c Variablen. Der Zugriff PORTC.1=1 ist ebenfalls korrekt;

    Fehlermeldung:

    Versuch1.c(289): operand types are not compatible 'const void' and 'sfr of unknown size'

    Worin liegt hier der Fehler??

    Wahrscheinlich ein ganz simpler, aber ich bin C-Anfänger...
    Also als C Anfänger solltest du solchen code nicht schreiben. Weißt du eigentlich was ( z ? x: y) bedeutet? Vielleicht solltest du das ganze ausschreiben (mit if else if, else blöcken), und nochmal kompilieren, vl. findest du den fehler selbst, aber zumindest können wir dir besser helfen, denn mit dem was du geschrieben hast kann man wenig anfangen.

    Es wäre gut, wenn du noch code druherum posten würdest, und vor allem die variablendeklarationen.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Moritz - 26.05.2008, 20:21


    Hier ist der Gesamte Quellcode. Der Code ist für einen Atmega32-Microcontroller bestimmt. Für die Teile Vor dem erstem
    "///////////////////////////////////////////////////////////////////////////////////////////////////"
    bzw. nach dem Zweitem ist meine eigene Kreativität verantwortlich, der Rest ist (für den Fehler hier) unbedeutend.



    Code:
    #include <mega32.h>




    //Global variables

    int stop;
    int menz;
    int a;
    int b;
    int c;
    int d;
    int *active=&a;


    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    // Place your code here
    if (active==&a)
    active=&b;
    if (active==&b)
    active=&c;
    if (active==&c)
    active=&d;
    if (active==&d)
    active=&a;


    }

    // External Interrupt 1 service routine
    interrupt [EXT_INT1] void ext_int1_isr(void)
    {
    // Place your code here

    {
    *active = *active + 1;
    if (*active==10) active=0;
    }
    }

    #include <delay.h>

    #define ADC_VREF_TYPE 0x40



    int i;

    const int all = 0;
    const int B   = 2;

    void reset (int a)
    {
    if (a=all)
    {
    PORTA = 00000000;
    PORTB = 00000000;
    PORTC = 00000000;
    }
    if (a=B) PORTB=00000000;
    }


    void set (int i)    //Funktion zur Zahlen-Ausgabe;
    {
          reset (B);
          if (i==1) PORTB.4=1;
          if (i==1) PORTB.2=1;
          ////////////////////////////
          if (i==2) PORTB.5=1;
          if (i==2) PORTB.4=1;
          if (i==2) PORTB.7=1;
          if (i==2) PORTB.0=1;
          if (i==2) PORTB.1=1;
          ////////////////////////////
          if (i==3) PORTB.5=1;
          if (i==3) PORTB.4=1;
          if (i==3) PORTB.7=1;
          if (i==3) PORTB.2=1;
          if (i==3) PORTB.1=1;
          ////////////////////////////
          if (i==4) PORTB.4=1;
          if (i==4) PORTB.6=1;
          if (i==4) PORTB.7=1;
          if (i==4) PORTB.2=1;
          ////////////////////////////
          if (i==5) PORTB.5=1;
          if (i==5) PORTB.6=1;
          if (i==5) PORTB.7=1;
          if (i==5) PORTB.2=1;
          if (i==5) PORTB.1=1;
          ////////////////////////////
          if (i==6) PORTB.1=1;
          if (i==6) PORTB.2=1;
          if (i==6) PORTB.5=1;
          if (i==6) PORTB.6=1;
          if (i==6) PORTB.7=1;
          if (i==6) PORTB.0=1;
          ////////////////////////////
          if (i==7) PORTB.4=1;
          if (i==7) PORTB.2=1;
          if (i==7) PORTB.5=1;
          ////////////////////////////
          if (i==8) PORTB.0=1;
          if (i==8) PORTB.1=1;
          if (i==8) PORTB.2=1;
          if (i==8) PORTB.4=1;
          if (i==8) PORTB.5=1;
          if (i==8) PORTB.6=1;
          if (i==8) PORTB.7=1;
          ////////////////////////////
          if (i==9) PORTB.1=1;
          if (i==9) PORTB.2=1;
          if (i==9) PORTB.4=1;
          if (i==9) PORTB.5=1;
          if (i==9) PORTB.6=1;
          if (i==9) PORTB.7=1;
    }



    void clock (int c)   
    {
    PORTB=00000000;
    c++;
    if (c==9) c=0;
    set (c);
    delay_ms (1000);
    }


    // Read the AD conversion result
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
    }

    // Declare your global variables here



    void main(void)
    {
    // Declare your local variables here
    int hlp  =0;
    int inmen;
    int i    = 0;
    inmen= 1;
    menz = 0;
    a    = 0;
    b    = 0;
    c    = 0;
    d    = 0;



    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=T State0=T
    PORTA=0x00;
    DDRA=0xFC;

    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
    PORTB=0x00;
    DDRB=0xFF;

    // Port C initialization
    // Func7=Out Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
    // State7=0 State6=0 State5=T State4=T State3=T State2=T State1=0 State0=0
    PORTC=0x00;
    DDRC=0xC3;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Low level
    // INT1: On
    // INT1 Mode: Low level
    // INT2: Off
    GICR|=0xC0;
    MCUCR=0x00;
    MCUCSR=0x00;
    GIFR=0xC0;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // ADC initialization
    // ADC Clock frequency: 125,000 kHz
    // ADC Voltage Reference: AVCC pin
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x83;

    // Global enable interrupts
    #asm("sei")


    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    PORTC.1 = 1;
    while (inmen==1)
    {
    reset (B);
    PORTC.0=0;
    PORTC.1=1;
    (active=&a) ? set(1) :(active=&b) ? set(2): (active=&c) ? set(3):PORTC.1=1;
    delay_us (1000);
    PORTC.1=0;
    PORTC.0=1;
    set (*active);
    if (d!=0) inmen=1;
    }


    while (1)
    {

    }
    }




    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Metamorph - 26.05.2008, 21:43


    Code: if (i==4) PORTB.4=1;
          if (i==4) PORTB.6=1;
          if (i==4) PORTB.7=1;
          if (i==4) PORTB.2=1;

    Ist ja heftig.xD

    Mach daraus einen Block.
    Code:
    if(i==4){
        PORTB.6=1;
        PORTB.7=1;
        /*...*/
    }

    Globale Variablen sind fast so unbeliebt wie goto.
    Ich habe mir nicht den gesamten Quelltext angesehen. Du solltest dich, wie schon erwähnt, mit einfacheren Sachen auseinandersetzen. Dir fehlen noch einige elementare Sache. Schreibe erst einmal ein paar triviale Rechenprogramme.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Moritz - 27.05.2008, 13:34


    Naja, ich weiss ja, wie das mit den Blöcken funktioniert. Aber an der Stelle war es bequemer, einfach 20 mal Strg+V zu drücken und nur die Zahlen anzupassen. Für vorschläge, wie ich dass mit den Globalen variablen anders machen soll, bin ich offen. Aber ich sehe keine andere Möglichkeit. Die Variablen als Argumente Übergeben kann ich nicht, da ich den Interrupt ja nicht aufrufe, sonder der Prozessor selbst.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Xin - 27.05.2008, 14:39

    Re: Fehler: Operand types are not compatible in CodeVisionA
    Moritz hat folgendes geschrieben: Ich benutze Codevisionavr und
    bei folgendem Programmstück kommt es zu einem Fehler:
    Welchem Fehler?

    Moritz hat folgendes geschrieben: Code:
    (active=&a) ? set(1) :(active=&b) ? set(2): (active=&c) ? set(3):PORTC.1=1;

    Darf ich fragen, ob Du weißt, was Du da tust?
    Code: ( active = &a )
    Das ist eine Zuweisung innerhalb einer Bedingung - da spricht erstmal nichts gegen, aber hier weist Du eine Addresse eine Variablen zu, also etwas, was definitiv existiert, also wahr ist.

    Bitte formatiere solche Ausdrücke (und überhaupt Deinen ganzen Code) vernünftig.

    Und bitte beachte: Der ?:-Operator ist nicht grundsätzlich als Ersatz für if() gedacht.

    Moritz hat folgendes geschrieben: dabei ist set als korrekte Funktion initialisiert, active ein pointer und a, b und c Variablen. Der Zugriff PORTC.1=1 ist ebenfalls korrekt;
    Von welchem Typ ist PARTC? Was bedeutet PORTC.1?

    Moritz hat folgendes geschrieben: Fehlermeldung:

    Versuch1.c(289): operand types are not compatible 'const void' and 'sfr of unknown size'
    set liefert ein void Ergebnis?

    Wie gesagt ?: ist kein Ersatz für if. ?: liefert ein Ergebnis. void ist kein Ergebnis.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    dani93 - 27.05.2008, 15:34


    Wo du das mit dem void ansprichst...
    Ich habe es auch so in der Schule gelernt. Wir verwenden return nur, um eine Variable an das Hauptprogramm zurückzuliefern, damit man keinen Pointer machen muss.
    Was ist denn eigentlich der Nachteil von void?
    Eigentlich (wenn wir ganz sparsam denken) ist es ja ein Befehl weniger.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Xin - 27.05.2008, 16:17


    dani93 hat folgendes geschrieben: Wo du das mit dem void ansprichst...
    Ich habe es auch so in der Schule gelernt. Wir verwenden return nur, um eine Variable an das Hauptprogramm zurückzuliefern, damit man keinen Pointer machen muss.
    Wenn du aus einer Prozedur zurückkehrst, benutzt Du return; und gibst dabei nichts (void) zurück.

    dani93 hat folgendes geschrieben: Was ist denn eigentlich der Nachteil von void?
    Eigentlich (wenn wir ganz sparsam denken) ist es ja ein Befehl weniger.
    Es gibt keinen Nachteil von void, es ist die Aussage, dass eine Funktion nichts (void) zurückgibt, oder nichts als Parameter empfängt.

    Semantisch hat void einen Nachteil, weil man mit void nicht rechnen kann. Void ist eine Ausnahmeerscheinung in der Programmierung: ein Datentyp, der keine Daten enthält.

    Darum schlägt anscheinend auch der ?:-Operator fehl. ?: will etwas zurückgeben, aber void ist nichts... und da ist ein Widerspruch.
    Semantisch besteht also ein sprachlicher Unterschied zwischen void und allen anderen Datentypen. Das ist im Pascal zum Beispiel deutlicher hervorgehoben, wo Unterprogramme, die nichts zurück geben "procedure" heißen und Unterprogramme, die etwas zurück geben als 'function' bezeichnet werden.

    Wenn Du sparsam denkst, dann muss ich Dich enttäuschen. Du musst return; zwar am Ende einer Prozedur nicht schreiben, aber der Befehl muss dennoch ausgeführt werden, schließlich kehrt auch ein Prozedur an die Stelle zurück, an der sie gerufen wurde.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    DrPhil_Guth - 27.05.2008, 17:04


    Moritz hat folgendes geschrieben: Naja, ich weiss ja, wie das mit den Blöcken funktioniert. Aber an der Stelle war es bequemer, einfach 20 mal Strg+V zu drücken und nur die Zahlen anzupassen.
    :shock:
    Also, hier ne grundregel, die kannst du von mir aus in dein gehirn einbrennen:

    Wenn du Code einfach mit copy und paste und dann mit suchen ersetzen duplizieren kannst, dann kannst du in 98,32 % der fälle das ganze einfach und besser schreiben.
    Das fängt damit an die Anweisungen in den richtigen Block zu schreiben, geht darüber wiederverwendbaren code in eine funktion zu packen, und endet irgendwo bei Templates.

    überleg dir, ob du das was du schreibst nich einfacher schreiben kannst.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Metamorph - 27.05.2008, 20:24


    Und noch etwas zu den Blöcken:
    Sie erhöhen nicht nur die Übersicht, sondern auch die Schnelligkeit der Ausführung. Damit dein Programm nicht fünfmal die gleiche Bedingung überprüfen muss, was in diesem Fall die Geschwindigkeit senkt, macht ein Block sowas nur einmal. Jeder {}-Block ist für den Compiler ein Befehl, der intern abgearbeitet wird. Fünf Bedingungsabfragen mit jeweils einer Anweisung sind dann zehn Befehle, die ausgeführt werden müssen.
    Gebilde wie else if sind aus solchen Überlegungen entstanden.

    Zitat: Für vorschläge, wie ich dass mit den Globalen variablen anders machen soll, bin ich offen. Aber ich sehe keine andere Möglichkeit. Die Variablen als Argumente Übergeben kann ich nicht, da ich den Interrupt ja nicht aufrufe, sonder der Prozessor selbst.


    Wie ich schon erwähnt habe:
    Den ganzen Quelltext habe ich mir nicht angesehen, da dieser sehr unübersichtlich ist. In den meisten Fällen ist static ein Ersatz zu Globalen Variablen.
    a, b, c, d sind schlechte Bezeichner für Variablen.
    Dir wurde nicht umsonst empfohlen, etwas anderes zu machen.

    EDIT:
    Was macht die Header <mega32.h>?
    Was soll der folgende Befehl bezwecken?
    Code: #asm("sei")
    Sieht der Compiler sowas nicht als Präprozessordirektive an?

    Code: while (1)
    {

    }
    Ein leerer Schleifenblock!



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    wirthi - 27.05.2008, 21:52


    Metamorph hat folgendes geschrieben:
    Code: while (1)
    {

    }
    Ein leerer Schleifenblock!
    "Leer"? Das ist eine Endlosschleife. Da sie aber ganz am Ende des Programmes steht, hat sie wohl dort einen Zweck ....



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Metamorph - 27.05.2008, 23:24


    Zitat: "Leer"? Das ist eine Endlosschleife. Da sie aber ganz am Ende des Programmes steht, hat sie wohl dort einen Zweck ....

    Aua. Stimmt.
    Nur welchen Zweck soll eine Endlosschleife mit leerem Block und ohne jegliche Möglichkeit für einen Abbruch haben?

    Vielleicht ist es im Moment besser, dass sich dieses Programm nicht compilieren lässt.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    wirthi - 27.05.2008, 23:32


    Den gleichen, den sonst ein scanf() oder kbhit oder sonstiges am Programmende hat: dass man die Ausgabe noch sieht, bevor die IDE das Terminal schließt. Gibt natürlich bessere Wege als eine Endlosschleife dafür ...



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Metamorph - 28.05.2008, 12:50


    wirthi hat folgendes geschrieben: Den gleichen, den sonst ein scanf() oder kbhit oder sonstiges am Programmende hat: dass man die Ausgabe noch sieht, bevor die IDE das Terminal schließt. Gibt natürlich bessere Wege als eine Endlosschleife dafür ...

    ...also ein Abbruch über Alt+F4 oder den Affengriff?
    Das bezweifle ich.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    wirthi - 28.05.2008, 13:01


    Ich meinte: ein besserer Weg, zu verhindern, dass die Konsole nach Programmende verschwindet. Oder zumindest ein weg, sie dann wieder her zu holen (das ging z.B. bei der Turbo-Reihe).



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Moritz - 28.05.2008, 15:15


    Wie oben bereits gesagt, das Programm ist NICHT für einen Computer, sondern für einen microprozessor. Die endlosschleife ist das, was der nach den initialisierungen machen soll. Die mega32.h wird vom compiler automatisch eingebunden. Die Variable PORTx.x bezeichnet die Zusände der Ausgagspins. Und es ging hier nicht darum, den Stil des Programms infragezustellen, sondern mich einfach auf den (dummen) Fehler hinzuweisen, dass es
    so heissen muss:



    (active==&a) ? set(1) :(active==&b) ? set(2): (active==&c) ? set(3):PORTC.1=1;

    Und ein microprozessor kennt nunmal kein scanf... er kennt ja auch keine Tastatur, sondern nur ein Feld von Boolean-Variablen, sprich- die Ein-Und Ausgänge.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Metamorph - 28.05.2008, 19:15


    Zitat: Die endlosschleife ist das, was der nach den initialisierungen machen soll.

    Was soll er denn machen?

    Zitat: Die mega32.h wird vom compiler automatisch eingebunden.

    Eigentlich ist es der Präprozessor. Ich wollte den Inhalt dieser Header wissen.



    Zitat: Und es ging hier nicht darum, den Stil des Programms infragezustellen, sondern mich einfach auf den (dummen) Fehler hinzuweisen, dass es
    so heissen muss:

    (active==&a) ? set(1) :(active==&b) ? set(2): (active==&c) ? set(3):PORTC.1=1;

    Ich interpretiere daraus, dass du dieses Problem gelöst hast.
    Würdest du solch einen Quelltext zu einem Open-Source-Unternehmen schicken, so würden dich hunderte wütende Programmierer mit dem Lehrbuch von Brian Kernighan bewerfen. xD
    Es ist schwierig den Quelltext zu lesen und noch schwieriger den Fehler zu finden.
    Wie schon erwähnt, ist der ?:-Operator kein Ersatz zu einer Wenn-dann-sonst-Anweisung.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Dirty Oerty - 28.05.2008, 23:04


    Den Endlosschleife hat schon einen guten Grund.
    Sie ist auch in Betriebssystemen von Computern enthalten (oder eine Stoppanweisung), allerdings wird sie nie ausgeführt. Oder wird durch Interrupts unterbrochen.

    Diese Endlosschleife bedeutet eigntl "nix tun".


    Wenn du aber gerade erst mit C anfängst ist es keine gute Idee mit Microprozessorprogrammierung einzusteigen.
    Aber das musst du wissen.

    MfG
    Daniel



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Xin - 29.05.2008, 08:58


    Moritz hat folgendes geschrieben: Die Variable PORTx.x bezeichnet die Zusände der Ausgagspins.
    Danke für die Info, man kann ja nicht alles wissen.
    Dennoch eine merkwürdige Schreibweise :-/

    Moritz hat folgendes geschrieben: Und es ging hier nicht darum, den Stil des Programms infragezustellen, sondern mich einfach auf den (dummen) Fehler hinzuweisen, dass es so heissen muss:

    (active==&a) ? set(1) :(active==&b) ? set(2): (active==&c) ? set(3):PORTC.1=1;
    Ich fasse das mal als etwas merkwürdig formuliertes "Danke für den Hinweis" auf und weise darauf hin, dass es vielleicht nicht darum ging, den Stil des Programms in Frage zu stellen, aber der Programmstil nunmal aufdrängt, Dich darauf hinzuweisen, dass Du ihn in Frage stellst.
    Ich kann ihn nicht in Frage stellen, den für mich ist der Programmstil eine klare Sache. :->



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Moritz - 29.05.2008, 16:27


    Zitat:
    Eigentlich ist es der Präprozessor. Ich wollte den Inhalt dieser Header wissen.




    Dass meinte ich nicht. Immer wenn du ein neues Programm erstellst, befindet sich diese Zeile dort, da sonst Befehle wie
    Code:
    PORTA.1=1;

    nicht definiert sind. Dass macht also zwar auch nicht der Compiler, aber einigen wir uns darauf dass es von der IDE erledigt wird...



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Metamorph - 29.05.2008, 18:13


    Es ist nach wie vor der Präprozessor. Anweisungen die mit # beginnen, sind Präprozessordirektive.

    Meine Frage war, welcher Inhalt sich in dieser Header <mega32.h> befindet. Hast du dazu eine Dokumentation.

    Zitat: Ich interpretiere daraus, dass du dieses Problem gelöst hast.
    Und? Hast du es gelöst?

    Was soll dein Programm überhaupt machen, außer den Microprozessor kontrolieren?

    Das Phänomen mit der 'Mach_garnichts_Interation' ist mir immer noch nicht ganz klar, aber egal. (Ich wünschte, ich könnte das gelegentlich mit meinem Gehirn machen. ^^)



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Dirty Oerty - 29.05.2008, 19:01


    Das "Mach-gar-nichts" ist einfach nur dazu da, dass der Mikrocontroller nach der Ausführung (oder evtl auch in Pausen) nicht irgendetwas tut, sondern einfach nur nichts.

    Denn der Mikrocontroller geht ja nicht nach der Codeausführung einfach so aus.

    In einem Computerprogramm (also ein Programm für ein bestimmtes Betriebssystem) wäre eine solche Schleife natürlich nicht so toll.
    Aber ein Computer mit laufendem Betriebssystem weiß auch was zu tun ist, wenn ein Programm beendet ist.
    Ein Mikrocontroller weiß das nicht.
    Also lässt man ihn gar nichts tun.
    Dann ist das Programm nicht zu Ende und es entstehen keine Probleme.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Moritz - 29.05.2008, 20:50


    Natürlich ist dass eine direktive an den Präprozessor. Aber Die Direktive selbst wird wiederum von der IDE eingefügt!! (also beim erstem Start)



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Metamorph - 30.05.2008, 15:35


    @Dirty Oerty :
    Danke, jetzt habe ich es verstanden.

    Zitat: Natürlich ist dass eine direktive an den Präprozessor. Aber Die Direktive selbst wird wiederum von der IDE eingefügt!! (also beim erstem Start)

    Diese Anweisung dürfte auch gültig sein, wenn du keine IDE benutzt. Also ist es eine Präprozessordirektive. Ich würde nach wie vor gerne wissen, was in dieser Header drinsteht. Gibt es dazu eine Dokumentation?

    Meine anderen Fragen hast du noch nicht beantwortet.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Moritz - 30.05.2008, 16:43


    @Metamorph:
    Man MUSS in dem Fall eine IDE benutzen da man sonst dass Programm garnicht auf das Zielmedium, sprich den Flash-speicher des Microcontrollers bekommt. Aber ich habe für dich die MEGA32.h mal angehängt. Sie beinhaltet nur ein wenig device-spezifischen code:

    MEGA32.h:

    Code:


    // CodeVisionAVR C Compiler
    // (C) 1998-2004 Pavel Haiduc, HP InfoTech S.R.L.

    // I/O registers definitions for the ATmega32

    #ifndef _MEGA32_INCLUDED_
    #define _MEGA32_INCLUDED_

    #pragma used+
    sfrb TWBR=0;
    sfrb TWSR=1;
    sfrb TWAR=2;
    sfrb TWDR=3;
    sfrb ADCL=4;
    sfrb ADCH=5;
    sfrw ADCW=4;      // 16 bit access
    sfrb ADCSRA=6;
    sfrb ADCSR=6;     // for compatibility with older code
    sfrb ADMUX=7;
    sfrb ACSR=8;
    sfrb UBRRL=9;
    sfrb UCSRB=0xa;
    sfrb UCSRA=0xb;
    sfrb UDR=0xc;
    sfrb SPCR=0xd;
    sfrb SPSR=0xe;
    sfrb SPDR=0xf;
    sfrb PIND=0x10;
    sfrb DDRD=0x11;
    sfrb PORTD=0x12;
    sfrb PINC=0x13;
    sfrb DDRC=0x14;
    sfrb PORTC=0x15;
    sfrb PINB=0x16;
    sfrb DDRB=0x17;
    sfrb PORTB=0x18;
    sfrb PINA=0x19;
    sfrb DDRA=0x1a;
    sfrb PORTA=0x1b;
    sfrb EECR=0x1c;
    sfrb EEDR=0x1d;
    sfrb EEARL=0x1e;
    sfrb EEARH=0x1f;
    sfrw EEAR=0x1e;   // 16 bit access
    sfrb UBRRH=0x20;
    sfrb UCSRC=0X20;
    sfrb WDTCR=0x21;
    sfrb ASSR=0x22;
    sfrb OCR2=0x23;
    sfrb TCNT2=0x24;
    sfrb TCCR2=0x25;
    sfrb ICR1L=0x26;
    sfrb ICR1H=0x27;
    sfrb OCR1BL=0x28;
    sfrb OCR1BH=0x29;
    sfrw OCR1B=0x28;  // 16 bit access
    sfrb OCR1AL=0x2a;
    sfrb OCR1AH=0x2b;
    sfrw OCR1A=0x2a;  // 16 bit access
    sfrb TCNT1L=0x2c;
    sfrb TCNT1H=0x2d;
    sfrw TCNT1=0x2c;  // 16 bit access
    sfrb TCCR1B=0x2e;
    sfrb TCCR1A=0x2f;
    sfrb SFIOR=0x30;
    sfrb OSCCAL=0x31;
    sfrb TCNT0=0x32;
    sfrb TCCR0=0x33;
    sfrb MCUCSR=0x34;
    sfrb MCUCR=0x35;
    sfrb TWCR=0x36;
    sfrb SPMCR=0x37;
    sfrb TIFR=0x38;
    sfrb TIMSK=0x39;
    sfrb GIFR=0x3a;
    sfrb GICR=0x3b;
    sfrb OCR0=0X3c;
    sfrb SPL=0x3d;
    sfrb SPH=0x3e;
    sfrb SREG=0x3f;
    #pragma used-

    // Interrupt vectors definitions

    #define EXT_INT0 2
    #define EXT_INT1 3
    #define EXT_INT2 4
    #define TIM2_COMP 5
    #define TIM2_OVF 6
    #define TIM1_CAPT 7
    #define TIM1_COMPA 8
    #define TIM1_COMPB 9
    #define TIM1_OVF 10
    #define TIM0_COMP 11
    #define TIM0_OVF 12
    #define SPI_STC 13
    #define USART_RXC 14
    #define USART_DRE 15
    #define USART_TXC 16
    #define ADC_INT 17
    #define EE_RDY 18
    #define ANA_COMP 19
    #define TWI 20
    #define SPM_RDY 21

    // Needed by the power management functions (sleep.h)
    #define __SLEEP_SUPPORTED__
    #define __POWERDOWN_SUPPORTED__
    #define __POWERSAVE_SUPPORTED__
    #define __STANDBY_SUPPORTED__
    #define __EXTENDED_STANDBY_SUPPORTED__
    #asm
       #ifndef __SLEEP_DEFINED__
       #define __SLEEP_DEFINED__
       .EQU __se_bit=0x80
       .EQU __sm_mask=0x70
       .EQU __sm_powerdown=0x20
       .EQU __sm_powersave=0x30
       .EQU __sm_standby=0x60
       .EQU __sm_ext_standby=0x70
       .EQU __sm_adc_noise_red=0x10
       .SET power_ctrl_reg=mcucr
       #endif
    #endasm

    #endif





    Meiner Ansicht nach tut dass aber nichts zum Thema bei.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Metamorph - 01.06.2008, 00:56


    Zitat: Meiner Ansicht nach tut dass aber nichts zum Thema bei.

    Es hat insofern was mit dem Thema zu tun, dass man den Quelltext nachvollziehen kann. Wenn man den Quelltext nachvollziehen kann, kann man auch den Fehler finden. Da das keine Header aus der Standardbibliothek ist, haben mir Informationen über Bezeichner wie PORTA etc. gefehlt.
    Es hilft nichts, eine Codezeile vom Quelltext zu setzen und zu fragen, wo der Fehler liegt.
    Tut mir Leid aber ich kann mit dem Quelltext nichts anfangen.
    Hier bin ich mit meinem Latein am Ende.



    Re: Fehler: Operand types are not compatible in CodeVisionAVR

    Moritz - 01.06.2008, 12:03


    Das Problem ist ja auch gelöst:

    Code:
    (active==&a) ? set(1) :(active==&b) ? set(2): (active==&c) ? set(3):PORTC.1=1;


    so muss es heissen!!



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum Tutorials.at

    Problembeicht senden alert bei Rechner - gepostet von Tropf am Sonntag 01.10.2006
    turbodelphi-Programm - gepostet von Moritz am Freitag 04.01.2008
    Geschachtelte Schleifen - gepostet von Kimi am Donnerstag 29.11.2007
    Programme mit Pascal - gepostet von bato am Montag 01.05.2006
    Umrechner Arabische in Römische Zahlen - gepostet von Walgo am Donnerstag 19.07.2007
    Bücher!?,aber welche? - gepostet von niki1 am Dienstag 27.02.2007
    Eigene Programme - gepostet von vpascal am Mittwoch 04.04.2007
    Neue Moderatoren wurden ernannt - gepostet von exbs am Mittwoch 28.03.2007



    Ähnliche Beiträge wie "Fehler: Operand types are not compatible in CodeVisionAVR"

    PvP Turnier - Anonymous (Montag 25.09.2006)
    PvP Gildenabend am 19.9. [Anmeldung] - Zauberwienix (Montag 17.09.2007)
    Outdoor PVP - Klichtmetzer (Dienstag 21.02.2006)
    Papenburger Kanalreisen - Busfan (Mittwoch 07.12.2011)
    PvP for Dummies - Scythe (Mittwoch 11.10.2006)
    Selbstmotivation: "Ich schaffe das!" - kokopellina (Freitag 11.02.2011)
    Ice Sorc Skillung - AoF-Zero (Samstag 06.11.2004)
    PvP LvL 40 - 49 - Mofizius (Mittwoch 17.05.2006)
    ABBAWORLD - The Dolls - abbathefan (Dienstag 09.02.2010)
    Raid-Skillung für Druiden - Bly (Samstag 11.08.2007)