Hallo!
Ich habe mir zum Einstieg in die Mikreocontrollerwelt einen AVR
Butterfly gekauft. Ich weiss wie man den mit UART Programmiert, habe
schon mit Terminlaprogrammen die Verbindung getestet, und auch schon
fertige Programme geflasht. Hat alles wunderbar geklappt, worueber ich
sehr froh bin.
Nun kommt allerdings die zweite grosse Huerde: Ich will ein kleines
C-Programm schreiben, welches einen Portpin auf 1 setzt, damit ich z.B
eine Led anseuern kann. Ich habe schon einige Stunden im Internet
gesucht, aber nirgends ein eindeutig fuer den Butterfly ausgeschriebenes
C-Programm gefunden, welches einen Portpin ansteuert.
Koennte jemand von euch mir vielleicht einen Vorschlag schicken, den ich
nur noch mit AVR Studio in eine .hex- Datei compilieren muss, und dann
flashen kann. Ich habe zwar einige Programmbeispiele fuer andere
Controller gefunden, habe dann versucht diese ein wenig umzuwandeln und
auf den Controller zu flashen, hat allerdings noch nie geklappt :-(.
Vielen Dank schon einmal im Voraus,
Steffen
Tja, das ist der Moment, wo das Lernen beginnt. Dieses "kannste mir mal
ein Programm machen?"-Rumgebettel ist doch scheiße. Warum kauft du dir
so ein Einsteigersystem um dann nicht selbst zu lernen?
- Beispiel (Schaltplan und Programm) für einen AVR LED-Blinker im Netz
suchen. Für welchen AVR ist erstmal ziemlich egal.
- Beispielprogramm so lange lesen bis man es verstanden hat.
- Beispielschaltplan so lange lesen bis man ihn verstanden hat.
- Datenblatt für genau den AVR der auf Butterfly sitzt besorgen.
- Datenblatt so lange lesen, bis man eine Vorstellung davon hat, wie man
das Blinker-Programm für den Butterfly-AVR umschreiben kann.
- Schaltplan des Butterfly besorgen.
- Butterfly-Schaltplan so lange studieren, biss man ein Vorstellung
davon hat, wie man den Schaltplan des LED-Blinkers für den Buterfly
anpassen kann.
- Schaltung aufbauen
- Software schreiben
- Software laden
- Fehler suchen
Wer reden hier übrigens von durchaus mehreren Wochen Arbeit, wenn man
ganz von Vorne anfangen muss. Wer das nicht will: Anderes Hobby suchen.
Steffen Oesterwind wrote:
> Nun kommt allerdings die zweite grosse Huerde: Ich will ein kleines> C-Programm schreiben, welches einen Portpin auf 1 setzt, damit ich z.B> eine Led anseuern kann. Ich habe schon einige Stunden im Internet> gesucht, aber nirgends ein eindeutig fuer den Butterfly ausgeschriebenes> C-Programm gefunden, welches einen Portpin ansteuert.
Wie Hannes schon geschrieben hat:
Da musst du selber durch.
Aber ein paar Hinweise und Tips
Zuallererst musst du rausfinden, wo deine LED angeschlossen ist.
Das geht am einfachsten mit dem Schaltplan. Du hast doch eine
Schaltplan?
Also im Schaltplan suchst du dir erst mal die LED.
Rund um die LED wird noch etwas Aussenbeschaltung sein (Widerstände,
ev. ein Transistor, ich kenne die Schaltung nicht). Das ignorierst
du erst mal. Wichtig ist: von dieser LED geht eine Leitung zum
Prozessor (mglw. über ein paar zusätzliche Bauteile, wie Widerstände,
Transistoren). Wichtig ist: An welchem Prozessorpin kommt diese
Leitung an? Das ist für dich die wichtige Information.
Neben dem Prozessorpin steht im Schaltplan eine Bezeichnung.
In dieser Bezeichnung steht zb PB4 oder PA3 oder PD7
Da mag in Klammern noch etwas dabeistehen, wie zb (ADC0) oder
(MOSI) oder dergleichen aber das interessiert im Moment nicht.
Wichtig ist nur dieses 3 Buchstaben Kürzel. Mal angenommen
da steht PD3
P steht für Port
D steht für den Port D
3 ist die Pinnummer innerhalb des Port D
Jetzt weist du also, dass die Led am Port D am Pin 3 angeschlossen
ist. Also musst du diesen Port-Pin auf 1 oder 0 schalten, damit
die LED leuchtet. Ob 0 oder 1 findest du am schnellsten
raus, indem du es einfach ausprobierst.
Damit man den Port-Pin beeinflussen kann, muss er auf Ausgang
geschaltet sein. Dazu brauchst du das, zum jeweiligen Port
gehörende Datenrichtungsregister. Eine 1 an der Bitposition 3
(weil es ja PD3 war) schaltet den Pin 3 auf Ausgang (Du setzt hier
natürlich deine richtigen Zahlen ein).
Tja. Und dann brauchst du den Pin nur nich auf 0 oder 1 setzen.
In einer der beiden Stellungen sollte die LED leuchten
1
#include<avr/io.h> // das wird immer eingebunden
2
3
intmain()// die Programmausführung beginnt
4
{// immer bei der Funktion main()
5
6
DDRD=(1<<PD3);// Im Datenrichtungsregister für den
7
// Port D (daher DDR D) das Bit für
8
// den Pin 3 auf 1 setzen
9
10
PORTD=(1<<PD3);// Pin 3 am Port D auf 1 setzen
11
12
// PORTD = ~( 1 << PD3 ); // alternativ den Pin 3 auf 0 setzen
Hallo!
Vielen Dank erstmal fuer die schnellen Antworten!!!!
Auf dem Butterfly- Board ist standartmaessig keine LED eingebaut, und
ich muss die an irgendeinen Port anschliessen. Da der Butterfly ja 3.3
Volt Ausgangsspannung hat, benoetige ich ja keinen Vorwiderstand.....
Kann ich das von Karl Heinz geschriebene Programm einfach so compilieren
mit AVR Studio, und dann bekomm ich meine .hex Datei????
Ich hab des naemlich schonmal versucht, aber dann kam da immer ne .c
Datei raus, und die kann ich ja nicht auf den Controller flashen....
Vielen Dank fuer eure Hilfe,
Steffen
Steffen Oesterwind wrote:
> Hallo!> Vielen Dank erstmal fuer die schnellen Antworten!!!!> Auf dem Butterfly- Board ist standartmaessig keine LED eingebaut, und> ich muss die an irgendeinen Port anschliessen.
Na, dann such dir einen aus.
Am besten einen Pin an einem Port an dem sonst noch nichts hängt.
> Da der Butterfly ja 3.3> Volt Ausgangsspannung hat, benoetige ich ja keinen Vorwiderstand.....
Sagt wer?
Natürlich solltest du auch dann einen Vorwiderstand einbauen.
http://www.mikrocontroller.net/articles/LED> Kann ich das von Karl Heinz geschriebene Programm einfach so compilieren> mit AVR Studio, und dann bekomm ich meine .hex Datei????
Ganz genau
> Ich hab des naemlich schonmal versucht, aber dann kam da immer ne .c> Datei raus,
mit Sicherheit nicht.
Die *.c ist die Eingangtsdatei. Die enthält das C Programm.
Der Compiler compiliert das dann, das Zwischenergebnis wird
gelinkt und am Ende entsteht das HEX File (wenn es keinen
Fehler gab).
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Hallo,
danke fuer die Links, da hab ich jetzt was zu lesen :-).
Am Butterfly gibts leider, soweit ich weiss, keinen einzigen unbelegten
Pin, deshalb werd ich halt irgendeinen belegten verwenden muessen, und
dann faellt halt die Funktion von dem Teil, des da dran haengt aus......
Ich hab irgendwo mal gelesen, dass man die USI Pins irgendwie verwenden
kann, und die JTAG Pins auch, aber da muss man die JTAG- Funktion
irgenwie disablen, und des weiss ich nicht, wie des geht.
Welche Pins wuerdet ihr verwenden????
Vielen Dank, fuer die schnellen Rueckmeldungen,
Steffen
Steffen Oesterwind wrote:
> Am Butterfly gibts leider, soweit ich weiss, keinen einzigen unbelegten> Pin,
Auf dem 'Schaltplan', den ich auf die Schnelle gefunden habe
http://www.atmel.com/dyn/resources/prod_documents/doc4249.pdf
ist der komplette Port D unbelegt. Am Port B dürften auch noch
etliche Pins frei sein.
Karl heinz Buchegger wrote:
> Auf dem 'Schaltplan', den ich auf die Schnelle gefunden habe>> http://www.atmel.com/dyn/resources/prod_documents/doc4249.pdf>> ist der komplette Port D unbelegt. Am Port B dürften auch noch> etliche Pins frei sein.
Hallo, leider stimmt das nicht ganz, Port D ist komplett für das Display
belegt, da würd ich keine LED dran machen.
Nimm am besten die Pins von der USI Schnittstelle oder von JTAG, den man
zuerst per Software deaktivieren sollte.
Gruß Sebastian
Hallo,
OK, wie muss ich denn die JTAG- Schnittstelle genau per Software
deaktivieren? Koenntet ihr mir vielleicht die genauen Programmzeilen
schreiben, die ich dann nur noch in das Programm einfuegen muss? Das
waere sehr nett!!!
Wie spricht man denn die USI oder JTAG- Schnittstelle an?
Bei einem Port sagt man dann halt z.B PORTD1 oder sowas, aber wie macht
man das bei USI und JTAG?
Vielen Dank schon einmal im Voraus!!!
Gruesse, Steffen
PS: Das ist ja echt klasse, wie schnell einem Anfaenger hier im Forum
geholfen wird!!!!!
Steffen Oesterwind wrote:
> Hallo,> OK, wie muss ich denn die JTAG- Schnittstelle genau per Software> deaktivieren?
Es gibt da 2 Möglichkeiten.
Entweder das JTAG per Fuse abstellen. Das wäre für mich die
grundsätzlich bessere Lösung (wenn du JTAG sowieso nicht
brauchst). Allerdings muss man dazu an die Fuse-Bits ran und
da hängt es von deinem Brennprogramm ab, wie man das dort
macht.
Die andere Variante ist zb hier beschrieben
http://www.siwawi.arubi.uni-kl.de/avr_projects/BF_JTAG_disable.html> Wie spricht man denn die USI oder JTAG- Schnittstelle an?> Bei einem Port sagt man dann halt z.B PORTD1 oder sowas, aber wie macht> man das bei USI und JTAG?
Du benutzt den Port Pin dann wie jeden anderen auch.
Alle Port Pins werden über diese Syntax angesprochen.
Nur manche Port Pins haben auch noch eine 2-te Bedeutung, wenn
die entsprechende Funktionalität eingeschaltet wird.
Ist die Funktionalität nicht eingeschaltet, ist das ein
stinknormaler Port Pin und wird auch so angesprochen.
>Wie spricht man denn die USI oder JTAG- Schnittstelle an?>Bei einem Port sagt man dann halt z.B PORTD1 oder sowas, aber wie macht>man das bei USI und JTAG?
Nein, Du hast mich falsch verstanden...
Du sollst die Pins verwenden, die am Butterfly als USI bzw. JTAG
ausgeführt worden sind, nicht die Schnittstelle als solche.
>OK, wie muss ich denn die JTAG- Schnittstelle genau per Software>deaktivieren?
Das steht im Dattenblatt zu Mega169
>Koenntet ihr mir vielleicht die genauen Programmzeilen>schreiben, die ich dann nur noch in das Programm einfuegen muss? Das>waere sehr nett!!!
Sicher wäre das nett, Du möchtest aber was lernen, oder ?
Besorg Dir die Beschreibung von Butterfly, Dattenblatt von M169 und
versuch mal was selber auf die Beine zu stellen, wenn es nicht klappt
kannst Du gerne nochmal nachfragen...
Gruß Sebastian
P.S. und lass bloß die Finger von Fusebits, wenn Du Dich da aussperst
kannst Du den Butterfly als Anfänger in den Müll werfen...
Deswegen JTAG per Software ausschalten und nicht per Fuse
(Sorry Karl Heiz)
Hallo,
Vielen Dank fuer die schnellen antworten!!!
Ich habe mich falsch ausgedrueckt, dass stimmt, ich meinte nicht die
Schnittstelle als solche sondern halt die Pins, die die Schnittstelle
bilden.
Ich habe jetzt ein bisschen auf der Seite, die Karl Heinz oben
geschrieben hat ein wenig umgesehen, und habe dann das Programm, das
Karl Heinz oben geschrieben hat abgeaendert:
------------------------------------------------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>
int main()
{
void disable_JTAG(void)
{
unsigned char sreg;
sreg = SREG;
cli();
MCUCR |= ( 1 <<JTD );
MCUCR |= ( 1 <<JTD );
SREG = sreg;
}
DDRD = ( 1 << PF4 );
PORTF = ( 1 << PF4 );
while( 1 )
;
}
------------------------------------------------------------------------
--
Ist das so jetzt korrekt???
Laut Datenblatt bilden die Pins F4,F5,F6,F7 das Jtag Interface.
Dieses hab ich durch den Befehl mit dem MCUCR Register deaktiviert, und
verwende es dann fuer die Funktion ein/aus.
Ich hoffe es passt so.
Gruesse, Steffen
Steffen Oesterwind wrote:
> Ist das so jetzt korrekt???
Dein gcc wird das akzeptieren. Aber nur deswegen, weil er
eine Erweiterung eingebaut hat, die das akzeptiert.
Funcktionen können in Standard-C nicht ineinander
geschachtelt definiert werden.
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
4
voiddisable_JTAG(void)
5
{
6
unsignedcharsreg;
7
8
sreg=SREG;
9
cli();
10
MCUCR|=(1<<JTD);
11
MCUCR|=(1<<JTD);
12
SREG=sreg;
13
}
14
15
intmain()
16
{
17
disable_JTAG();
18
19
DDRD=(1<<PF4);
20
21
PORTF=(1<<PF4);
22
23
while(1)
24
;
25
}
> Laut Datenblatt bilden die Pins F4,F5,F6,F7 das Jtag Interface.> Dieses hab ich durch den Befehl mit dem MCUCR Register deaktiviert, und> verwende es dann fuer die Funktion ein/aus.
Müsste so gehen.
Allerdings werden LED normalerweise so angeschlossen, dass man
eine 0 ausgeben muss, damit die LED brennt.
Klemm mal an PF4, PF5, PF6 und PF7 4 LEDs an.
Und zwar so (am beispiel PF4)
+-------+
PF4 o----| 100 |--------------+
+-------+ |
|
-----
\ /
\/
-----
|
|
--+-- GND
(Wenn die LED dann zu schwach brennt, kannst du den Widerstand mal
auf die Hälfte verringern)
Das Programm welches die LED dann zum Leuchten bringt
schaut so aus:
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
4
voiddisable_JTAG(void)
5
{
6
unsignedcharsreg;
7
8
sreg=SREG;
9
cli();
10
MCUCR|=(1<<JTD);
11
MCUCR|=(1<<JTD);
12
SREG=sreg;
13
}
14
15
intmain()
16
{
17
disable_JTAG();
18
19
DDRD=(1<<PF4);
20
21
PORTF=0b00000000;
22
23
while(1)
24
;
25
}
Du kannst dann auch mal mit der Portzuweisung spielen
PORTF = 0b01010000;
dann sollen nur mehr 2 LED brennen (die an deren Position eine
0 steht.)
+---------- PF7
|+--------- PF6
||+-------- PF5
|||+------- PF4
||||+------ PF3
|||||+----- PF2
||||||+---- PF1
|||||||+--- PF0
||||||||
PORTF = 0b01010000;
Hallo!
Ich hab alles verstanden, bis auf das mit dem Spielen an der
Portzuweisung.
Warum sollen 2 LEDs leuchten, wenn da anstatt PORTF = 0b00000000; ,
PORTF = 0b01010000; steht?
Beim 2. stehen noch zwei 1-en drin, das sehe ich, aber woher weiss man
was genau diese zwei 1-en machen?
Hat das was mit dem binaerem Zahlensystem zu tun?
Gruesse, Steffen
PS: Vielen Dank fuer die schnellen Antworten, ich war schon ganz
verzweifelt, weil ich ewig lang probiert habe, und sich nichts ruehrte
:-(.
OH, sorry, Ich hab den letzten Teil von Karl Heinz Beitrag nicht
gesehen.
Da stehts ja, warum die bestimmten LEDs an und aus gehen.
Tschuldigung, es ist schon spaet, und ich werd langsam muede...........
Gruesse, Steffen
Hallo!
So, jetzt hab ich ausgeschlafen, und bin wieder fit :-). Nun wuerde ich
noch gerne eine Funktion einbauen, dass die LEDs nur dann angehen, wenn
ein Port per Taster auf 0 gelegt wird. Ich habe das oben genannte
Programm dann so gut, wie ich es konnte, umgeschrieben:
------------------------------------------------------------------------
----
#include <avr/io.h>
#include <avr/interrupt.h>
void disable_JTAG(void)
{
unsigned char sreg;
sreg = SREG;
cli();
MCUCR |= ( 1 <<JTD );
MCUCR |= ( 1 <<JTD );
SREG = sreg;
}
int main()
{
disable_JTAG();
DDRF = ( 1 << PF4 ); Hier muss irgendwo noch der Eingang
konfiguriert werden
IF PINF = 0b00010000
THEN PORTF = 0b00000000;
ELSE PORTF = 0b11110000;
while( 1 )
;
}
------------------------------------------------------------------------
-
Ich habe das ganze jetzt mal so gemacht, wie ich es mir in etwa
vorstelle. Ich weiss nicht, wie man den Eingang konfiguriert, aber das
koennt ihr ja vielleicht noch verbessern. Wenn sonst noch etwas falsch
ist, koenntet ihr das vielleicht verbessern?
Vielen Dank schon einmal im Voraus,
Steffen
Hallo,
Naja, das sieht schonmal aus wie eine Mischung aus C und Basic...
Aber eine ander Frage, warum nutzt Du nicht den eingebauten Joystick ?
Enter liegt z.B. an PB4 und schaltet beim Druck gegen GND.
dann könnte das Programm so aussehen:
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
4
voiddisable_JTAG(void)
5
{
6
unsignedcharsreg;
7
8
sreg=SREG;
9
cli();
10
MCUCR|=(1<<JTD);
11
MCUCR|=(1<<JTD);
12
SREG=sreg;
13
}
14
15
intmain()
16
{
17
disable_JTAG();
18
19
DDRF=(1<<PF4);
20
PORTB=(1<<PB4);//Pullup einschalten
21
while(1){
22
if(!(PINB&(1<<PB4))){
23
PORTF&=~(1<<PF4);
24
}else{
25
PORTF|=(1<<PF4);
26
}
27
}
28
return0;
29
}
Achso, jeder Pin der im DDR* nicht als Ausgang konfiguriert wurde,
bleibt halt Eingang.
Gruß Sebastian
P.S. Hast Du Deine LED schon angeschlossen ?
> IF PINF = 0b00010000> THEN PORTF = 0b00000000;> ELSE PORTF = 0b11110000;
Morgen tust du dir selbst einen Gefallen und gehst in die
nächste Buchhandlung. Dort stürmst du die EDV Regale und
kaufst dir erst mal etwas Grundlagenliteratur zum Thema
'Programmierung in C'.
Immer wieder empfehlenswert ist der sog. K&R, der Kernighan - Ritchie.
Ist sowas wie die Bibel der C-Programmierer.
http://www.mikrocontroller.net/articles/Buchtipps#C-Programmierung
So hat das im Moment keinen wirklichen Sinn.
Ich würde dir auch empfehlen, deine ersten Schritte in der
C-Programmierung auf einem PC zu gehen. Die Möglichkeiten
zur Ein/Ausgabe, sowie zum Debuggen eines Programms sind dort
nunmal um ein Vielfaches besser als auf einem AVR mit seinen
begrenzten Resourcen.
Hallo!
Vielen Dank fuer die schnelle Rueckmeldung!!!
Ich kann natuerlich auch den Joystick verwenden, hab ich gar nicht
drangedacht. Klasse Idee!
Ich konnte leider die LED noch nicht anschliessend, da ich im Moment
nicht zu Hause bin, und somit das Butterfly nicht hab :-(.
Hast du das Programm schon ausprobiert, weil manche Sachen da blau und
gruen sind. Das sieht aus, als ob es in AVR Studio geschrieben wurde.
Mie ist gerade noch etwas eingefallen, und zwar moechte ich nach dem
Tastendruck vier LEDs nacheinander angehenlassen. Allerdings soll immer
nur dann die naechste angehen, wenn die vorhergende wieder aus ist. Hier
hab ich allerdings keine, auch nur ansatzweise Ahnung, wie ich das
realisieren soll, da ich im main- Teil den If/Else- Befehl nicht versteh
:-(.
Koenntet ihr die Programmaenderung vielleicht noch posten???
Das waere sehr nett!!!!
Gruesse, Steffen
Hallo!
Entschuldigung, aber ich war gerade am schreiben von meinem Beitrag und
habe dann den von Karl Heinz nicht gelesen, bevor ich meinen gepostet
hab.....
Ich werde mich demnaechst mal nach dem Buch umschauen. Ich habe schon,
wie Sebastian bereits festgestellt hat, begrenzte Erfahrungen mit Basic.
Wenn ihr noch Zeit und Lust habt koenntet ihr ja noch die kleine
Programmaenderung posten, wenn nicht ist auch nicht tragisch.
Vielen Dank, Steffen
>Hast du das Programm schon ausprobiert, weil manche Sachen da blau und>gruen sind. Das sieht aus, als ob es in AVR Studio geschrieben wurde.Kratz
Nee, ausprobiert habe ich das nicht, und es wurde nicht in AVR Studio
geschrieben, sondern in mikrocontroller.net "on the Fly" und Blau und
Grün liegt vielleicht an der Syntaxhighlighting ?
>Mie ist gerade noch etwas eingefallen, und zwar moechte ich nach dem>Tastendruck vier LEDs nacheinander angehenlassen. Allerdings soll immer>nur dann die naechste angehen, wenn die vorhergende wieder aus ist. Hier>hab ich allerdings keine, auch nur ansatzweise Ahnung, wie ich das>realisieren soll, da ich im main- Teil den If/Else- Befehl nicht versteh>:-(.
Ja, machen kann man viel, aber bedenke, Rom haben die auch nicht von
Heute auf Morgen gebaut...
Versuche erstmal zu verstehen, was in der if/else Abfrage abgeht, folge
dem Rat vom Karl Heiz und dann sehen wir weiter ;-)
Zum Buch, ja K&R ist Klasse,
Für absolute Anfänger empfehle ich eher
"Helmut Erlenkötter; C Programmieren von Anfang an."
das ist wirklich sehr leicht geschrieben und ist auch viel billiger...
Gruß Sebastian
Hallo!
Vielen Dank fuer den Tip mit dem Buch, ist bestellt......
Soll ich dann diesen Thread jetzt ruhen lassen, und wieder was
reinschreiben, wenn ich das Buch mal gelesen hab, oder soll ich dann nen
neuen aufmachen?
Vielen Dank auch an alle, die mir die Programme gepostet haben, und mir
geholfen haben. Ich bin jetzt schon einiges weiter gekommen!!!
Gruesse,
Steffen
Hallo,
mir steht gerade einer aufm Schlauch.....;-)
Und zwar hab ich folgendes Problem: Ich hab mein C Programm für einen
ATtiny12 geschrieben, und will das jetzt mit AVR Studio in eine .hex-
Datei umwandeln.
Welche Schritte muss ich machen (welche Befehle eingeben, welche Buttons
drücken, usw......) ?????
Das C Programmieren von Anfang an- Buch hab ich inzwischen durch, ist
echt klasse!!!
Gruß, Steffen
Hallo,
kennt keiner irgendein Tutorial, zum Erlernen wie man AVR Studio 4
benutzt.
Ich habe schon die Anleitungen auf der ATMEL- Seite durchgelesen, bin
aber nicht weitergekommen.
Ich benötige nur die notwendigen Schritte vom Programmtext zur .hex-
Datei.
Vielen Dank schon einmal im Voraus.
Grüße, Steffen