- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 25

Thema: Einstieg in C (WinAVR)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hi,

    nach einiger Zeit bin ich nun (mal wieder) am experimentieren mit dem Atmel-Studio (6).
    Ich wollte wieder mit der USART anfangen, nachdems damals ja nicht geklappt hatte... Also hab ich ein Programm geschrieben, welches "Hallo Welt" jede 1s ausgeben soll. Doch leider passiert wieder mal nichts. Ich weiß nicht wo der Fehler ist, aber es scheint, als würde der AVR (ATXMega32A4) überhaupt nichts machen, es kommt nichtmal Müll im Terminal an. Ansich muss aber alles funzen, den wenn ich das gleiche Prog mit Bascom schreibe, kommt immer was im Terminal an...
    Code:
    #define F_CPU 32000000L
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <string.h>
    
    
    int main(void)
    {
        
        Clock_init();
        uart_init(&USARTC1);
        
        while(1)
        {
            Send_UART("Hallo Welt" , &USARTC1);
            for(int i=1000;i>=1;i--)
            {
                _delay_ms(1);
            }    
        }
        
    }
    
    void Clock_init(void)
    {
        OSC.CTRL |= OSC_RC32MEN_bm;
        while(!(OSC.STATUS & OSC_RC32MRDY_bm));
        CCP = CCP_IOREG_gc;
        CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
    }
    
    void uart_init(USART_t *usart)
    {
          usart->BAUDCTRLB = 0;                                                                                            
          usart->BAUDCTRLA = 0x11;                                                                                            
          usart->CTRLB = USART_TXEN_bm | USART_RXEN_bm;                                                                
          usart->CTRLC = 0x03;                                                                                                
          usart->CTRLA = 0;
    }
    
    void Send_UART(char data[], USART_t *usart)
    {
        char Counter = 0x00;
        char lenght = 0x00;
    
        lenght = strlen(data);
    
        while(Counter < lenght)
        {
            while (!(usart->STATUS & USART_DREIF_bm));
            usart->DATA = data[Counter];
            Counter++;
        }
    
        Counter = 0x00;
        while (!( usart->STATUS & USART_DREIF_bm));
        usart->DATA = 0x0A;
        while (!( usart->STATUS & USART_DREIF_bm));
        usart->DATA = 0x0D;
    }
    Ich drücke auf "Build GccApplication3" (so heißt das Prog) und anschließend auf "Device Programming". Dann auf "Apply", dann auf Memories und wähle die .hex Datei aus. Dann drücke ich noch auf Program. Ich hoffe der Ablauf ist richtig?!

    Gruß
    Chris

    EDIT:
    Hab den Fehler selbst gefunden, hatte vergessen den TX-Pin auf Ausgang zu stellen. Da ist wohl Bascom Schuld, der macht das automatisch..
    Geändert von Che Guevara (27.08.2013 um 11:58 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hi,

    also ich bin momentan fleißig am programmieren und habe was ausprobiert, was ich kaum glauben kann:
    Ein Programm (berechnen von ein paar Variablen) in Bascom braucht 5x so lange wie das gleiche Programm in C. KANN DAS SEIN? Das wäre ja gigantisch
    Hier mal die Codes, damit ihr mitreden könnt:
    Bascom:
    Code:
    Dim Newrcdata As Byte
    Dim Empf(8) As Byte
    
    Dim Empfold1(8) As Word
    Dim Empfold2(8) As Word
    Dim Empfold3(8) As Word
    Dim Empfold4(8) As Word
    
    Dim Lpempf(8) As Word
    
    
    Dim I As Byte
    
    Do
    
    
       Newrcdata = 1
       Call Rc_signal()
       Portd.0 = Not Portd.0
    
    
    Loop
    
    End
    
    
    Sub Rc_signal()
    
    
       If Newrcdata = 1 Then
          Newrcdata = 0
    
          For I = 1 To 8
             Empfold1(i) = Empfold2(i)
             Empfold2(i) = Empfold3(i)
             Empfold3(i) = Empfold4(i)
             Empfold4(i) = Empf(i)
    
             Lpempf(i) = Empfold1(i) + Empfold2(i)
             Lpempf(i) = Lpempf(i) + Empfold3(i)
             Lpempf(i) = Lpempf(i) + Empfold4(i)
             Shift Lpempf(i) , Right , 2 , Signed
          Next I
    
       End If
    
    
    End Sub
    AVR-Studio:
    Code:
    uint8_t newrcdata = 0;
    
    uint8_t empf[8];
    
    uint16_t empfold1[8];
    uint16_t empfold2[8];
    uint16_t empfold3[8];
    uint16_t empfold4[8];
    
    uint16_t lpempf[8];
    
    int main(void)
    {
        
        Clock_init();
        PORTC.DIR = 0x80;
        uart_init(&USARTC1);
        init_i2c(&TWIE);
        
        PORTD.DIR = 0xff;                              //set PortD Output
        PORTD.OUTSET = 0x01;                           //set PortD.0 High
        
        empf[1] = 120;
        empf[2] = 210;
        empf[3] = 210;
        empf[4] = 210;
        empf[5] = 210;
        empf[6] = 210;
        empf[7] = 210;
        empf[8] = 210;
        
        while(1)
        {
            newrcdata = 1;
            rc_signal();
            PORTD.OUTTGL = 0x01;
        }
        
    }
    
    void rc_signal(void)
    {
        if(newrcdata==1)
        {
            newrcdata = 0;
            for(uint8_t i=1;i<9;i++)
            {
                empfold1[i]=empfold2[i];
                empfold2[i]=empfold3[i];
                empfold3[i]=empfold4[i];
                empfold4[i]=empf[i];
                
                lpempf[i]=empfold1[i]+empfold2[i]+empfold3[i]+empfold4[i];
                lpempf[i]=lpempf[i]>>2;
            }
        }
    }
    Die benötigte Zeit wurde jeweils mit dem Oszi gemessen, Bascom braucht 75µs und AVR-Studio braucht 15µs.

    Außerdem wollte ich noch fragen, wann brauche ich volatile?
    Was ich bis jetzt weiß, ist, dass wenn eine Variable volatile ist, wird der Wert immer wieder im RAM gespeichert und daraus gelesen. Wenn eine Variable nicht als volatile definiert wird, wird der Wert wohl im Stack gespeichert!?
    Was ist der Vorteil? Ist der Weg über den Stack schneller?
    Kann es passieren, dass mir bestimmte Variablen, die nicht oft benutzt werden, wegoptimiert werden? Und wenn ja, woher weiß ich, welche Variablen wegoptimiert werden?

    Sorry für die vielen Fragen, aber in den Tuts / im Inet hab ich leider keine Antworten darauf gefunden...

    Vielen Dank & Gruß
    Chris

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Fehlermeldung WinAVR
    Von hvltt15 im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 10.04.2008, 20:31
  2. MFile [WinAVR]
    Von siroks im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 17.01.2008, 21:22
  3. WinAVR
    Von Chattychan im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 12.09.2006, 13:41
  4. WinAvr
    Von LC-HC im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 30.08.2005, 14:10
  5. WinAVR Tutorial
    Von Kjion im Forum Software, Algorithmen und KI
    Antworten: 2
    Letzter Beitrag: 12.08.2004, 10:36

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress