- LiFePO4 Speicher Test         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 25

Thema: Einstieg in C (WinAVR)

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Anzeige

    Powerstation Test
    Hi,

    also DDRX gibts bei mir nicht, aber ich verwende einfach PORTX.DIRSET.
    Mittlerweile habe ich mich schon etwas eingearbeitet, stehe aber vor dem nächsten Problem:
    In Bascom kann man Variablen als Overlay definieren, also zb. zwei Bytes über einem Integer. Ich hab bis jetzt durch Google noch nicht rausfinden können, ob und wie das in C geht. Kann mir das jemand erklären?
    Außerdem würde ich gerne wissen, wie ich die Speicherstelle einer Variable rausfinden kann, damit ich den DMA verwenden kann.

    Gruß
    Chris

  2. #12
    Erfahrener Benutzer Begeisterter Techniker Avatar von Chypsylon
    Registriert seit
    02.02.2011
    Ort
    Graz/Österreich
    Beiträge
    256
    Ich kann dir wirklich nur empfehlen das zuvor schon verlinkte Tutorial durchzuarbeiten

    Die Speicheradresse einer Variable kannst du mit Pointern (z.b: &variable) herausfinden. Allerdings sind die schon etwas komplizierter und man sollte die Grundlagen beherschen bevor man sich da ranmacht

  3. #13
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Code:
    PORTX.DIRSET.
    Wir nur auf einem XMega funktionieren.

    Das X in DDRX ist nur symbolisch gemeint. Je nach µC musst du das X halt ersetzen.
    Grüße,
    Daniel

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    Da Chris von DMA spricht gehe ich davon aus, dass er auch wirklich einen XMega benutzen möchte...

    Die Overlay-Funkionalität von Bascom müsste in etwa der union in C entsprechen. Struct kannst Du Dir in dieser Richtung auch mal anschauen. Siehe http://de.wikibooks.org/wiki/C-Progr...exe_Datentypen

    Die Speicheradresse einer Variablen kannst Du in C mit dem Adressoperator '&' ermitteln, wie Chypsolon schon schrieb. Allerdings musst Du dann mit Pointern arbeiten.
    Beispiel
    Code:
    uint8_t foo;
    uint8_t *Address;              //Pointer!
    
    Address = &foo;
    Gruß,
    askazo
    Geändert von askazo (04.02.2013 um 08:00 Uhr)

  5. #15
    Hallo Che Guevara

    Ich hab deinen Beitrag gelesen. Und zufällig bin ich gerade daran, für meine Website ein Tutorial zu schreiben, das dem was du suchst nahekommen dürfte.

    Das Tutorial ist fast fertig, es fehlen noch ein paar kosmetische Details. Du kannst es dir gerne schon mal anschauen. Du findest es unter:

    http://www.electronicsplanet.ch/mikr...tutorial-c.htm

    Auf meiner Website bigt es noch keinen Link zu dem Tutorial. Du findest es nur über obigen Link. Ist also ne Exklusiv-Voransicht, nur für dich

    Falls du damit arbeitest wäre ich um Feedbacks dankbar. Vieleicht findest du ja noch Fehler, die ich korrigieren sollte.

    Gruss
    Kresley
    Geändert von Kresley (04.02.2013 um 11:13 Uhr)

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hi,

    ja ich möchte mit einem ATXMega32A4 arbeiten, ich hab wohl vergessen, das zu erwähnen, tut mir leid!

    Allerdings musst Du dann mit Pointern arbeiten.
    Wieso so "abwertend"? Sind Pointer was schlechtes oder interpretiere ich den Satz einfach nur falsch?

    Code:
    union overlay
    {
       uint8_t byte1;
       uint8_t byte2;
       int16_t integer1;
    };
    Könnte ich mit dieser Union auf einen Integer und dessen zwei zugrundeliegende Bytes zugreifen?

    Also ich muss schon sagen, geschenkt wird einem bei C wohl garnichts. Nichtmal die Delay-Funktion funktioniert!?
    Ich möchte in einem Abstand von ca. 1s einen Text über die serielle ausgeben, aber es wird nichts mehr gesendet. Ist das ein Bug?
    Ich hab <avr/delay.h> eingebunden und auch den Hinweis mit max. delayZeit = 262.14ms / F_CPU (in MHz) hab ich gesehen....

    Code:
    #include <avr/io.h>
    #include <avr/delay.h>
    
    #define F_CPU 32000000UL
    
    
    int main(void)
    {
        
        Clock_init();
        uart_init(&USARTC1,115200);
        PORTC.DIRSET = 0x80;
        
        while(1)
        {
            send_string(&USARTC1, "Hallo Welt");
            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 *uart, uint32_t baud)
    {
        uart->BAUDCTRLA = (F_CPU/(16*baud))-1;
        uart->BAUDCTRLB = ((F_CPU/(16*baud))-1)>>8;
        uart->CTRLB = USART_RXEN_bm | USART_TXEN_bm;
        uart->CTRLC = USART_CHSIZE_8BIT_gc;
    }
    
    void send_string(USART_t *uart, char str[])
    {
        uint8_t i = 0;
        
        while (i<strlen(str))
        {
            while (!( uart->STATUS & USART_DREIF_bm));
            uart->DATA = str[i];
            i++;
        }
        while (!( uart->STATUS & USART_DREIF_bm));
        uart->DATA = 0x0d;
        while (!( uart->STATUS & USART_DREIF_bm));
        uart->DATA = 0x0a;
    }
    
    void delay_ms(uint64_t ms)
    {
        uint64_t i = 0;
        
        while (i < ms)
        {
            i++;
            _delay_ms(1);
        }
    }
    Gruß
    Chris
    Geändert von Che Guevara (04.02.2013 um 14:04 Uhr)

  7. #17
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Zeiger sind nichts Schlechtes, allerdings machen sie die meisten Probleme .

    Bzgl. Delay : Kannst ja mehr mals ein delay konstanter Länge aufrufen und dein langes Delay so zusammensetzen. (Machste ja auch )
    Grüße,
    Daniel

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Könnte ich mit dieser Union auf einen Integer und dessen zwei zugrundeliegende Bytes zugreifen?
    Nein, byte1, byte2 als auch das Lowbyte von integer1 liegen auf der gleichen Adresse, vorausgesetzt AVR Little-Endianess.
    Das Highbyte von integer1 wird von den anderen nicht erreicht. Wenn Du das machen willst, bau erst ein Struct aus 2 Bytes und pack das in die Union.
    Ich möchte in einem Abstand von ca. 1s einen Text über die serielle ausgeben, aber es wird nichts mehr gesendet.
    Im Quelltext steht 1 Millisekunde.
    Ist das ein Bug?
    Anfänger halten alles außer sich selbst für 'nen Bug
    Die Delay-Funktionen benötigen eingeschaltete Optimierung, ist die an ?
    Gibt aber normalerweise Mecker vom Compiler falls nicht angeschaltet.
    Im Zweifelsfall simulieren.

  9. #19
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Zitat Zitat von MagicWSmoke Beitrag anzeigen
    Wenn Du das machen willst, bau erst ein Struct aus 2 Bytes und pack das in die Union.
    Würde es wie folgt definieren :

    Code:
    union overlay{   
    int16_t integer1;   
    struct  bytes {     
    uint8_t byte1;     
    uint8_t byte2;   
    } bytes;
    };
    Zitat Zitat von MagicWSmoke Beitrag anzeigen
    Anfänger halten alles außer sich selbst für 'nen Bug
    Der ist gut. Genauso muss F_CPU bei Atmel Studio als Symbol definiert werden. Sonst rafft es der Compiler auch nicht und die delays lassen sich nicht wirklich gut berechnen. Das mit der 1ms kann man auch wie folgt sehen :
    Bei 32 MHz und mehr ist 1 ms ne Ewigkeit und braucht irgendwie Platz um den Zähler stand abzulegen. Umso schneller die CPU um so höher muss ich zählen um meine Millisekunde zu erreichen.
    Grüße,
    Daniel

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    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)

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ä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
  •  

Labornetzteil AliExpress