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.
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![]()
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.
hi,
erst mal danke für die schnelle Antwort.
Ich hab'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...Code:#define F_CPU 16000000
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
oder so ähnlich... wie würde denn der Quelltext aussehen nach meiner Idee?[/code]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); }
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.
also beim compilieren kommt die Warnung signal.h is obsolete, use interrupt.h... und SIG_OUTPUT_COMPARE_1A appears to be a misspelled
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/erweitertHabe 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.
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? }
Die SLEEP (500) Methode hätte ich auch gerne. kannst du die mal posten?
Danke
Gruß
Stefan
Etwas in der Art:
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.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--; } }
Lesezeichen