-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 30

Thema: brauche Start-Hilfe bei C&AVR

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.12.2005
    Ort
    Wurmannsquick/Ismaning
    Alter
    34
    Beiträge
    40

    brauche Start-Hilfe bei C&AVR

    Anzeige

    Hallo zusammen,

    ich bin schon längere Zeit passiver Mitleser hier im Forum und habe mir auf Grund einiger Vorhaben entschlossen, mich in die µC-Technik einzuarbeiten. Begrenzte C-Kenntnisse sind durch mein Studium (Maschbau) vorhanden, außerdem habe ich mir vom Shop das RN-Board und den Programmier-Dongle für den Parallelport geholt.

    Zu meinen eigentlichen Problemen:
    Ich habe winAVR in Kombination mit ponyprog, um den Flash des AVR mit der HEX-Datei zu füttern, nur läuft das Programm (Blinky aus dem wiki) nicht einwandfrei. Es blinken auf dem RN-Board die LED 1,2 und 8. Nur eben nicht in 2 Hz, sondern es sind die Pausen zwischen dem ca. 1 Sekunde langen Aufleuchten ca 30 Sekunden lang.

    Ich würd' gerne einfach nur ein einfaches Blink-Programm rüberladen nach dem Motto
    blink;
    Sleep(500);
    blink aus;
    Sleep(500);

    - hat da jemand ein paar Tipps für mich bzw. ein kleines Beispielprogramm?
    - mit welchem Befehl kann ich die Ports beschreiben bzw. auslesen?
    - dafür muss die Header io.h eingebunden werden (#include <avr/io.h>), oder? oder noch mehr?

    hm ein Beispiel sollte möglichst simpel sein: interrupts, timer, Zusammensetzen mehrerer Module usw. ist jetzt noch nicht so wichtig

    Ich wäre für euere Hilfe sehr dankbar

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Hoi.

    Das Beispiel stammt von mir.

    Hast du was an der CPU-Frequenz geändert?
    Welche Einstellungen verwendest du da (Fuses)?
    Hast du das im Quellcode angepasst?

    Es gibt auch eine etwas vereinfachte Version, die in einer einzigen Quelldatei ist.
    Disclaimer: none. Sue me.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.12.2005
    Ort
    Wurmannsquick/Ismaning
    Alter
    34
    Beiträge
    40
    hi,

    erst mal danke für die schnelle Antwort.

    Ich hab'
    Code:
    #define F_CPU                 16000000
    gesetzt, da das RN-Board mit 16MHz Quarz betrieben wird. Ohne Quarz ändert sich meiner Meinung nach nix bzw. wenn man den Wert ändert verändert sich die Blinkfrequenz nicht. Wenn der Prozessor auf 1 MHz getaktet ist dann würde das Ganze ja mit 32 Hz blinken da der AT ja 16 mal schneller betrieben wird als das Programm denkt...
    Ich habe die Werte aber in jede Richtung mal verändert, es ändert sich nichts.
    Meinst du mit "fuse" was anderes?

    ich hätte es so gemacht
    Code:
    #include <avr/io.h>
    #inlcude <avr/signal.h>
    #define PORT_LED  PORTB
    
    int main()
    {
            PORT_LED =1;
    	Sleep(500);
    	PORT_LED =0;
    	Sleep(500);
            return (0);
    }
    oder so ähnlich... wie würde denn der Quelltext aussehen nach meiner Idee?[/code]

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Nach dem Ändern den Defines muss das alles neu compiliert werden und wieder aufgespielt werden.

    Dabei ist sicherzustellen, daß bei Verwendung von make auch wirklich neu erzeugt wird. Wenn so ein Define im Makefile selbst steht, das Projekt aber nicht abhängig vom Makefile ist, dann wird nicht neu generiert.

    Das sieht eher so aus, als ob dein AVR mit 1MHz rennt und es deshalb langsam blinkt. Versuch doch mal die Einstellung mit F_CPU für 1MHz. Wenn sich nichts an der Blink-Frequenz ändert, ist mächtig der Wurm irgendwo. Blinkt die LED mit der angegebenen Frequenz, stimmen deine Fuse-Einstellungen nicht.

    sleep() gibt es nicht, jedenfalls nicht so (avr/sleep.h dient dazu, deinen AVR schlafen zu legen: Power-Down, etc).

    Eine sleep() im Sinne von wait() bräuchte eine Zeitbasis, die man sich erst besorgen muss. Dazu bildet das Beispiel die Grundlage, auf der man weiter aufbauen kann.
    Disclaimer: none. Sue me.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    08.12.2005
    Ort
    Wurmannsquick/Ismaning
    Alter
    34
    Beiträge
    40
    also beim compilieren kommt die Warnung signal.h is obsolete, use interrupt.h... und SIG_OUTPUT_COMPARE_1A appears to be a misspelled

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    08.12.2005
    Ort
    Wurmannsquick/Ismaning
    Alter
    34
    Beiträge
    40
    also beim compilieren kommt die Warnung signal.h is obsolete, use interrupt.h... und SIG_OUTPUT_COMPARE_1A appears to be a misspelled signal handler

    also entweder muss ich die signal.h updaten oder die wurde durch die interrupt.h ersetzt/erweitert Habe ich evtl beim installieren von WINAVR was vergessen?

    Was ist eigentlich jetzt die Adresse von der 1. LED? DDRB oder PORTB? wie kann ich alle LEDs an/ausschalten??

    Also er die LEDs leuchten genau 2 Sekunden auf und dann ist 40 Sekunden nix, egal welche Prozessortaktung, egal ob mit quarz oder ohne... deswegen gehe ich davon aus dass er sowieso ohne externer Taktung arbeitet.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Hallo,
    Zue Deiner Warnung:
    Klick
    und unter ISR weiterlesen
    Klick
    Diese Seite sollte sowieso jeder kennen, der sich mit avr-gcc beschäftigt...

    Gruß Sebastian

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    Du musst das Datenrichtungsregister noch setzten.

    Code:
    DDRB = 0xff;
    PORTB = 0x00;
    while( 1 )
    {
       PORTB ^= 0xff;
       SLEEP(500); // wo kommt denn bei Dir diese Routine her?
    }

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    Die SLEEP (500) Methode hätte ich auch gerne. kannst du die mal posten?
    Danke
    Gruß
    Stefan

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    Etwas in der Art:

    Code:
    #include <inttypes.h>
    #include <avr/delay.h>
    
    /**
     * wait for a given amount of time.
     * @param timeInMs The time to wait. Accuracy is 8ms
     */ 
    void sleep( uint16_t timeInMs )
    {
        uint16_t loopCnt = timeInMs>>3;
    
        while( loopCnt )
        {
            _delay_ms(8);
            loopCnt--;
        }
    }
    Die Funktion kann mit einer Genauigkeit von 8ms (plus ein paar hundert ns für die Schleife) von 8ms bis 65536ms verzögern. Wenn es genauer sein soll, kann man die Funktionen aus delay.h erweitern.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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