- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 15

Thema: AVR und Umstieg von Assembler auf C Programmierung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    Da gehe ich mit deinem Kollegen einig, C++ ist nicht wirklich ideal auf µC, das braucht schnell ml zu viel Code.
    Das würde ich nicht grundsätzlich so sagen. Wenn man nicht gerade sehr zeitkritisch arbeiten oder stark mit dem Speicherplatz knausern muss, ist C++ eine enorme Erleichterung beim µC programmieren.
    Viele Dinge sind ja im µC mehrfach vorhanden (ADCs, UARTs, SPIs etc.) - da bietet es sich wirklich an, für jedes Peripherie-Modul eine Klasse zu schreiben.
    Die Wiederverwendbarkeit und Übersichtlichkeit des Codes wächst damit ungemein.

    Gruß,
    askazo

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Auch wenn man später ggf. doch lieber C++ nutzt, schadet es nichts wenn man auch C kennt. Vieles ist da noch gleich und ordentlicher C Code ist meistens auch noch gültiger C++ Code.

    Man sollte sich aber schon vom ASM Code lösen - den ASM Code schaut man sich eigentlich nur an, wenn man Zweifel hat (ob man C richtig verstanden hat), oder sehr zeitkritischen Code hat. Vieles geht in C schon einfacher als in ASM - vor allem Sachen mit Vergleichen und 16/32 Bit Zahlen.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    ... den ASM Code schaut man sich eigentlich nur an, wenn man Zweifel hat (ob man C richtig verstanden hat), oder sehr zeitkritischen Code ...
    Genau. So prüfe ich z.B. bei einigen interrupt"verseuchten" Programmen die theoretisch mögliche Laufzeit wenn alle Interrupts nacheinander ablaufen
    anhand der aus der *.lls-Datei gefundenen Summe aller ISR-Taktzeiten. Wenn ich dann unterhalb der kürzesten Interruptfrequenz (eigentlich unterhalb der kürzesten ISR-pause) bin, habe ich beste Chancen, dass das Programm sich nicht aufhängt. Wenn die gesamt mögliche Laufzeit aller ISR zu lang ist, konnte schon mal ein nested Interrupt einer (längeren) ISR helfen.
    Ciao sagt der JoeamBerg

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.08.2011
    Beiträge
    61
    Hallo Leute,
    mir raucht der Kopf! Hab ein kleines Programm aus dem Buch von Günter Schmitt
    im Editor von Atmel Studio4 geschrieben.
    Das Projekt "mega8test" im Studio 4 angelegt, aber noch nicht zum laufen gebracht.
    Der Programmer AVR ISP mkII steht mir zur Verfügung.


    // Projekt: mega8test 11.02.2015

    // Datei: mega8test02.c

    // PORTB Output PB7...PB0 = 8x LED
    // PORTC Output PC5...PC0 = 6x LED
    // PORTD Input PD7...PD0 = 8x Schalter

    // Konfiguration: interner Oszillator 1MHz, ext. Reset-Signal

    #include <avr/io.h>
    #define Takt 1000000 // Systemtakt 1 MHz intern
    void main (void) // Hauptfunktion, was ist das?

    { // Anfang der Hauptfunktion

    DDRB = 0xFF; // PORTB = Output (Warum ; ?)
    DDRC = 0xFF; // PORTC = Output

    // Testschleife PC0 gemessen 70,7 KHz

    while (1) // unendliche Schleife

    { // Anfang des Schleifenblocks

    PORTB = PIND; // Eingabe PORTD nach Ausgabe PORTB

    PORTC++; // Dualzähler auf PORTC um 1 erhöhen

    } // Ende der while-Schleife
    } // Ende der Hauptfuktion main

    Frage hierzu:
    // muß ich doch vor einem Kommentar setzen.

    Aber was ist das denn..//#include <lcd_162_mini-no-wait.c> auch ein Kommentar?

    Oder while (1) unendliche Schleife?? Und die (1)

    Ich muß mir erst mal einige kurze einfache Programme anschaun, um die vielen Zeichen kennen zulernen.

    Grüße

    Rolf

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    Hallo Rolf!

    ... mir raucht der Kopf! ...
    // muß ich doch vor einem Kommentar setzen.
    Aber was ist das denn..//#include <lcd_162_mini-no-wait.c> auch ein Kommentar?
    Rauchen ist beim Kopf zulässig, beim IC bedeutet es meist nix Gutes.

    Doppel-Schrägstrich beginnt einen Kommentar bis zum Zeilenende - auch wenns im Prinzip Code ist.
    /* (Schrägstrich Stern) beginnt einen Kommentar - der kann mehrzeilig sein und wird mit */ beendet.

    A) Bitte schreibe das nächste Mal Deinen Code ins Codefenster. Das bekommst Du im Editor mit dem Button [#] - wenn Du den nicht siehst, dann drücke bitte auf "Erweiterte Ansicht". Im Editor sieht das dann so aus: [.CODE][./CODE] . Im Editor steht aber kein Leerzeichen nach der ersten Klammer. Und das Fenster ist dann erstmal leer. Nun die Schreibweise mit "nix" zwischen [ und C bzw. [ und /:

    Code:
    .
    Dieses Beispiel ist tricky, funktioniert "normalerweise" nicht *gggg*.

    B) Schau mal nach meinem Posting vom 09.02.2015, 14:34, bei "main Modul".
    Bei Dir könnte das etwa so aussehen:

    Code:
    //  Jetzt fängt der Code an mit Einschluss von Bibliotheken und
    //      Definitionen
    #include <avr/io.h>
    #include <util/delay.h>  // Hier ist eine "Wartefunktion" enthalten
    #define Takt 1000000 // Systemtakt 1 MHz intern
    
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    void main (void) // Hauptfunktion, was ist das?
                            // Das ist das eigentliche Hauptprogramm,
                            //      die Unterprogramme müssen vorher schon
                            //      geschrieben sein oder includierte werden
                            //      siehe dazu z.B. die o.g. Bibliotheken io.h etc
    // - - - - - - - - - - - - - - - -
    //                         Nun werden mal die Ports konfiguriert
    // Ports+Pins als Ein- (0) od. Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
    // - - - - - - - - - - - - - - - -
      DDRA  = 0b00000000;   // Alle Pins auf Eingang
      PORTA = 0b11100101;   // Pinn 0, 2 sowie fünf bis sieben mit Pullup
                            //
      DDRB  = 0b11111111;   // Alle Pins auf Ausgang
      PORTB = 0b00001111;   // Pinn 0-3 high => LEDs an, 4-7 auf low => LEDs aus
                            //
      DDRC  = 0b00111111;   // Pinn 0-5 auf Ausgang, 2 Eingänge
      PORTC = 0b11000000;   // Ausgänge 0-4 auf low, 5 auf high, PullUp für 6+7
                            // 
      DDRD  = 0b00000000;   // Alles Eingänge
      PORTD = 0b00001111;   //   Pullups einschalten (Schalter schaltet gegen GND)
                            //
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                            // Wir bewundern mal die LEDs - an oder aus
      _delay_ms( 1000);    // ... ne ganze Sekunde
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      for ( uint8_t i=0; i< 100; i++)       // LEDs 100 mal blinken lassen 
      {                     //   Schleifenanfang
    // - - - - - - - - - - - -
        PORTB |=  (1<<PB6};    // LED auf PB6 einschalten
        PORTB &= ~(1<<PB1); // LED auf PB1 ausschalten
        _delay_ms(  500);    // Nun warten wir ne halbe Sekunde (LED bewundern)
    
        PORTB &= ~(1<<PB6};    // LED auf PB6 ausschalten
        PORTB |=  (1<<PB1); // LED auf PB1 einschalten
        _delay_ms(  500);    // Nun warten wir ne halbe Sekunde (LED bewundern)
      }             // Ende von for ( uint8_t i=0; i< 100; i++)
    
    // - - - - - - - - - - - -
      return 0;             // Ende des Programms
    /* und zum Schluss noch ein mehrzeiliger Kommentar:
    Lorem ipsum dolor sit amet, consectetur adipisicing elit,
    sed do  eiusmod tempor incididunt ut labore et dolore magna aliqua. 
    Ut enim ad  minim veniam, quis nostrud exercitation 
    ullamco laboris nisi ut aliquip  ex ea commodo consequat. 
    Duis aute irure dolor in reprehenderit in  voluptate velit esse ...
    */
    Wenn ich ausreichend gefrühstückt habe müsstesollte das funktionieren. Ohne Tastendruck und nur hundert Blinkies.
    Geändert von oberallgeier (12.02.2015 um 10:05 Uhr)
    Ciao sagt der JoeamBerg

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    20.08.2011
    Beiträge
    61
    Hallo Oberallgeier,
    meinen Dank für Deinen zurecht gerückten Code.
    Hab ihn ins Studio4 rüber kopiert und ausgedruckt. Das muß ich jetzt erst mal verarbeiten.
    Die vielen Zeichen die hier ihre Bedeutung haben, gab es natürlich in Assembler nicht.
    Auch z.B. DDRB = 0b00000000 wurden mit 0xFF erledigt...oder geht das in C nicht?
    Klar waren hier 2 Zeilen notwendig...wie
    ldi akku,0xFF ;alle Bits in r16 = 1
    out DDRB,Akku ;Datenrichtung = Output

    Aber ich habs mir nun vorgenommen und muß da durch.

    Das Wetter ist im Norden besch....

    Viele Grüße

    Rolf

    - - - Aktualisiert - - -

    Sorry, wollte nur sehen, ob ich das hinbekomme!

    Code:
      DDRA  = 0b00000000;   // Alle Pins auf Eingang
      PORTA = 0b11100101;   // Pinn 0, 2 sowie fünf bis sieben mit Pullup
                            //
      DDRB  = 0b11111111;   // Alle Pins auf Ausgang
      PORTB = 0b00001111;   // Pinn 0-3 high => LEDs an, 4-7 auf low => LEDs aus
                            //
      DDRC  = 0b00111111;   // Pinn 0-5 auf Ausgang, 2 Eingänge

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    Zitat Zitat von hegewald Beitrag anzeigen
    ... Die vielen Zeichen ... gab es natürlich in Assembler nicht.
    Auch z.B. DDRB = 0b00000000 wurden mit 0xFF erledigt...oder geht das in C nicht?
    Hallo Rolf, natürlich gabs in Assembler nicht die vielen kryptischen Zeichen. Dem Assembler wird auch nicht nachgesagt dass er von seinen Autoren im reichlich eingetrübten Zustand (auf Deutsch heisst das "Suff") erstellt worden wäre. Manche sagen das den Jungs Kernighan & Ritchie aber nach . . .

    Ok, man kann in C natürlich statt
    DDRB = 0b00000000; auch
    DDRB = 0xFF;
    schreiben - also in hex. Es geht aber auch einfach
    DDRB = 255;
    eben dezimal. Und wenn Du Deinen Code weniger leserlich willst, dann schreibste
    DDRB = 0377;
    also oktal *ggg* - erkennbar an der führenden Null. Und wenns noch hyroglyphischer werden soll, ginge (mal zur Abwechslung - und wegen ASCII -) für die Ziffer 116 dezimal auch ein
    DDRB = 't';
    also das ASCII-Zeichen. MEINE Vorliebe ist >>bei Portdefinitionen<< die binäre Darstellung "DDRC = 0b00111111;" - erkennbar an dem Vorspann "0b"- da sehe ich nämlich sofort, welche Pinne Eingang und welche Ausgang sind - das ist bei der gleichWERTigen Darstellung 0x3F für meine Augen nicht der Fall. Wenn ich dagegen, z.B. beim Empfang eines UART-Befehls (ähnlich EIA232) einen bestimmten ASCII-Wert abfrage, dann schreibe ich z.B. if ( eingabe == 't' ) ... - das liest sich eben besser als if ( eingabe == 116 ) ... Wie gesagt, irgendwann waren irgendwo bei C vermutlichvielleicht doch ein paar fl.oz.-chen Alk im Spiel, oder gar ein Gallönchen.

    Bravo zum Codefenstertest!




    [OT]Wetter . . . heute lag ich nach dem mittäglichen Kaffee mehr als eine Stunde auf meiner Südterrasse. Im Schatten rund 0°C, im Sonnenschein auf der Terrasse bei blauem Himmel . . . wars einfach warm - weil dazu auch windstill.[/OT]
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. Umstieg von ATMEGA 16 auf 32 Bit AVR
    Von Nomis_Simon im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 09.12.2006, 17:42
  2. Umstieg von Bascom auf uisp + avr-gcc
    Von neurix im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 11.11.2005, 12:27
  3. Umstieg von Basic -> Assembler
    Von kaisobczak im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 14.04.2005, 08:17
  4. Umstieg von 8051 auf AVR
    Von postmann im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 16.02.2005, 08:11
  5. Umstieg von Basic auf C2
    Von Matthias im Forum C-Control II
    Antworten: 13
    Letzter Beitrag: 04.01.2004, 09:27

Berechtigungen

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

Labornetzteil AliExpress