Archiv verlassen und diese Seite im Standarddesign anzeigen : GCC Beispiele für AVR?
Wie wäre es wenn ihr in diesem Thread ein paar Codeschnipsel postet, welcher die grundlegenden Dinge demonstrieren.
z.B.
- wie man digitalen Port abfragt
- wie man analogen Port abfragt
- wie man bestimmte frequen am PWM Port ausgibt
- wie man timer nutzt
- wie man interrupt nutzt
u.s.w.
Jeder könnte was beisteuern! In anderem Thread könnte es man das gleiche in einer anderen Sprache (Basic / Assembler) machen.
Ich will sowas demnächst in einem Tutorial zusammenstellen....
Dauert aber noch einen kleinen Moment. ( Nach dem 15. Januar hab ich wieder mehr Zeit für sowas )
MfG Kjion
Wenn jemand ein Beispiel zu Hand hat, dann wäre doch Posting ganz gut. Kann Kjion gleich in seinem Tutorial einbauen, ich denke dagegen hat keiner etwas. Das Tutorial erleichtert den Einstieg doch erheblich, ich habe schon ersten Auszug gesehen.
<an Kjion>: Vielleicht kannst DU das Pony Programm auch noch in das Notepad2 einbinden. Ich hab das auch so gemacht, dann hat man gleich alles zusammen.
Hier noch mal das umgeschriebene LED-Beispiel. PORT B und D werden als Ausgang geschaltet und dann wird am Port B hochgezählt. Eine LED an Port B wird blinken. Dürfte glaube ich auf allen AVR´s so funktionieren wenn die entsprechenden Port´s vorhanden sind.
#include <avr/io.h>
//************************************************** ********
char i=0; //Globale 8-Bit Variable
//************************************************** ********
void warten(int t) //ermöglicht Pausen
{
int h;
for (;t>0;t--)
{
for (h=1600;h>0;h--) {}
}
return;
}
//************************************************** ********
int main(void)
{
char i=0; //Lokale 8-Bit Variable
//Setzen der Ein + Ausgänge
DDRB = 0xFF; //PortB: alles als Ausgäng
DDRD = 0xFF; //PortD: alles als Ausgang
//Ports digital ansteuern
PORTB = 0x00; //Alle Ausgänge werden auf low gesetzt
PORTD = 0x00; //Alle Ausgänge werden auf low gesetzt
while (1) //Endlosschleife
{
i++;
PORTB=i;
warten (150);
}
}
Gruß
Frank
Zur Abfrage analoger Ports kann ich folgenden Code beisteuern
void AD_Init(void)
{
outb(BV(ADEN) | BV(ADSC) | BV(ADPS1) | BV(ADPS2), ADCSR);
while (inp(ADCSR) & BV(ADSC));
}
unsigned int ADReadPort(unsigned char port)
{
outp(port, ADMUX);
outp(inp(ADCSR) | BV(ADSC), ADCSR);
while (inp(ADCSR) & BV(ADSC));
return (__inw(ADCL));
}
Da ich vor kurzer Zeit auch noch ziemlicher Anfänger war was Microcontroller betrifft finde ich diesen Thread sehr gut. Ich will einfach mal nen Stück Quelltext anhängen. Das ist sozusagen eine kleine
ADconverting Bibliothek die nur aus #define´s besteht.
Gruß Muraad
#include <io.h>
#define ADCinit ADCSRA|=_BV(ADEN) // Teilt dem Board mit das der jeweilige Port für ADC verwendet wird
#define ADCdisable ADCSRA &=~_BV(ADEN) // machs das vorherige wieder rückgänig
#define ADCstart ADCSRA|=_BV(ADSC) // startet eine konvertierung auf dem gewünschten Kannal/Pin
#define ADCfree ADCSRA|=_BV(ADATE) // schaltet den freilaufenden Modus ein
#define ADCvintern ADMUX=_BV(REFS1) |_BV(REFS0) // interne Spannungsversorgung
#define ADCprescaler_2 ADCSRA |=_BV(ADPS0) // gewünschter Teilungsfaktor/Prescaler
#define ADCprescaler_4 ADCSRA|=_BV(ADPS1)
#define ADCprescaler_8 ADCSRA=_BV(ADPS1) | _BV(ADPS0)
#define ADCprescaler_16 ADCSRA|=_BV(ADPS2)
#define ADCprescaler_32 ADCSRA=_BV(ADPS2) | _BV(ADPS0)
#define ADCprescaler_64 ADCSRA=_BV(ADPS2) | _BV(ADPS1)
#define ADCprescaler_128 ADCSRA=_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)
#define ADCchannel_1 //gewünschter Kannal z.B bei ATmega32 PINA0 - PINA7
#define ADCchannel_2 ADMUX|=_BV(MUX0) // bei nicht freilaufen muss ADCchannel_x vor
#define ADCchannel_3 ADMUX|=_BV(MUX1) // ADCstart kommen dann kann man mit getadc() der
#define ADCchannel_4 ADMUX= _BV(MUX1) | _BV(MUX0) // Adcwert des gewählten Kannals auslesen
#define ADCchannel_5 ADMUX|=_BV(MUX2)
#define ADCchannel_6 ADMUX= _BV(MUX2) | _BV(MUX0)
#define ADCchannel_7 ADMUX= _BV(MUX2) | _BV(MUX1)
#define ADCchannel_8 ADMUX= _BV(MUX2) | _BV(MUX1) | _BV(MUX0)
inline unsigned int getadc(void)
{
while (ADCSRA & _BV(ADSC)) {}
return ADC;
}
Hab jetzt in meiner kleinen Bibliothek den ADconverting Teil bisschen überarbeitet und einen Teil zur PWM Ausgabe mit Timer2(16Bit Timer) geschrieben. Ich habe das ganze jetzt in ein Rar Archiv gepackt und zwei Beispielprogramme hinzugefügt. Ach meine Bibliothek bezieht sich auf den ATmega32, um ihn für andere Atmels umzuschreiben muss man theoretisch aber höchsten ein paar Registernamen oder Bitname ändern.
Gruß Muraad
Hallo,
Ich bin gerade dabei einige Beispielprogramme fuer das RN-Control 1.4 zu schreiben. Leider bin ich auf dem Gebiet der AVR-programmierung noch ein blutiger Anfänger. Das Ziel meines ersten Demo programms ist es den durch das Tastenfeld generierte Analogwert mittels der vorhandenen Led's anzuzeigen. Leider funktioniert mein Programm nicht wie erwuenscht. Den einzigen unterschied den ich zu dem Vorherigen
Programm feststellen kann ist das ich DDRA nicht explizit auf 0 setze. Da ich das Board zum testen gerade nicht bei Hand habe wuerde mich interessieren ob das DDRA nicht sofort beim Reset des Mikrocontrollers auf 0 initialisert ist?
Bis denne.
(Sobald das Programm laeuft werde ich es hier posten.)
Ja, das Datenrichtungsregister DDRA ist nach Reset auf 0 (Eingang)!
Bei der Tastaturabfrage nicht vergessen den Pullup-Widerstand zu aktivieren!
Wäre fein wenn du Beispiel dann postest
Ist der Pullup widerstand nach einem Reset nicht automatisch eingeshaltet (PUD=FALSE im SFIOR nach einem Reset?)
Den Source Code werde ich dann hier posten, jedoch kann das einige
Tage dauern da ich keine Möglichkeit zur Zeit habe den Code zu testen.
Bis denne
Gottfreak
02.09.2004, 14:00
Ist der Pullup widerstand nach einem Reset nicht automatisch eingeshaltet (PUD=FALSE im SFIOR nach einem Reset?)
PUD ist FALSE. Das heisst aber nur, dass die Pullups an sind, wenn ausserdem das Port-Register des Eingangs 1 ist.
Wenn PUD TRUE ist, sind die Pullups ungeachtet der Werte des Ausgangsregisters immer ausgeschaltet.
Ich werde Versuchen das ganze noch mit einer Ausgabe auf die serielle Schnittstelle zu ergaenzen. Die Tasten abfrage funktioniert soweit schon, nachdem ich wie oben empfohlen den Pullup aktiviert habe und den Prescaler auf 128 gesetzt habe.
Hinweis: Ich hatte einige Schwierigkeiten mit der AD Wandlung da ich
dem Prescaler in erster Instanz keine Bedeutung fuer meine Aufgabenstellung zugeordnet habe und diesen auf default hab stehen lassen :(
Bis denne
Ja es hat etwas gedauert...
Ich hab ein kleines C Programm fuer das rn-control 1.4 geschrieben welches
2 Leds mit den Tastern T1 und T2 ein und ausschaltet. Desweiteren gebe ich den Wert des ADC Port 7 auf die serielle Schnittstelle aus.
In der naechsten Zeit will ich das Programm noch mit einer Funktion erweitern
wo eine zusätzliche LED blinkt, die über die Timer Funktion gesteuert wird.
Das Programm läuft bei mir mit den default Einstellungen des Boards, dem mega32 und 16Mhz.
Bis denne
Hi,
so schöne "Codeschnipsel" am besten zukünftig gleich hier im Download Bereich einsortieren. Man findet die dann später besser und kann dennoch in einem Thread darauf verweisen.
https://www.roboternetz.de/phpBB2/dload.php?action=category&cat_id=24
Einfach in der jeweiligen Unterkategorie oben Upload klicken. Nach kurzer Einsicht wird die einmal täglich freigegeben.
Gruß Frank
Hallo Kjion.
Ich will ja nicht unhöflich sein aber der 15. Januar ist schon was länger vorbei und dein Tutorial hab ich noch nicht gesehen. Da ich ein blutieger Anfänger bin währe sowas sicher sehr hilfreich für mich. Wenn du das Tutorial schon geschriebe hast ich es aber nicht gefunden habe oder es ein solches schon gibt und jemand weiß wo ich es finden kann währe ich dankbe wann du oder ihr es mir saben könntet.
MFG David
Gutes, umfangreiches avr-gcc tutorial gibts bei www.mikrocontroller.net . Werden eigentlich alle Themen angesprochen. Zusammen mit www.mc-project.de wird der Einstieg in avr-gcc ziemlich leicht (wenn man C kann). Auch noch ziemlich hilfreich ist das Buch von Roland Walter. Beschreibt zwar alles in Basic, aber ich habs als C programmierer trotzdem gut verstanden. Wird auch viel allgemeines über ATmega´s geschrieben.
Hoffe konnte dir helfen.
Gruß Muraad
Das mikrocontroller.net GCC- Tutorial ist veraltet, die anderen sind doch schon bekannt, siehe https://www.roboternetz.de/phpBB2/viewtopic.php?t=2158
Roland Walter´s Buch kann ich auch empfehlen
Ich hab das Beispielprogramm jetzt um eine "Timer" Funktion erweitere. Timer0 wird benutzt um die LED1 des RN-Controls 1.4 ein und auszuschalten.
https://www.roboternetz.de/phpBB2/dload.php?action=category&cat_id=31
In einem naechsten Schritt moechte ich mich um die Motor Ausgänge des RN-Controls kümmern. Die Idee ist es zwei der noch freien Taster des Boards zu benutzen um die Drehzahl (bzw Spannung) an den Ausgängen zu beeinflussen. Ein Taster zum erhoehen und einer zum verkleinern der Spannung. Dies koennte man dann auch über ein Multimeter überprüfen. Was haltet ihr von der Idee?
Bis denne
Kann ja nicht das Problem sein.
Wenn Timer1 per PWM die Motoren steuert, muss man dann lediglich auf einen Tastendruck hin OCR1A bzw. OCR1B inkrementieren bzw. dekrementieren.
Wenn du das in Zehnerschritten machst, brauchst du nicht mal ein Multimeter, da dann jeder Tasterdruck schon eine spürbare Drehzahländerung nach sich zieht.
Das stimmt. Aber denkst du auch, dass das Beispiel fuer einen Neueinsteiger sinnvoll und anschaulich fuer die PWM Funktion ist?
Da ich selber ebenso Neueinsteiger bin, koennte es ja sein dass es ein anschaulicheres Besipiel fuer die PWM gibt, welches ich nicht kenne.
Bis denne.
Kenne dein Vorkenntnisse ja nicht, aber im Prinzip ist es einfach.
Ne andere Möglichkeit wäre, per PWM eine LED zu dimmen.
Du müsstest nur mal anfangen mit programmieren ...
Ich denke ich kann behaupten dass ich 'C' kann, jedoch Erfahrungen in dem Gebiet der Mikrocontroller Programmierung in 'C' habe ich sehr wenig Erfahrungen.
Das Dimmen der LED finde ich auch ein anschauliches Besipiel.
Soblad ich Zeit finde werde ich das Beispielprogramm, um die PWM Funktion erweitern und uploaden.
Bis denne
Ich abe da mal eine Frage,
auf der Seite zu der es eien link weiter oben gibt (www.mikrocontroller.net) wird von einem AVR-GCC gesprochen den man sich auf dieser Seite Runterladen können soll (Die aktuellste Windows-Version von avr-gcc gibt es auf http://sourceforge.net/projects/winavr/.) zumindest steht es dort so. Aud dieser Seite kann man ich aber nur noch ein WINAVR runter laden. Meine Frage ist, ist WINAVR und AVR-GCC das Selbe oder bin ich einfach nur zu blöt um richtig ihnzuschauen und ich übersehe immer was ich suche nämlich AVR-GCC.
Vielen Dank vür die Antworten im vorraus.
MFG David
WinAVR ist ein Programmpacket speziell für Windows, das den AVR-GCC Compiler und ein paar andere nützliche Tools beinhaltet ( so dass man nicht alle Sachen einzeln runterladen und installieren muss, sozusagen ein "Rundum Sorglos Packet" für Windows ;-).
MfG Kjion
avr-gcc ist Bestandteil des WinAVR Packages. Als Editor dient das ebenfalls im Package enthaltene Programmers Notepad.
Ja des ist das gleiche. Ist nur die Windows Version, und da ist glaub ich gleich der Programmers Notepad Editor dabei. gcc ist eigentlich der Linux C Compiler.
Gruß Muraad
@Muraad
Ich glaube eher, der Compiler ist einfach nur Freeware/Open-Source. Je nach Anpassung kannst du damit Code für jedes beliebige System kompilieren.
Ich steig da aufs verrecken nicht durch!!!
So ich habe jetzt ein Testboart. Habe auf einer Lochpaltiene meine 8 Dioden in reie mit 8 1K wiederständen geschaltet noch einen Schalter drauf gemacht und das ganze mit meinem Testboart verbunden.
So weit so gut. Ich hab ein Toturial mir durchgelesen und bin jetzt an der Stelle an der ich mit diesem Aufbau mein erste Programm auf meinem at90s2313 lauf lassen soll. In diesem Toturial ist auch das programm beschrieben und wie es aufgebaut ist nur nicht wie ich es in den chip rein kriege noch wo und wie ich es schreibe. Diese Tturial bezieht sich auf Win-Gcc.
Ich habe mir, wie oben schon erwänt, WinAVR runtergeladen. Habe auch alles schön instaliert. Ich kann auch das Programmer Norpad 2 öffnen nur dann weis ich nicht mehr weiter. Auch mit ein bichen rumprobieren bin ich nicht weiter gekommen.
Meine Fragen sind nun:
1. Wo muss ich mein Programm schreiben? (Es ist ja ein C Programm. Brauche ich also C?)
2. Was muss ich machen wenn ich ein Programm geschreiben habe? (Mit einem andeten Programm "übersetzen")
3. Muss ich dem Notepad oder welches programm auch immer meinen chip beschreibt noch beibringen welcher chip es ist und wenn wo?
4. Wo und/oder wie Solte ich es Speichren? (oder ist es egal in welchem Ordner ich es gespeichte habe haubtsache ich find es wieder)
Wenn mir noch Fragen ein fallen die ich jetzt vergessen habe kommen sie noch nach.
Ansonsten schon mal vielen Dank an alle die mir Helfen.
MFg David
www.mc-project.de unter Grundlagen dürfte deine Fragen weitgehend beantworten.
Gruß Muraad
Ok ich weis zwar dass das hier nicht rei gehört ich weis aber auch nicht wo ich es sonst posten solte.
Also kann mir jemand sagen wie ich den Controller bei PonyProg eingestellt?
http://www.mikrocontroller.net/wiki/Pony-Prog_Tutorial
Gruß Muraad
Damit komm ich nicht weiter aber trotsdem danke.
Vielleicht hilft dir unser Artikel. Da ist Pony auch ganz gut beschrieben:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=849
Hab ich schon durchgelesen. Dabei habe ich an dieser Stelle ein kleien Probelm.
.....
Als nächstes wird das verwendete Interface eingestellt: Dazu wird im Menü "Setup" die Option "Hardware-Setup" aufgerufen. Alternativ kann man auch auf dieses Symbol klicken.
.....
Woher weis ich was für ein Interface ich benutze muss ich habe mein Boart nämlich im Interner gekauft.
Du musst doch wissen ob du dein Board mit einem seriellen Kabel (com Port) oder an den parallel-Port (Druckerport) anschließt. Bei parallel den Punkt auf Parallel und dann Avr ISP I/O auswählen, bei seriell den Punkt auf Serial und SI Prog API auswählen. Aber eigentlich wird doch alles genau beschrieben???
Gruß Muraad
Ich hab beide Anschlüsse an mienenm Boart COM und LTP / ISP-Programmer.
Sind doch beide oder? Wie gesabt ich habe mir ein Boart selber gebaut was nicht geklapt hat und dann hab ich mir das im Internet gekauft in der Hoffnung das es funktionieren würde.
Name des Boards? Homepage? Ist es vielleicht des STK 500?
Gruß Muraad
Gottfreak
06.10.2004, 05:21
Ich hab beide Anschlüsse an mienenm Boart COM und LTP / ISP-Programmer.
Dann musst du dir eben einen davon aussuchen(wenn dein Board beides kann).
Heir sind zwei Bilder von meinem Boart http://www.cer-online.de/bilder/IMG_0862a.jpg http://www.cer-online.de/bilder/IMG_0858a.jpg
David
Hab vergessen mich einzuloggen
David
Machs einfach wie Gottfreak gemeint hat und such dir einen aus, oder je nach dem was du halt für ein Kabel parat hast.
Gruß Muraad
Hab ich ja aber ich bekomme immer einen Fehler namlich (falsches oder fehlerhaftes divice (-24))
Hier is tnoch mein schaltplan wens hilft.
https://www.roboternetz.de/phpBB2/download.php?id=1180
Das Problem hab ich mit dem RN-Control und PonyProg auch seit anfang an, obwohl ich sicher etliche male alles neu/richtig eingestellt hab. Nimmt zum Programmieren Bascom. Die Programme kannst du ja mit C und WinAVR schreiben und übersetzten. Nur auf den Microkontroller laden kannst du es dann mit Bascom. Damit hatte ich noch nie Probleme.
Gruß Muraad
Danke muraad für den Tipp ich habe aber noch ein paar Fragen zu Bascom die hier aber nicht wirklich reigehörne und haber deswegen ein neues Thema aufgemacht nämlich Bacom Grundeinstellungen unter Basic-Programmierung mit Bascom
David
ja ich denke mal im Bascom Unterforum wird dir sicher geholfen.
das hat man aber man hat mir auch geraten winavr zu benutzen was mich wieder hier hin bringen würden. Na ja ich versuch das jetzt erst mal mit bascom und dann schauen wir mal weiter.
MFG David
Kleine Anmerkung, das AVR-GCC-Tutorial wurde in den letzten Wochen stark überarbeitet und ist auf jeden Fall einen Besuch wert:
http://www.mikrocontroller.net/wiki/AVR-GCC-Tutorial
Und da das Ganze ein Wiki ist darf sich gerne jeder beteiligen der etwas sinnvolles beizutragen hat.
Gruß
Andreas
Zur Abfrage analoger Ports kann ich folgenden Code beisteuern
void AD_Init(void)
{
outb(BV(ADEN) | BV(ADSC) | BV(ADPS1) | BV(ADPS2), ADCSR);
while (inp(ADCSR) & BV(ADSC));
}
unsigned int ADReadPort(unsigned char port)
{
outp(port, ADMUX);
outp(inp(ADCSR) | BV(ADSC), ADCSR);
while (inp(ADCSR) & BV(ADSC));
return (__inw(ADCL));
}
if you guys write your stuff in english, more people can read it, try it, it's also good for your english ;)
Dino Dieter
19.11.2004, 23:57
Hallo
Hier mal ein einfaches Testprogamm, für as RN Controll Board.
Per Timer0 wird ca alle 1 ms ein INT erzeugt und darin eine Variable
hoch gezählt. Nach einer Sekunde, wird ein Text ausgegeben und eine
LED blinkt.
Vielleicht hilft es ja dem ein oder anderen beim Einstieg.
MFG
Dieter
uC = Mega 32
Takt = 7,37 28 MHz
plusminus
16.07.2006, 23:51
http://www.alekto-programming.com/modules.php?name=Content&pa=list_pages_categories&cid=2
* Step 1: Die Vorraussetzungen
* Step 2: Das erste Programm
* Step 3: Die Inputs
* Step 4: Schon den Durchblick?
* Step 5: Die Lösung zu Step 4
* Step 6: EIN/AUS-Schalter mit Taster
* Step 7: Mini-Tonleiter :)
* Step 8: Der Prim-Blinker :-)
* Step 9: Der ADC (Analog-Dgital-Wandler) (Eingang)
* Step 10: Die Register des ADC
* Step 11: Anwendung des ADC: Die Dreh-Ampel
plusminus
19.03.2007, 19:59
Hm, der Thread wird ja sogar gelesen ;)
Gibt übrigens schon seit sehr geraumer Zeit 2 Steps mehr...
* Step 12: Pseudo-Analoger-Ausgang: PWM
* Step 13: Anwendung von PWM (zus. mit ADC): Dimmer
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.